Scatter

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

  1. Pick the asset: ETH, USDG, one of the 27 Stock Tokens, or paste any token address.
  2. Paste the recipients, one per line.
  3. Check the summary: recipients, total, your balance and the number of transactions.
  4. 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

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.

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

Contracts

ContractAddress
Scatterdeploying soon