Repository navigation
v0.2.0 — Unichain, Monad, X Layer, World Chain and Zora
Five chains join the wrapped-native registry, taking it from 8 entries to 13. This is purely
additive: no signature changes, and a caller who never touches these chain ids sees nothing
different.
Added
ERC20Toolkit.for_chain() — and with it wrap_native / unwrap_native — now works on:
| chain id | name | wrapped | ticker |
|---|---|---|---|
| 130 | Unichain | WETH | ETH |
| 143 | Monad | WMON | MON |
| 196 | X Layer | WOKB | OKB |
| 480 | World Chain | WETH | ETH |
| 7777777 | Zora | WETH | ETH |
Every address was verified against the live chain before it landed, using the package's own
criteria: contract bytecode present, symbol() matches the expected wrapped ticker, decimals()
is 18, and both deposit() and withdraw(uint256) are present in the deployed code. None is a
proxy. Nothing was copied from a token list or a block explorer.
EOA callers (tx_mode="eoa") and smart-account callers (tx_mode="calls" — ERC-4337, Safe,
ERC-7579) gain these equally.
Changed
The bundled RPC endpoints are now documented for what they are. They are free public gateways,
shared by every user of this package, offered with no availability guarantee. They exist so
for_chain(1) works in one line while you are trying the library out. Anything beyond that should
pass its own endpoint and treat the bundled value as a fallback:
ERC20Toolkit.for_chain(1, rpc_url="https://your-node")
ERC20Toolkit(rpc_url="https://your-node")for_chain() now says so when a bundled endpoint is down. Falling back to an unreachable
bundled gateway raises a ToolException naming the endpoint and the fix, instead of a bare
ConnectionError that identified neither. A caller who passed their own rpc_url is unaffected
and still receives the original error.
scripts/verify_networks.py now fails an entry that carries no wrapped-native address, and retries
an endpoint before reporting it unreachable — a single-attempt probe produced two false negatives
during this work, on endpoints that were healthy and recovered on their own.
Notes
Unichain, World Chain and Zora share 0x4200000000000000000000000000000000000006 with Base and
Optimism. That is not a copy-paste error: all five are OP Stack chains using the same
deterministic predeploy, and each was verified independently at a different block height and total
supply.
Celo (42220) remains deliberately absent. CELO is natively an ERC-20 with no wrapping step, so
wrap_native has no meaning there and for_chain(42220) fails loudly rather than inventing an
address. This package still ships no general token registry, for the same reason it never has: a
wrong address in one is a silent, unrecoverable loss of funds. Pass your own via tokens={...}.
Full changelog: v0.1.0...v0.2.0