Chains & tokens
HashPay settles USDC and USDT across eight chains. The network and token ids below are the literal strings used everywhere in the API.
Supported networks
| Network | id | Family | Tokens | Decimals |
|---|---|---|---|---|
| Ethereum | ethereum | EVM | USDC · USDT | 6 |
| Base | base | EVM | USDC · USDT | 6 |
| Arbitrum | arbitrum | EVM | USDC · USDT | 6 |
| Polygon | polygon | EVM | USDC · USDT | 6 |
| Avalanche | avalanche | EVM | USDC · USDT | 6 |
| BNB Chain | bsc | EVM | USDC · USDT | 18 |
| Solana | solana | Solana | USDC · USDT | 6 |
| Tron | tron | Tron | USDT | 6 |
Token ids are usdc and usdt. Note Tron carries USDT only.
Token contracts
The exact contract (EVM/Tron) or SPL mint (Solana) HashPay watches for each pair. These are verified on-chain identities — handy if you reconcile against your own indexer.
| Network | Token | Contract / mint | Dec. |
|---|---|---|---|
| Ethereum | USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 6 |
| Ethereum | USDT | 0xdAC17F958D2ee523a2206206994597C13D831ec7 | 6 |
| Base | USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 6 |
| Base | USDT | 0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2 | 6 |
| Arbitrum | USDC | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | 6 |
| Arbitrum | USDT | 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 | 6 |
| Polygon | USDC | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 | 6 |
| Polygon | USDT | 0xc2132D05D31c914a87C6611C10748AEb04B58e8F | 6 |
| Avalanche | USDC | 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E | 6 |
| Avalanche | USDT | 0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7 | 6 |
| BNB Chain | USDC | 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d | 18 |
| BNB Chain | USDT | 0x55d398326f99059fF775485246999027B3197955 | 18 |
| Solana | USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | 6 |
| Solana | USDT | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB | 6 |
| Tron | USDT | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | 6 |
Amounts & decimals
Stablecoins are 6 decimals everywhere except BNB Chain, where they're 18. So "29.00" is 29000000 base units on Base but 29000000000000000000 on BNB Chain. Always pair amountBaseUnits with decimals; never hard-code 1e6. HashPay does the conversion, so the buyer always pays the correct USD figure.
Confirmation depths
A payment becomes CONFIRMED (and fires payment.confirmed) once its transfer is buried under this many confirmations — tuned per chain to its finality:
| Network | Confirmations | Why |
|---|---|---|
| Avalanche | 1 | Sub-second finality. |
| Base · Arbitrum | 5 | L2 soft confirmations. |
| Ethereum | 12 | Conventional safe depth. |
| BNB Chain | 15 | Faster blocks, deeper bury. |
| Tron | 19 | ≈ irreversibility threshold. |
| Polygon | 30 | Historically reorg-prone. |
| Solana | 32 | Finalized commitment. |
These are the defaults; an operator can override any chain with a <NETWORK>_CONFIRMATIONS environment variable (e.g. POLYGON_CONFIRMATIONS=50).
Address formats
When you add a receiving wallet, HashPay validates the address for its network:
| Family | Looks like |
|---|---|
| EVM (6 chains) | 0x + 40 hex characters |
| Tron | T + base58 |
| Solana | base58 (32–44 chars) |
EVM addresses are matched case-insensitively, so checksum casing never causes a miss. One address per chain handles unlimited concurrent payments — HashPay matches each by its exact amount.