Chains & tokens
This table is generated from the same chain registry the DuckyPay signer and contracts build against — it cannot drift from what the API actually accepts.
Supported networks#
Pass the chainId when creating a charge. Test keys work only on testnets; live keys only on mainnets.
| Network | chainId | Default token | Status |
|---|
| Polygon — primary | 137 | USDT | Live |
| Base | 8453 | USDC | Coming soon |
| Arbitrum One | 42161 | USDC | Coming soon |
| Polygon Amoy | 80002 | USDC | Testnet |
Omit token in a charge and the chain’s default token is used. Networks marked “coming soon” are wired in the registry but not yet accepting charges.
Token contracts#
Only issuer-native stablecoin contracts are supported — never bridged variants. Verify against these addresses before telling a buyer where to send funds.
Polygon (137)
| Token | Contract address | Decimals |
|---|
USDT | 0xc2132D05D31c914a87C6611C10748AEb04B58e8F | 6 |
USDC | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 | 6 |
Base (8453)
| Token | Contract address | Decimals |
|---|
USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 6 |
Arbitrum One (42161)
| Token | Contract address | Decimals |
|---|
USDC | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | 6 |
Polygon Amoy (80002)
| Token | Contract address | Decimals |
|---|
USDC (test token) | 0x34D9bb299F95FA778E7e48a102c1D6D3fe8Ad14A | 6 |
Token policy#
- Standard stablecoins only. Fee-on-transfer and rebasing tokens are not supported — the atomic split assumes 1 unit sent is 1 unit received.
- Amounts in the API are strings in the token’s smallest unit (
10000000 = 10 USDT at 6 decimals). Use toBaseUnits() from @duckypay/node to convert safely. - Buyers must send the exact token on the exact chain — see the warning in Payment modes.