Prorata

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

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

Contracts

ContractAddress
Prorata factorydeploying soon