LP lock · launcher.unlockTime()
Reading…
unlockTime() = launch + 365 days, can only be pushed laterreadingephemeral · EPH launch
Every claim on this page points to a contract, a transaction or a commit. Live values are read in your browser from a public Ethereum node, so none of it rests on our word.
Contracts
Source verified on Etherscan, Sourcify and Blockscout, so you can read the code where it runs.
Holds the whole supply until launch, opens the one official pool and keeps its liquidity locked (unlockTime()).
Fixed supply of 1,000,000,000, minted once to the launcher. No owner, no mint, no blacklist. Nothing moves before launch.
The Core Contributors stream and the Ecosystem Growth Reserve. Reserve grants are revocable; the contributors stream is not.
Uniswap v4 hook of the official pool. Applies the fee schedule and books what the treasury and team are owed.
Creates all four. The deploy is inert: trading stays closed until the launch transaction.
Receives the treasury share of the hook fees, as set in the contracts.
The team wallet as set in the contracts. It receives the team share of the hook fees.
Sirius's personal wallet. Every buy and sell is public, on purpose.
Sends research notes on Blockscan Chat. It never asks you to sign, connect or send anything.
Until then, the same contracts are live on mainnet as the 8 Oct canary rehearsal below. Any other address claiming to be EPH before the deploy on Sun 11 Oct is not ours.
Live reads
Plain eth_call from your browser to a public node. No wallet, no API key, nothing to sign.
LP lock · launcher.unlockTime()
Reading…
unlockTime() = launch + 365 days, can only be pushed laterreadingTrading
Reading…
Opens once, inside the launch transaction. Before that only the launcher can move EPH.
token.tradingOpen()readingOwner
Reading…
There is no owner. The function exists so scanners that look for one get 0x0.
token.owner()readingTotal supply
Reading…
Minted once in the constructor. There is no mint function.
token.totalSupply()readingHeld by the launcher
Reading…
100% until launch. After launch the liquidity sits in the Uniswap v4 pool and the Ecosystem Growth and Core Contributors shares in vesting.
token.balanceOf(launcher)readingSwap fee right now
Reading…
Same for buys and sells, taken in ETH by the hook. Schedule in Rules below.
hook.feeBps(any)readingFees owed, not yet paid out
Reading…
Booked by the hook. Anyone can call distribute() to pay them out.
hook.treasuryOwed() · teamOwed()readingEcosystem Growth Reserve
Reading…
Set at launch from the 25% Ecosystem Growth share. Partner grants are streamed from it and stay revocable.
vesting.kolReserve()readingVesting streams
Reading…
The Core Contributors stream is created at launch; every partner grant adds one.
vesting.streamCount()readingOfficial pool
Reading…
The only pool with this hook. Fees and the LP lock apply here; any other EPH pool is not ours.
hook.poolId()readingWiring
Reading…
The launcher names the token, hook and vesting it was deployed with. They must be the addresses above.
launcher.token() · hook() · vesting()readingEach read is one eth_call. The data field is the function selector: the first 4 bytes of keccak256 of the signature, for example 0x251c1aa3 = unlockTime(). With Foundry's cast, against any node you trust:
Or with curl only:
Use your own node on this page: add ?rpc=https://your-node to the address.
Rules that cannot change
No owner, proxy or setter can change these after deploy. The treasury role can only extend the lock, add ETH-only liquidity to the official pool (locked under the same unlock), grant and revoke partner streams, hand its role on, and withdraw the LP after the unlock. Each line names the constant or check in the verified source.
Supply
1,000,000,000
EPH, minted once to the launcher in the constructor. No mint function exists.
LaunchConfig.TOTAL_SUPPLY = 1_000_000_000 ether
Split at launch
LP_BPS 7_000 · KOL_BPS 2_500 · TEAM_BPS 500 · the constructor reverts unless they add up to 100%
Fee schedule · buys and sells
FEE_1 to FEE_6, FEE_FOREVER, TREASURY_ONLY_WINDOW
The same for buys and sells: it steps down during the first hour after launch, then stays fixed forever. Each step is a constant in the verified source, and nobody can change it after deploy. The fee numbers are shared with Early Access members before launch.
The pool's own LP fee is 0; the hook takes the fee in ETH.
The launch sets unlockTime to launch + 365 days. extendLock can only push it later, and withdrawing before it reverts.
LP_LOCK_DURATION = 365 days · LockCanOnlyGrow · StillLockedThe token has no owner and no admin functions. owner() returns 0x0. No proxy, so the code cannot be swapped.
EphemeralToken: owner() pure returns address(0)Before trading opens only the launcher can move EPH, so nobody can trade it anywhere. Trading opens once, inside the launch transaction.
TradingNotOpen · openTrading() once, launcher onlyPartner grants come from the 25% reserve as vesting streams. The treasury can revoke one at any time: what has vested stays with the partner, the rest returns to the reserve. Reserve not granted within 30 days vests to the treasury over 30 days.
revoke(id) · KOL_GRANT_WINDOW = 30 days · sweepReserve()One stream, not revocable, created in the launch transaction: 24 equal daily parts, the first 7 days after launch, all of it claimable at day 30. Nobody can move it or speed it up.
TEAM_START_DELAY = 7 days · TEAM_DURATION = 24 daysThe launcher passes these two constants when it creates the team stream, and the vesting contract's verified source on Etherscan shows the same values. The Code tabs of the token and the hook still include an older copy of LaunchConfig.sol with 30 and 90 days in those two lines. Neither contract reads them: the token uses only TOTAL_SUPPLY, the hook only the fee constants. A fresh exact verification of both is requested. After launch, vesting.stream(0) shows the real start and length on chain.
vesting.stream(0) · start = launch + 7 days · duration = 24 daysThe launch transaction may include one buy for the team wallet: at most 3 ETH and at most 10% of supply, or the launch reverts.
DEV_BUY_MAX = 3 ether · DEV_BUY_MAX_BPS = 1_000 · DevBuyTooBigTreasury policy
Treasury fees fund integrations, listings, builder bounties, distribution and security. The two buckets below split what the treasury spends; they are shares of the treasury, not fee rates. Every payment is public.
Privacy Reserve · 50%
Keeps users safe and payments private: security reviews and fixes, gas so a payment address never needs ETH from a linked wallet, a reserve nobody touches, and the leak research.
Integrations · 50%
Puts private payments where people already are: wallet and app integrations, vested KOL streams, bounties for builders and listings.
At most 30% up front, 70% after delivery.
EPH only on top of an ETH payment, and always vested.
Every spend names one KPI, gets a review after 14 days and has a kill switch.
No single recipient gets more than 15% of what the treasury spends in a month.
From launch on, each payment shows with its label in the fee flow panel on /stats and as a transaction on this page.
The treasury wallet is listed under Contracts. Shares of what the treasury spends, never fee rates.
Mainnet rehearsal · 8 Oct
A throwaway token named "canary test do not buy" (CNRYTEST) went through the full launch on mainnet on 8 Oct, to test every buy and sell route before the real deploy. All four contracts verified on Etherscan, Sourcify and Blockscout on 9 Oct. It is not EPH. Do not buy it.
Canary contracts
Same token, hook and launcher logic as the launch. The launch version adds a comment header with project links and per-KOL schedules in vesting.
Receipts
0xede5bae7aa9c4e924cb93d244dc5c3d3ec40e2ec9f7781825a47a7ea72984781
0xc490402846003d47db595343ea32f93496a11299958bf23d2109766cf6cce0c8
Bought the canary straight into a stealth address. Both receipts used the same one-time address: Claus Lab caught it, and StealthBuy now refuses a reused address (review log).
0xdcefc8a2ead98181cb0b0e4e973dbc2f350ebf51a52f1e653f1f009f083a9df3
The throwaway wallet that ran the rehearsal, emptied afterwards. It holds no role in the real launch.
Public review log
Claus Lab (@contractclaus) reviews our code in the open. Every finding, the fix and the commit in github.com/siriusthemaster/ephemeral. Findings from the bug bounty land here too, with the credit the researcher asked for. Newest first.
With the scan set to the last 30 days, the default then, an older payment was left out of the collector check. H3 could call a destination unused that the older payment had already gone to.
@0x123van · bug bounty, LowClient 0.2.5: any range other than Everything counts as incomplete history, for past withdrawals and for your own addresses, so H3 warns "history incomplete". The scan covers everything by default. Fixed before any payment aged past the window.
"Show guessing success per holder, not just the 3.1% average. Include carry across epochs too, and report payment delays alongside privacy gains."
Claus LabPer-holder numbers (median 1.3% per note, worst holder 14.8%), 30 epochs with and without linked destinations, and payment delay for each base unit. Notes of different epochs must never meet.
"An attestation isn't proof of beneficial ownership; a custodian can sign it or use an EOA/7702 too."
Claus LabAgreed, and listed as a known limit. Tested bound: a false attestation only mixes ages already inside that one account and creates no boost. An attestation is now voided for good by any owner or threshold change.
"A Safe can hold customer deposits with withdrawal claims; signer control doesn't make those gifts."
Claus LabEOAs and EIP-7702 accounts count as wallets. Any other contract, Safes and ERC-4337 accounts included, is shared unless every owner attests it holds only their tokens.
"My rewards follow holding time, including previous owners. Grouping exact amounts can leave one holder identifiable."
Claus LabStealthPayout v2, denomination notes: debts rounded down with a carry, split into notes of base × 2k under a crowd cap, one equal-amount group per denomination, total checked on chain.
"'One-time' needs a lasting use record, not just empty balances."
Claus LabThe router records every stealth address it paid. The same buy sent again, even after a full drain, reverts with StealthAddressUsed. Cost: 22,389 gas per buy.
"The tx count can match while the reused destination is still missing from history."
Claus LabEvery token transfer out of the address is read from the node and matched against the explorer. One that is not indexed yet makes history incomplete, and H3 says so.
NFT mint and redeem: fresh tokens deposited into a vault next to aged ones would come out aged.
Claus Lab probeShared contracts (vaults, staking, lending, exchanges) are treated like the pool: tokens going in leave the ledger like a sale, tokens coming out start at day 0 without First Light.
"Our reward ledger is public. A fresh address alone doesn't hide whose balance got cleared."
Claus LabStealthPayout v1: one epoch in one transaction, the same amount to every NFT, each to a fresh stealth address. The ledger logs epoch totals and a commitment root, never a per-holder debit.
On mainnet, one prepared buy ran twice: two payments landed on one one-time address (receipts 1 and 2 above).
Claus Lab review of the rehearsalFresh address guard: the buy reverts if the address already has code, ETH or the token. New end-to-end tests: the replayed buy, and a 12,345 wei top-up from the receiver's own wallet that the funding check must flag.
v2's wallet-wide reset on a sale could be dodged: move a few tokens to a side wallet and sell there, the rest keeps the boost.
Claus LabNo wallet-wide resets. Unbroken and First Light follow each token's own history, pro rata. Splitting before a sale now gives exactly the result of selling directly (tested).
A second payment was withdrawn to the same fresh address minutes after the first, and H3 did not warn: the explorer had not indexed the first withdrawal yet.
Found by us in the rehearsalHistory is compared with each address's on-chain nonce; if the explorer is behind, it counts as incomplete. The client records a destination as soon as a token leaves.
While past withdrawals are loading or cannot be read, the reuse check must not report a destination as unused, and a caller that forgets the flag must not fail open.
Claus Lab reviewH3 warns "history incomplete" instead of "unused". The flag became required; a missing value counts as incomplete (fail safe, 9 Oct).
Quotes are Claus Lab's words as recorded in the repo's tests and docs. Folder links point to main; commit links are the exact change. Every receipt in one table, failed and fixed ones included: Receipts.
Tests
Counts as of 9 Oct. Each public suite runs from its folder with one command.
Launch contracts
143 tests
Foundry, v0.5.3: launcher, token, hook, vesting, the KOL grant script, the team schedule day by day and treasury ETH liquidity. Fee math fuzzed over all four swap types and launch across ETH prices, plus a regression test for every fix from our internal review.
forge testStealthBuy · router/
21 + 4 e2e
Delivery, announcement format, slippage, re-entry, the use record and fresh address guard. End to end on anvil: tip only, 12,345 wei top-up, replay, replay after drain.
forge test · e2e/run.shStealthPayout · payouts/
24 + 32
16 v1 and 8 v2 Solidity tests (equal split, notes, parts, parking, re-entry) and 32 TypeScript tests (plans, proofs, observer brute force, epochs).
forge test · cd ts && npm testWithdrawals · withdrawal-policy/
22
H1 to H5 guards (13) and history loading (9): nonce lag, token transfers missing from the explorer, fail safe defaults.
node --experimental-strip-types --test *.test.tsPhases · phases/
15
Claus Lab's probes, random chains of thousands of tiny transfers, shared contracts, attestations and the false-attestation bound.
node --experimental-strip-types --test unbroken.test.tsLeak scanner · research/
17
Log decoding, the H1 to H5 heuristics, and an end-to-end scan against a fake node.
npm testRehearsals
19/19 + canary
The whole launch run end to end on a local chain: deploy, launch, the fee stepping down over the first hour, fee payout, partner grants, claims, revoke and regrant, reserve sweep, team claims at day 7 and day 30, treasury ETH liquidity, lock extension and withdrawal after unlock. Then the canary on mainnet, 8 Oct.
see Rehearsal abovePublic suites: github.com/siriusthemaster/ephemeral. Everything there is MIT and unaudited unless a folder says otherwise.
Challenge · until launch
Find a way around anything on this page before trading opens. Every valid finding lands in the review log above, with its fix and commit.
Open a GitHub issue with the steps: a transaction, a test or a script that shows it.
Open an issueIf it could cost anyone funds once live, email security@ephemeral.money instead and keep it private until it is fixed.
Rewards for this challenge are announced separately.
The standing bug bounty for the ephemeral client still applies.