MolnPayDocs
Concepts

Money representation

Every amount is a decimal string, and USDT/USDC on BSC have 18 decimals. Read this twice.

Every amount is a decimal STRING. Never a JSON number.

1 ETH is 1000000000000000000 wei, which is larger than JavaScript's Number.MAX_SAFE_INTEGER (2^53 ≈ 9.007e15). Parsing it as a number silently corrupts it. Use BigInt, decimal.Decimal, BigDecimal — whatever your language offers — end to end.

Every balance is returned in both forms so you never have to convert yourself:

{
  "asset": { "chain": "bsc", "symbol": "USDT", "decimals": 18, "contract": "0x55d3…" },
  "available": "1500000000000000000",
  "available_decimal": "1.5",
  "locked": "0",
  "total": "1500000000000000000"
}

⚠ USDT and USDC on BSC have 18 decimals. Everywhere else, 6.

This is a real property of those token contracts, not our choice.

ChainUSDT decimals"1000000" means
Ethereum, Tron, Solana, Polygon, Arbitrum, Base, Avalanche, TON61 USDT
BSC180.000000000001 USDT

Because getting this wrong is a 12-orders-of-magnitude error, POST /v1/payouts requires you to echo the asset's decimals and returns 400 decimals_mismatch (with both values) if it disagrees. Read decimals from GET /v1/chains. Never hardcode 6.

On this page