Sender MultiSend — Documentation
How to use Sender MultiSend on Arc Testnet — batch-distribute USDC, EURC, cirBTC, and NFTs to hundreds of wallets in a single transaction.
Overview
Sender MultiSend is a gas-optimised batch token and NFT distribution dApp built on Arc Testnet. It supports Circle USDC & EURC (ERC-20), cirBTC, ERC-721, and ERC-1155 NFTs. A flat protocol fee of 0.001 USDC per recipient applies.
Batch Transfers
Send to 200 recipients in one transaction
Pre-flight Checks
Balance & address validation before execution
NFT Support
ERC-721 and ERC-1155 bulk send
1. Connect to Arc Testnet
Sender runs on Arc Testnet — an EVM-compatible chain. Connecting your wallet on the dashboard will prompt you to add or switch to Arc automatically. To add it manually in MetaMask, use these values:
| Network Name | Arc Testnet |
| RPC URL | https://rpc.testnet.arc.network |
| Chain ID | 5042002 |
| Currency Symbol | USDC |
| Block Explorer | https://testnet.arcscan.app |
2. NFT Holdings Feature
The NFT tab shows all ERC-721 and ERC-1155 tokens held by the connected wallet. Data is fetched from the Blockscout API:
GET https://testnet.arcscan.app/api/v2/addresses/{address}/nft/collections
?type=ERC-721,ERC-1155Features:
- Shows NFT name, symbol, and ERC standard badge
- Copy contract address to clipboard with one click
- Lists all owned token IDs (expandable for large collections)
- Auto-refreshes every 60 seconds
- Supports pagination for wallets with many NFTs
3. CSV Format
Upload or paste CSV in this format for token transfers:
wallet_address,amount,token
0x1234...abcd,10.50,USDC
0xabcd...1234,5.00,EURC
0x9876...dcba,1.00,USDCFor NFT bulk send:
contract_address,token_id,amount,standard,recipient_address
0xNFTContract,1,1,ERC721,0xRecipient1
0xNFTContract,42,5,ERC1155,0xRecipient2- Header row is optional — auto-detected
- Token defaults to USDC if not specified
- Max 200 rows per batch
- Download the Excel template from the Dashboard for a pre-formatted file
4. Security Checklist
- All wallet addresses validated with isAddress() from viem
- Amounts sanitized — only digits and single decimal point allowed
- CSV paste input sanitized against XSS (strips HTML tags, JS URIs, event handlers)
- Max batch size: 200 recipients — enforced in UI and smart contract
- Balance check before execution — insufficient tokens flagged pre-flight
- Smart contract uses custom errors for cheaper gas than require strings
- Ownership secured with OpenZeppelin Ownable (owner-only fee & withdrawals)
- Transaction history read live from Blockscout — nothing stored in the browser
5. Project Architecture
src/ ├── app/ │ └── app/ │ ├── page.tsx # Dashboard (Token + NFT tabs) │ ├── history/page.tsx # Transaction history (live from Blockscout) │ └── docs/page.tsx # This page │ ├── components/dashboard/ # Recipients table, summary panels, NFT holdings │ ├── lib/ │ ├── blockchain/ │ │ ├── provider.ts # Arc Testnet viem client │ │ ├── tokens.ts # Token registry + formatters │ │ ├── multisend.ts # Token batch execution (pull-then-push) │ │ ├── nft.ts # NFT batch execution │ │ └── history.ts # Blockscout history reader │ ├── hooks/ # use-batch-execution, use-nft-execution, ... │ └── store/ # Zustand state (in-memory) │ └── types/ # Domain TypeScript types
