SLUICEOn-chain payment splitter
Open app
Live on 3 chains One address everywhere No owner · no fees

Get paid together.
Split automatically.

Sluice is one shared payment-splitter registry per chain. Create a split — a list of payees and their percentage shares — and anyone can pay into it, in the native token or any ERC-20. Every payee independently pulls their proportional share of everything the split has ever received. No treasury wallet, no spreadsheet, no trusting whoever holds the multisig.

Create a split See how it works No sign-up. No custody.
SPLIT 50% 30% 20% ONE REGISTRY · EVERY SPLIT
Why it's simple to trust

Pull, not push

Nobody sends anyone money. Every payee independently pulls their own accrued share whenever they like — there's no distribution step to forget, no multisig sign-off to wait on.

Immutable once made

Payees and shares are locked in at creation. No admin function can rewrite a split — to change who gets paid, you create a new one. Old splits stay exactly as agreed, forever.

Nothing to trust

No owner, no admin key, no fee address, no upgrade path — not even for whoever pays to deploy the registry. Funds only ever move toward a payee named in the split they were paid into.

Mechanism

Four steps, no intermediary.

01Create a split. List your payees and each one's percentage share, add a label. That's the whole setup — no deposit required to create it.
02Share the link. Every split gets a permanent URL. Send it to a client, a collaborator, a community treasury — anyone who owes the group money.
03Anyone pays in. Native token or any ERC-20, any number of times, from any address. The registry tracks exactly what's arrived, per split, per token.
04Every payee pulls their share. Proportional to their percentage, in whichever token arrived. "Release everything owed to me" sweeps every token in one click.
Built for real tokens

Handles the ERC-20s that break naive splitters.

Some tokens take a fee on transfer. Some — like mainnet USDT — don't return a bool from transfer. Sluice credits a payment by measuring the actual balance change, not the nominal amount, and tolerates both calling conventions — so the accounting backing every split always matches what the registry actually holds.

// credited amount is measured, never assumed function payToken(uint256 id, address token, uint256 amount) external { uint256 before = token.balanceOf(address(this)); _safeTransferFrom(token, msg.sender, address(this), amount); uint256 received = token.balanceOf(address(this)) - before; totalReceived[id][token] += received; // fee-on-transfer safe }
One registry per chain
BotChain
CHAIN 677 · BOT
Base
CHAIN 8453 · ETH
BNB Chain
CHAIN 56 · BNB
Contract address — identical on every chain
0x864EC4296039D7F4B230350E5B14EC2e57695955

Deployed through the standard CREATE2 proxy from bytecode with no constructor arguments, so your browser derives this address before anyone has deployed anything. If a chain has no registry yet, the app shows a Deploy button; the first person to press it builds the one everyone afterwards uses.