# 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](https://baselaunch.app/docs/reference).

### Deployed at

BaseLaunchHoldersDistributor implementation (2.1.0)`0x7cC41c9bb4c3831CfdE3E72067d1A848A5535068`[](https://basescan.org/address/0x7cC41c9bb4c3831CfdE3E72067d1A848A5535068)

BaseLaunchHoldersDistributor implementation (2.0)`0xf8049DEcBE32bACD3E239Ba5Ff625FC32366a287`[](https://basescan.org/address/0xf8049DEcBE32bACD3E239Ba5Ff625FC32366a287)

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 |
| --- | --- |
| [available](#available) `available() view returns (uint256)` selector 0x48a0d754 Anyone | Quote held here and not yet promised to any epoch. |
| [CLAIM_WINDOW](#CLAIM_WINDOW) `CLAIM_WINDOW() view returns (uint256)` selector 0x9f34fc80 Anyone | How long an epoch stays claimable after it is published. |
| [claimed](#claimed) `claimed(uint256 epoch, address account) view returns (bool)` selector 0x120aa877 Anyone | Whether an account has claimed its allocation in an epoch. |
| [epochCount](#epochCount) `epochCount() view returns (uint256)` selector 0x829965cc Anyone | Number of published epochs. |
| [factory](#factory) `factory() view returns (address)` selector 0xc45a0155 Anyone | The distributor factory that cloned this contract. Immutable in the implementation's code, so every clone reads the same value. |
| [getEpoch](#getEpoch) `getEpoch(uint256 epoch) view returns (Epoch)` selector 0xbc0bc6ba Anyone | One published epoch. |
| [quote](#quote) `quote() view returns (address)` selector 0x999b93af Anyone | The launch's quote asset; zero for native ETH. |
| [reserved](#reserved) `reserved() view returns (uint256)` selector 0xfe60d12c Anyone | Amount published to epochs and not yet claimed or expired. |
| [token](#token) `token() view returns (address)` selector 0xfc0c546a Anyone | The launch token whose creator fees this distributor receives. |

### Write functions (7)

| Function | What it does |
| --- | --- |
| [claim](#claim) `claim(uint256 epoch, address account, uint256 amount, bytes32[] proof)` selector 0x2e7ba6ef Anyone | Pays `account` its allocation in `epoch`. Anyone may submit it; the payment always goes to `account`. |
| [claimMany](#claimMany) `claimMany(uint256[] epochs, address account, uint256[] amounts, bytes32[][] proofs)` selector 0xfae68828 Anyone | Batched `claim` for one account across several epochs. |
| [expire](#expire) `expire(uint256 epoch)` selector 0xbf81bf43 Anyone | Releases an epoch's unclaimed remainder back to `available()` once its claim window has closed. Permissionless. |
| [harvest](#harvest) `harvest() returns (uint256 amount)` selector 0x4641257d Anyone | Pulls this distributor's escrow balance in the quote asset. Permissionless, and a no-op when there is nothing to pull. |
| [initialize](#initialize) `initialize(address token_)` selector 0xc4d66de8 Anyone | Binds this distributor to `token_`, once. Anyone may call it, but only for a launch whose creator fee recipient is this contract, so a distributor can never be bound to a launch whose fees it does not get. |
| [publish](#publish) `publish(bytes32 root, uint256 total, string uri) returns (uint256 epoch)` selector 0x2460b6a3 Publisher key (read live from the distributor factory) | Publishes a reward epoch. Only the distributor factory's current publisher may call it, and `total` must fit in `available()`. |
| [receive](#receive) `receive() payable` Anyone | 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 |
| --- | --- |
| [Claimed](#event-Claimed) `Claimed(uint256 indexed epoch, address indexed account, uint256 amount)` topic0 0x4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed026 | An account's allocation in an epoch was paid to it. Emitted by [claim](#claim), [claimMany](#claimMany) |
| [EpochExpiredReleased](#event-EpochExpiredReleased) `EpochExpiredReleased(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](#expire) |
| [EpochPublished](#event-EpochPublished) `EpochPublished(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](#publish) |
| [Harvested](#event-Harvested) `Harvested(address indexed quote, uint256 amount)` topic0 0x121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf | The distributor pulled its balance from the fee escrow. Emitted by [harvest](#harvest) |
| [Initialized](#event-Initialized) `Initialized(address indexed token, address quote)` topic0 0x3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc2 | The distributor was bound to its coin and pair asset. Emitted by [initialize](#initialize) |

### Structs

| Struct | Fields, in ABI order |
| --- | --- |
| `Epoch` | `bytes32 root, uint256 total, uint256 claimed, uint64 publishedAt, bool expired` |

Two launcher sets on Base

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.

How the fees are split is on [fees](https://baselaunch.app/fees), what the owner can and cannot change is on [security](https://baselaunch.app/security), and short answers are in the [FAQ](https://baselaunch.app/faq).

Meme coins are highly speculative and most lose their value. Nothing here is financial advice.

Last updated 2026-10-21.

Canonical page: https://baselaunch.app/docs/reference/distributor
