Prorata docs
Prorata is a split factory on Robinhood Chain (chain id 4663). Each split is its own small contract (an EIP-1167 clone) with a fixed list of payees and shares. Anything sent to it, ETH or any token, is paid out to the payees by share when someone calls distribute.
What a split is
- 2 to 30 payees, each a wallet or another contract, including another split.
- Shares in basis points (1 = 0.01%) that add up to exactly 10,000.
- An optional label up to 64 characters.
- Payees, shares and label are set in
initializeduring creation and can never change.
Creating
The app calls Prorata.create(payees, shares, label). The factory deploys a clone, initializes it, indexes it by creator and by every payee, and emits SplitCreated with the new address. Creating costs only gas, about 390,000 for two payees.
Distributing
A split collects whatever is sent to it. distribute(token) (zero address for ETH) pays out the free balance of that token. Anyone can call it: a payee, the creator, a bot. Each token is distributed separately.
The math
amount = balance(token) − held(token) fee = amount × feeBps ÷ 10,000 (0.5% today, 1% at most) rest = amount − fee payee i gets rest × share_i ÷ 10,000, the last payee gets what is left
Example: 1 ETH in a 50/30/20 split pays 0.005 ETH fee, then 0.4975, 0.2985 and 0.199 ETH.
Held shares
If a payee can't receive (a contract that rejects ETH, or a token that blocks the address), its part is not lost and doesn't block the others. It is recorded in owed(token, payee) and kept out of the next distributions. The payee calls withdraw(token, to) to send it to any address.
Pons creator fees
A split is an ordinary address, so it can receive a pons token's creator fees wherever the fee flow lets you choose the destination, or receive them when the creator forwards a claim. After that, any team member presses distribute and everyone gets their share in one transaction.
Interface
// factory function create(address[] payees, uint16[] shares, string label) returns (address split) function splitsOf(address payee) view returns (address[]) function createdBy(address creator) view returns (address[]) event SplitCreated(address indexed split, address indexed creator, string label, address[] payees, uint16[] shares) // split function payees() view returns (address[], uint16[]) function pending(address token) view returns (uint256) function distribute(address token) function withdraw(address token, address to) function owed(address token, address payee) view returns (uint256) function distributed(address token) view returns (uint256)
Owner limits
The factory owner can set the fee between 0% and 1% (MAX_FEE_BPS = 100), change the treasury and hand over ownership. A fee change applies to future distributions of every split. There is no function to move a split's funds, change its payees or pause it.
Risks
- The contracts are unaudited. They have unit tests and a test with real USDG on a copy of mainnet.
- A wrong payee address is permanent. Create a new split if you made a mistake.
- Tokens with transfer taxes deliver less than the shares suggest.
Contracts
| Contract | Address |
|---|---|
| Prorata factory | deploying soon |
