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 NameArc Testnet
RPC URLhttps://rpc.testnet.arc.network
Chain ID5042002
Currency SymbolUSDC
Block Explorerhttps://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-1155

Features:

  • 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,USDC

For 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

Support & Resources