| name | zerion-monad-addresses |
|---|---|
| description | Canonical Monad mainnet smart contract addresses for use with Zerion CLI: bridged stablecoins (USDC, USDT0, USD1, AUSD), wrapped MON, signing canonicals (Permit2, ERC-4337, ERC-6492), wallet primitives (Multicall3, Safe), ERC-8004 trustless-agent registries, and DEX / aggregator / cross-chain router addresses for `zerion agent create-policy --allowlist` lockdown. Points at the official monad-crypto/token-list and monad-crypto/protocols repos as authoritative fallbacks, with a one-line `cast code` verification recipe before any address is used. |
| license | MIT |
Purpose: Provide a canonical, verified-on-the-spot reference for Monad mainnet contract addresses so an agent can pass explicit 0x… token addresses to zerion swap / bridge / send (the documented "prefer the explicit address when the symbol is ambiguous" path) and to zerion sign-typed-data for Permit2 flows.
Monad chain ID: 143
Monad chain name (Zerion CLI): monad
⚠️ Always verify the address on a Monad explorer (monadscan.com) before sending value. A wrong address loses funds. The verification recipe below is one bash line.
zerion swap monad <amount> <0x-from> <0x-to>— same-chain swap on Monad with explicit token addresseszerion bridge <chain> <token> <amount> monad <0x-to>— bridge into Monad targeting a token by addresszerion send <0x-token-or-symbol> <amount> --to <0x...> --chain monad— ERC-20 transfer on Monadzerion sign-typed-data --file permit.json --chain monad— sign a Permit2 EIP-712 message against the canonical Permit2 deploymentcast code <addr> --rpc-url https://rpc.monad.xyz— verify a contract has bytecode on Monad mainnet (Foundry)
- Zerion CLI:
npm install -g zerion-cli - Zerion API key:
export ZERION_API_KEY="zk_..."(analysis + trading need this; pay-per-call does not apply on Monad swaps) - Optional: Foundry for the
cast codeverification recipe
Tables are organized by what Zerion CLI users actually pass as token arguments — bridged stablecoins, wrapped native, and signing-protocol contracts. The full canonical-contracts list lives in Monad's official network info.
# Mainnet
cast code 0x754704Bc059F8C67012fEd69BC8A327a5aafb603 --rpc-url https://rpc.monad.xyz
# Or without Foundry — JSON-RPC eth_getCode:
curl -s https://rpc.monad.xyz \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getCode","params":["0x754704Bc059F8C67012fEd69BC8A327a5aafb603","latest"],"id":1}'A non-empty 0x… response confirms code is deployed. 0x (empty) means the address is an EOA or has no code on that network — do not use it.
# Swap USDC → MON on Monad using the explicit USDC address
zerion swap monad 5 0x754704Bc059F8C67012fEd69BC8A327a5aafb603 MON
# Bridge USDC from Base into USDT0 on Monad
zerion bridge base USDC 5 monad 0xe7cd86e13AC4309349F30B3435a9d337750fC82D
# Send WMON to a recipient
zerion send 0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A 0.5 \
--to 0x... --chain monadIf the token an agent needs is not in the curated tables below, look it up in the official Monad token list — a Uniswap-style tokens[] array maintained at https://github.com/monad-crypto/token-list.
# Mainnet — find a token by symbol or name
curl -s https://raw.githubusercontent.com/monad-crypto/token-list/main/tokenlist-mainnet.json \
| jq '.tokens[] | select(.symbol == "WETH")'
# Testnet
curl -s https://raw.githubusercontent.com/monad-crypto/token-list/main/tokenlist-testnet.json \
| jq '.tokens[] | select(.symbol == "USDC")'Each entry has { symbol, name, address, decimals, chainId, logoURI }. Pull address and pass it to zerion swap / bridge / send. Still verify with cast code (above) before sending value.
| Symbol | Name | Address |
|---|---|---|
| USDC | USD Coin | 0x754704Bc059F8C67012fEd69BC8A327a5aafb603 |
| USDT0 | Tether USD | 0xe7cd86e13AC4309349F30B3435a9d337750fC82D |
| USD1 | USD1 | 0x111111d2bf19e43C34263401e0CAd979eD1cdb61 |
| AUSD | Agora USD | 0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a |
| Symbol | Name | Address |
|---|---|---|
| WMON | Wrapped MON | 0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A |
Native MON has no contract address — pass MON as a symbol to zerion swap / send. Use WMON when an ERC-20 representation is required (LP positions, contracts that don't accept value).
| Contract | Address |
|---|---|
| Permit2 | 0x000000000022d473030f116ddee9f6b43ac78ba3 |
| ERC-4337 EntryPoint v0.6 | 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 |
| ERC-4337 EntryPoint v0.7 | 0x0000000071727De22E5E9d8BAf0edAc6f37da032 |
| ERC-6492 UniversalSigValidator | 0xdAcD51A54883eb67D95FAEb2BBfdC4a9a6BD2a3B |
When building an EIP-712 typed-data payload that targets Permit2 on Monad, the domain.verifyingContract is 0x000000000022d473030f116ddee9f6b43ac78ba3 and domain.chainId is 143. Pipe the JSON to zerion sign-typed-data --chain monad.
| Contract | Address |
|---|---|
| Multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 |
| Safe (singleton) | 0x69f4D1788e39c87893C980c06EdF4b7f686e2938 |
| SafeL2 (singleton) | 0xfb1bffC9d739B8D520DaF37dF666da4C687191EA |
| MultiSendCallOnly | 0xA1dabEF33b3B82c7814B6D82A79e50F4AC44102B |
Use Safe + Zerion agent tokens together when a Monad bot wallet needs both multi-party authorization (Safe owners) and per-call policy enforcement (Zerion agent create-policy --chains monad …).
These are the swap/aggregation entry points an agent transaction actually touches. Pair them with zerion agent create-policy --allowlist <addr> to lock a Monad agent token to specific protocols, so the bot can only route through DEXes you trust.
# Example — Kuru-only swap bot on Monad
zerion agent create-policy --name kuru-only \
--chains monad \
--allowlist 0xd651346d7c789536ebf06dc72ae3c8502cd695cc \
--deny-transfersSourced from https://github.com/monad-crypto/protocols (protocols-mainnet.csv). The full per-protocol JSON files live under mainnet/<protocol>.json in the same repo. These are community-maintained — verify with cast code before relying on any single address.
| Protocol | Contract | Address |
|---|---|---|
| Kuru | Router | 0xd651346d7c789536ebf06dc72ae3c8502cd695cc |
| Monorail | AggregationRouter | 0xa68a7f0601effdc65c64d9c47ca1b18d96b4352c |
| KyberSwap | MetaAggregationRouterV2 | 0x6131b5fae19ea4f9d964eac0408e4408b66337b5 |
| Mace | MaceRouter | 0x6f05a0746a8cb5c7de5af1568c8d020dbb521b23 |
| Fly Trade (Magpie) | MagpieRouterV3_1 | 0x956df8424b556f0076e8abf5481605f5a791cc7f |
| Madhouse | Aggregator | 0x6017684bea9cb6e9874fc6dba4438271ebf9f5da |
| OKX Wallet | Router | 0xb1e4e25b1938c78ec0b21ccb2d6a0be60aa7e63f |
| Gmgn | Router | 0xc9ca80b5ea956afa98627963d1880033545d108e |
| Protocol | Contract | Address |
|---|---|---|
| Uniswap | UniversalRouter | 0x0d97dc33264bfc1c226207428a79b26757fb9dc3 |
| PancakeSwap | SmartRouter | 0x21114915ac6d5a2e156931e20b20b038ded0be7c |
| Curve | Router | 0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1 |
| Balancer | Router | 0x9da18982a33fd0c7051b19f0d7c76f2d5e7e017c |
| LFJ (Trader Joe) | LBRouter | 0x18556da13313f3532c54711497a8fedac273220e |
| WooFi | WooRouterV2 | 0x4c4af8dbc524681930a27b2f1af5bcc8062e6fb7 |
| Clober | Router | 0x7b58a24c5628881a141d630f101db433d419b372 |
| Dexalot | DexalotRouter | 0x3d3e4f0523500f95039d0fe600acf2ade4b06eb9 |
| Protocol | Contract | Address |
|---|---|---|
| Bungee | BungeeGateway | 0x1a2f1085a94de6fbcc334aae1ddf527c567b75e7 |
| Relay (v3) | v3RelayRouter | 0xb92fe925dc43a0ecde6c8b1a2709c170ec4fff4f |
| Relay (v2.1) | v2.1RelayRouter | 0x3ec130b627944cad9b2750300ecb0a695da522b6 |
The protocols repo has 1400+ contract entries across 60+ DEXes, lending markets, perps, and bridges. To find a router for a protocol not listed above:
# Filter the summary CSV by protocol name
curl -s https://raw.githubusercontent.com/monad-crypto/protocols/main/protocols-mainnet.csv \
| awk -F, -v p='Aave' 'tolower($1) ~ tolower(p) { print }'
# Or read the per-protocol JSON
curl -s https://raw.githubusercontent.com/monad-crypto/protocols/main/mainnet/aave.json | jq .addresses| Contract | Address |
|---|---|
| IdentityRegistry | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 |
| ReputationRegistry | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 |
Agents that register an on-chain identity via ERC-8004 can pair the registration with a scoped Zerion agent token (zerion agent create-token --wallet <bot> --policy <monad-only-policy>) to bind off-chain operating credentials to the on-chain identity.
- Wrong network. Mainnet and testnet share some canonicals (Multicall3, Permit2, ERC-8004) but bridged stablecoin addresses differ. Always verify with
cast codeagainst the RPC for the network you intend to use (https://rpc.monad.xyzfor mainnet). - Address looks right but
eth_getCodereturns0x. The contract isn't deployed on that network. Stop and re-source the address frommonadscan.com. - Symbol clash. Multiple "USDC" tokens may exist as bridged variants. Prefer passing the explicit address from the table over the symbol when value is at stake.
unsupported_chainfrom Zerion CLI. Confirmmonadappears inzerion chains. If not, updatezerion-clito the latest release.
- zerion-trading —
swap,bridge,sendon Monad with these addresses - zerion-sign — EIP-712 signing against Permit2 on Monad
- zerion-analyze —
zerion analyze <addr> --chain monadto inspect any address before interacting - zerion-agent-management — chain-locked policies (
--chains monad) for Monad-only agent tokens