BaseLaunchHoldersDistributor
One per holders-mode coin (a clone of the implementation): the coin's creator fee recipient, set at launch, which pays those fees to holders through published Merkle epochs, each claimable for 90 days. The creator cannot move it; the protocol owner can redirect it after a 3-day notice.
Creator fee recipient for a launch in holders mode. Every creator fee the launch earns is credited here through the fee escrow, harvested by anyone, and paid out to the token's holders through Merkle epochs that the distributor factory's current publisher posts. Deployed as an EIP-1167 clone of a fixed implementation, so its code can never change. There is no owner, no sweep and no way to move a recipient: funds leave only as claims against a published epoch, to the account the epoch's tree names. Known publisher power: the publisher decides how available() is split, so a malicious publisher could allocate it to arbitrary accounts. It can never exceed available(), and it can never touch an allocation already published and still inside its claim window, because those amounts are held in reserved until claimed or expired.
Part of the contract reference.
Deployed at
Each holders-mode coin gets its own clone of this implementation, created by the distributor factory in the launch transaction. The clone's address is the coin's creator fee recipient and appears in the router's LaunchedWithBuy event.
Read functions (9)
| Function | What it does |
|---|---|
availableavailable() view returns (uint256)selector 0x48a0d754Anyone | Quote held here and not yet promised to any epoch. |
CLAIM_WINDOWCLAIM_WINDOW() view returns (uint256)selector 0x9f34fc80Anyone | How long an epoch stays claimable after it is published. |
claimedclaimed(uint256 epoch, address account) view returns (bool)selector 0x120aa877Anyone | Whether an account has claimed its allocation in an epoch. |
epochCountepochCount() view returns (uint256)selector 0x829965ccAnyone | Number of published epochs. |
factoryfactory() view returns (address)selector 0xc45a0155Anyone | The distributor factory that cloned this contract. Immutable in the implementation's code, so every clone reads the same value. |
getEpochgetEpoch(uint256 epoch) view returns (Epoch)selector 0xbc0bc6baAnyone | One published epoch. |
quotequote() view returns (address)selector 0x999b93afAnyone | The launch's quote asset; zero for native ETH. |
reservedreserved() view returns (uint256)selector 0xfe60d12cAnyone | Amount published to epochs and not yet claimed or expired. |
tokentoken() view returns (address)selector 0xfc0c546aAnyone | The launch token whose creator fees this distributor receives. |
Write functions (7)
| Function | What it does |
|---|---|
claimclaim(uint256 epoch, address account, uint256 amount, bytes32[] proof)selector 0x2e7ba6efAnyone | Pays |
claimManyclaimMany(uint256[] epochs, address account, uint256[] amounts, bytes32[][] proofs)selector 0xfae68828Anyone | Batched |
expireexpire(uint256 epoch)selector 0xbf81bf43Anyone | Releases an epoch's unclaimed remainder back to |
harvestharvest() returns (uint256 amount)selector 0x4641257dAnyone | Pulls this distributor's escrow balance in the quote asset. Permissionless, and a no-op when there is nothing to pull. |
initializeinitialize(address token_)selector 0xc4d66de8Anyone | Binds this distributor to |
publishpublish(bytes32 root, uint256 total, string uri) returns (uint256 epoch)selector 0x2460b6a3Publisher key (read live from the distributor factory) | Publishes a reward epoch. Only the distributor factory's current publisher may call it, and |
receivereceive() payableAnyone | Accepts native ETH; this is how the fee escrow pays a distributor of an ETH-paired coin when it harvests. |
Events (5)
| Event | What it means |
|---|---|
ClaimedClaimed(uint256 indexed epoch, address indexed account, uint256 amount)topic0 0x4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026 | |
EpochExpiredReleasedEpochExpiredReleased(uint256 indexed epoch, uint256 released)topic0 0x5dd13dd7f5ad5f43f002aad6c9c494fb29b091f4c36a7f51611ca0bac33a00e3 | An epoch's claim window closed and its unclaimed rest returned to the available balance. Emitted by expire |
EpochPublishedEpochPublished(uint256 indexed epoch, bytes32 root, uint256 total, string uri)topic0 0x99b0dcfc120cefd24844a850c4410ebf3dab1166d213a63b9312a4dfcaa75bf2 | The publisher posted a reward epoch: Merkle root, total and the URI of the full table. Emitted by publish |
HarvestedHarvested(address indexed quote, uint256 amount)topic0 0x121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf | The distributor pulled its balance from the fee escrow. Emitted by harvest |
InitializedInitialized(address indexed token, address quote)topic0 0x3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc2 | The distributor was bound to its coin and pair asset. Emitted by initialize |
Structs
| Struct | Fields, in ABI order |
|---|---|
Epoch | bytes32 root, uint256 total, uint256 claimed, uint64 publishedAt, bool expired |
Addresses are listed for launcher 2.1.0, where new coins launch, and for launcher 2.0, which keeps serving the coins launched before the cutover. A coin stays on the set that launched it. The functions and events are the 2.1.0 contracts'; the 2.0 contracts are an earlier version of the same code and have no interface registry, so check a 2.0 contract's verified source on Basescan before relying on a detail listed here.