Token Transfer Runbook
Engineer/DeveloperSecurity SpecialistMultisig Security
This is an example runbook. Review and customize it for your protocol before use. Add your specific multisig addresses, token details, and verification procedures.
Quick Reference
| Field | Value |
|---|---|
| Typical Severity | Routine / Time-Sensitive |
| Required Threshold | Standard |
| Owner | Treasury Admin |
| Last Updated | Date |
When to Use
Sending tokens (ETH, ERC20, SOL, SPL tokens) from a multisig to another address.
Prerequisites
- Recipient address verified via independent source (not just chat message)
- Amount confirmed
- Reason for transfer documented or approved
EVM (Safe) Procedure
1. Create Transaction
Proposer:
- Go to Safe
- Select correct Safe and network
- Click "New Transaction" > "Send tokens"
- Enter recipient address (use checksummed format)
- Select token and enter amount
- Review and create transaction
2. Verify Transaction
Each signer must:
[ ] Correct Safe address
[ ] Correct network (Ethereum/Base/etc.)
[ ] Expected nonce
[ ] Recipient address matches independent source
[ ] Token is correct
[ ] Amount is correct
[ ] Simulation shows expected transfer
[ ] Message hash matches hardware walletHash verification:
./safe_hashes.sh --network mainnet --address [SAFE_ADDRESS] --nonce [NONCE]Or use OpenZeppelin Safe Utils.
Simulation check:
- Click "Simulate" in Safe UI
- Verify token transfer event shows correct recipient and amount
- No unexpected transfers or approvals
3. Sign
- Review transaction on hardware wallet
- Verify message hash matches tool output
- Sign
- Communicate: "Verified and signed, X more needed"
4. Execute
- Last signer clicks "Execute" (or designated executor)
- Confirm transaction on-chain via block explorer
- Communicate: "Executed - [tx hash]"
Solana (Squads) Procedure
1. Create Transaction
Proposer:
- Go to Squads Multisig
- Select correct Squad
- Click "Send" > Select token
- Enter recipient address and amount
- Create proposal
2. Verify Transaction
Each signer must:
[ ] Correct Squad address
[ ] Recipient address matches independent source
[ ] Token is correct
[ ] Amount is correct
[ ] Simulation shows expected transferSimulation check:
- Click "Simulate" after first signature
- For SOL: Find "System Program Instruction", verify destination and amount
- For tokens: Find "Token Program Instruction", verify destination, mint, and amount
3. Sign
- Click "Approve"
- Verify hash in Squads UI matches Ledger display
- Sign on Ledger
- Communicate: "Verified and signed, X more needed"
4. Execute
- Last signer executes
- Verify on Solana Explorer
- Communicate: "Executed - [tx signature]"
Verification Details
Recipient Address
Always verify recipient via independent source:
- Direct communication with recipient (video call or verified channel)
- Published address in official documentation
- On-chain verification (existing relationship)
Never trust an address shared only via chat message.
Amount Verification
For ERC20 or SPL tokens, verify decimals:
- USDC or USDS: 6 decimals (1,000,000 = 1 token)
- Most ERC20: 18 decimals
Common Issues
| Issue | Solution |
|---|---|
| Simulation fails | Check token balance, gas estimation |
| Wrong network | Reject and recreate on correct network |
| Nonce mismatch | Clear pending transactions first |
| Recipient can't receive | Verify address is correct type (EOA vs contract) |