Scatter docs
Scatter is a bulk sender on Robinhood Chain (chain id 4663). One transaction moves ETH or any ERC-20 from your wallet to up to 500 recipients. The site also rebuilds the holder list of any token, so you can airdrop to holders without an indexer.
Sending to a list
- Pick the asset: ETH, USDG, one of the 27 Stock Tokens, or paste any token address.
- Paste the recipients, one per line.
- Check the summary: recipients, total, your balance and the number of transactions.
- Send. For tokens, the first transaction approves exactly the total; then each batch of up to 250 recipients is one transaction.
List format
0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984, 25 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 10.5 0x6B175474E89094C44Da98b954EedeAC495271d0F;100
- Address first, amount second, separated by a comma, space, semicolon or tab.
- Amounts are in whole tokens. Decimals come from the token.
- The same address twice is merged into one line with the summed amount.
- "Same amount for everyone" ignores the amounts and uses one value for every address.
- Lines with a bad address or amount are listed by number and block the send until fixed.
What gets signed
For ETH: sendEth(addresses, amounts) with a value of the sum plus the fee. For tokens: token.approve(Scatter, total) once, then sendToken(token, addresses, amounts) with the fee as value. Inside, each transfer is transferFrom(you, recipient, amount), so tokens never sit in the contract. If any single transfer fails, the whole batch reverts and nothing moves.
Holder snapshots
The Holders tab reads every Transfer event of the token from Robinhood Chain in your browser, in slices of up to 10 million blocks (smaller when a slice holds too many events), and rebuilds each balance by adding incoming and subtracting outgoing amounts. The zero address is dropped.
- Skip contracts: the top 600 holders are checked for bytecode; pools, bonding curves and other contracts are left out when the box is ticked.
- Pro rata: amount × holder balance ÷ sum of balances in the list.
- Equal: the same amount for each holder in the list.
- Tokens with more than 400,000 transfers are refused, because a browser can't rebuild them in reasonable time. Pons memes are well under that.
The snapshot is taken at the moment you read it. A holder who buys or sells afterwards is not reflected unless you read again.
Fees and gas
Each send pays a flat 0.00003 ETH to the treasury. In the contract's tests, 500 ERC-20 transfers took about 13.2 million gas in one call. Gas on Robinhood Chain is cheap, but large lists of fresh addresses cost more because each new balance slot is written for the first time.
Contract interface
function sendEth(address[] to, uint256[] amounts) payable // value = sum(amounts) + fee function sendToken(IERC20 token, address[] to, uint256[] amounts) payable // value = fee function fee() view returns (uint256) uint256 constant MAX_FEE = 0.0005 ether uint256 constant MAX_RECIPIENTS = 500 event Scattered(address indexed sender, address indexed token, uint256 recipients, uint256 total)
Owner limits
The owner can set the fee up to 0.0005 ETH, change the treasury and hand over ownership. There is no function that moves tokens, and the contract never holds a balance after a call.
Risks
- The contract is unaudited. It has unit tests and a test that sends real USDG on a copy of mainnet.
- A wrong address in your list receives the tokens. Check the list.
- Tokens with transfer taxes deliver less than the amount sent.
Contracts
| Contract | Address |
|---|---|
| Scatter | deploying soon |
