ephemeral

ephemeral · EPH launch

Proof Wall Check the launch yourself.

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

Four contracts, three explorers

Source verified on Etherscan, Sourcify and Blockscout, so you can read the code where it runs.

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

Read it from the chain, now

Plain eth_call from your browser to a public node. No wallet, no API key, nothing to sign.

LP lock · launcher.unlockTime()

Reading…

--days
--hours
--min
--sec
unlockTime() = launch + 365 days, can only be pushed laterreading

Trading

Reading…

Opens once, inside the launch transaction. Before that only the launcher can move EPH.

token.tradingOpen()reading

Owner

Reading…

There is no owner. The function exists so scanners that look for one get 0x0.

token.owner()reading

Total supply

Reading…

Minted once in the constructor. There is no mint function.

token.totalSupply()reading

Held 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)reading

Swap fee right now

Reading…

Same for buys and sells, taken in ETH by the hook. Schedule in Rules below.

hook.feeBps(any)reading

Fees owed, not yet paid out

Reading…

Booked by the hook. Anyone can call distribute() to pay them out.

hook.treasuryOwed() · teamOwed()reading

Ecosystem Growth Reserve

Reading…

Set at launch from the 25% Ecosystem Growth share. Partner grants are streamed from it and stay revocable.

vesting.kolReserve()reading

Vesting streams

Reading…

The Core Contributors stream is created at launch; every partner grant adds one.

vesting.streamCount()reading

Official pool

Reading…

The only pool with this hook. Fees and the LP lock apply here; any other EPH pool is not ours.

hook.poolId()reading

Wiring

Reading…

The launcher names the token, hook and vesting it was deployed with. They must be the addresses above.

launcher.token() · hook() · vesting()reading
Not read yet
Check it without this page

Each 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

Constants in the code, not promises

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

  • Locked Liquidity 70%Uniswap v4, 365-day onchain lock700,000,000
  • Ecosystem Growth Reserve 25%vested, revocable250,000,000
  • Core Contributors 5%vested, day 7 to day 3050,000,000

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.

Treasury policy

We don't burn. We hire growth.

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%

  • Security20%
  • Gas tank15%
  • Untouched reserve10%
  • Research5%

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%

  • Integrations20%
  • KOL streams15%
  • Builder bounties10%
  • Listings5%

Puts private payments where people already are: wallet and app integrations, vested KOL streams, bounties for builders and listings.

The treasury wallet is listed under Contracts. Shares of what the treasury spends, never fee rates.

Mainnet rehearsal · 8 Oct

We launched a canary first

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

    StealthBuy receipt 1

    0xede5bae7aa9c4e924cb93d244dc5c3d3ec40e2ec9f7781825a47a7ea72984781

    EtherscanBlockscout

    StealthBuy receipt 2

    0xc490402846003d47db595343ea32f93496a11299958bf23d2109766cf6cce0c8

    EtherscanBlockscout

    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).

    Burner drained

    0xdcefc8a2ead98181cb0b0e4e973dbc2f350ebf51a52f1e653f1f009f083a9df3

    EtherscanBlockscout

    The throwaway wallet that ran the rehearsal, emptied afterwards. It holds no role in the real launch.

    Public review log

    Found in public, fixed in public

    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.

    21 OctWithdrawals H3
    Finding

    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, Low
    Fix

    Client 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.

    9 Octpayouts v2
    Finding

    "Show guessing success per holder, not just the 3.1% average. Include carry across epochs too, and report payment delays alongside privacy gains."

    Claus Lab
    Fix

    Per-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.

    9 OctPhases v3.2
    Finding

    "An attestation isn't proof of beneficial ownership; a custodian can sign it or use an EOA/7702 too."

    Claus Lab
    Fix

    Agreed, 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.

    9 OctPhases v3.2
    Finding

    "A Safe can hold customer deposits with withdrawal claims; signer control doesn't make those gifts."

    Claus Lab
    Fix

    EOAs 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.

    9 Octpayouts v2
    Finding

    "My rewards follow holding time, including previous owners. Grouping exact amounts can leave one holder identifiable."

    Claus Lab
    Fix

    StealthPayout 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.

    9 OctStealthBuy
    Finding

    "'One-time' needs a lasting use record, not just empty balances."

    Claus Lab
    Fix

    The 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.

    9 OctWithdrawals H3
    Finding

    "The tx count can match while the reused destination is still missing from history."

    Claus Lab
    Fix

    Every 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.

    9 OctPhases v3.1
    Finding

    NFT mint and redeem: fresh tokens deposited into a vault next to aged ones would come out aged.

    Claus Lab probe
    Fix

    Shared 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.

    9 Octpayouts v1
    Finding

    "Our reward ledger is public. A fresh address alone doesn't hide whose balance got cleared."

    Claus Lab
    Fix

    StealthPayout 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.

    8 OctStealthBuy
    Finding

    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 rehearsal
    Fix

    Fresh 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.

    8 OctPhases v3
    Finding

    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 Lab
    Fix

    No 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).

    8 OctWithdrawals H3
    Finding

    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 rehearsal
    Fix

    History 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.

    8 OctWithdrawals H3
    Finding

    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 review
    Fix

    H3 warns "history incomplete" instead of "unused". The flag became required; a missing value counts as incomplete (fail safe, 9 Oct).

    8 OctPhases v2
    Finding

    Unbroken reset on any transfer out, so moving tokens to a safer wallet cost holders their boost.

    Claus Lab
    Fix

    Unbroken moved from wallets to tokens. Moving to a safer wallet costs nothing.

    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

    Run them yourself

    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 test

    StealthBuy · 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.sh

    StealthPayout · 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 test

    Withdrawals · 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.ts

    Phases · 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.ts

    Leak scanner · research/

    17

    Log decoding, the H1 to H5 heuristics, and an end-to-end scan against a fake node.

    npm test

    Rehearsals

    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 above

    Public suites: github.com/siriusthemaster/ephemeral. Everything there is MIT and unaudited unless a folder says otherwise.

    Challenge · until launch

    Break it before 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.

    What to try

    • Skip the fee window or move the LP before its unlock.
    • Move or trade EPH before launch.
    • Win Phases by splitting, routing through contracts or attesting.
    • Get a withdrawal past H1 to H5 unwarned.
    • Make StealthBuy or StealthPayout reuse an address or pay a wrong amount.

    How to report

    Open a GitHub issue with the steps: a transaction, a test or a script that shows it.

    Open an issue

    If it could cost anyone funds once live, email security@ephemeral.money instead and keep it private until it is fixed.

    Rewards

    Rewards for this challenge are announced separately.

    The standing bug bounty for the ephemeral client still applies.