Splits & charities
A coin doesn't have to pay one account. Add up to eight recipients, accounts and charities mixed, give each a share, and every creator fee is divided between them on-chain. The routing is fixed at launch and nobody can change it afterwards, including us.
How a split works#
When a coin has more than one recipient, its Pons creatorFeeRecipient is a DibsSplit contract instead of a single vault. The split's address is derived from the exact list of recipients and shares, so it is known before it exists and Pons accepts it at launch. It is created on-chain the first time anyone claims, and from then on it holds nothing: everything credited to it is paid out on the same claim.
| Recipient type | Receives at | How they get paid |
|---|---|---|
| Creator account | Their handle vault | They sign in and claim like on any Dibs coin; their share is already in the vault |
| Charity | The charity's own wallet | Automatically, on every claim by anyone. Nothing to sign, no account needed |
Shares are whole basis points (0.01% steps) and must add up to exactly 100%. The form splits evenly by default; you can type any mix.
What happens on a claim#
- 1SweepCreator fees still sitting on the coin's curve are swept into the Pons escrow. Only the fee recipient may do that, so the split has its own
sweep, mirroring the vault's. - 2Distribute
distributepulls the split's escrow balance and pays every recipient its share in one transaction: vaults for accounts, wallets for charities. Anyone may call it. The caller may keep at most 1% as a keeper fee, which is how the relayer recovers its gas. - 3Pay outThe claimant's vault now holds their share and pays it to the wallet they proved, exactly as on a single-recipient coin.
0.55 ETH of volume, three recipients at 33.34 / 33.33 / 33.33
creator share swept 0.00385 ETH (0.7% of volume)
@alice's vault 0.00128 ETH → paid to her wallet when she claims
GiveDirectly's wallet 0.00128 ETH → arrives on that same claim, automatically
@bob's vault 0.00128 ETH → waits for him, however long that takesCharities#
The charities you can pick from are a list Dibs maintains: each entry is a wallet the charity publishes itself for crypto donations. A charity gets its own page at /h/charity/<name> showing every coin routing to it and what has arrived.
Costs#
| Item | Amount | Paid by |
|---|---|---|
| Dibs fee | None | — |
| Keeper fee | Up to 1% of what a distribute pays out, only as much as the gas cost | All recipients proportionally, since it comes off the top |
| Remaining claim gas | Same as a normal claim | The claimant, out of their payout |
What nobody can do#
- Change the recipients or shares. They are set once, in the split's constructor call, with no owner and no admin.
- Move money anywhere else.
distributepays the fixed recipients and, at most, 1% to whoever called it. - Block a distribution. Anyone can call it, including the recipients themselves from any wallet.
For developers#
The factory is DibsSplitFactory at 0x9fD16eA9E31233279975D99D5e8Fc91dd214c7Da; see For developers for every address.
- Salt
- keccak256(abi.encode(recipients, shares))
- Clone
- EIP-1167 minimal proxy
- Max recipients
- 8
- Max keeper fee
- 100 bps
- Shares
- uint16 bps, sum 10000
- Owner
- None
function predict(address[] recipients, uint16[] shares) view returns (address);
function create(address[] recipients, uint16[] shares) returns (address split); // idempotent
// on the split
function pending() view returns (uint256); // escrow balance + held
function pendingToken(address token) view returns (uint256);
function sweep(address token); // curve → escrow, pre-graduation
function distribute(uint256 keeperFee) returns (uint256 total);
function distributeToken(address token, uint256 keeperFee) returns (uint256 total);
event Distributed(address indexed asset, address indexed recipient, uint256 amount);Recipients' vaults are the same handle vaults as everywhere else, so a split is just a different fee recipient in front of them. Dibs indexes Distributed events to attribute earnings per coin.