¿Qué es un conversor de decimales de tokens?
Un conversor de decimales de tokens traduce entre el entero bruto que almacena un contrato de token y el importe legible que muestra una billetera, usando el valor decimals del token: importe = bruto ÷ 10decimales. Los contratos ERC-20 y TRC-20 lo exponen mediante decimals(); un mint SPL lo guarda en la cuenta mint. USDT y USDC usan 6, WBTC 8, y los tokens tipo ETH 18.
Decimales de tokens habituales
| Token | Decimales | 1 token como entero bruto |
|---|---|---|
| USDT (Ethereum, Tron, Solana, Polygon, Arbitrum) | 6 | 1,000,000 |
| USDC (todas las cadenas principales) | 6 | 1,000,000 |
| USDT en BNB Smart Chain (Binance-Peg) | 18 | 1,000,000,000,000,000,000 |
| WBTC, cbBTC | 8 | 100,000,000 |
| ETH, WETH, DAI, LINK, UNI, AAVE | 18 | 1,000,000,000,000,000,000 |
| SOL y la mayoría de tokens SPL | 9 | 1,000,000,000 |
| GUSD | 2 | 100 |
Cómo funciona la conversión
legible = bruto ÷ 10decimales y bruto = legible × 10decimales. La trampa está en la precisión: los valores de 18 decimales superan lo que puede representar un número de coma flotante, así que esta página usa enteros de precisión arbitraria. Introducir más decimales de los que admite el token se rechaza, porque la cadena no puede representar ese importe.
Ejemplo práctico
Un evento Transfer de ERC-20 muestra value = 2500000. Si el token es USDC (6 decimales), son 2.5 USDC. Si el mismo número viniera de una transferencia de DAI (18 decimales), serían 0.0000000000025 DAI, una cantidad de polvo. En sentido contrario, para enviar 0.0025 WBTC (8 decimales) el argumento de transfer debe ser 0.0025 × 108 = 250,000, y enviar 1 LINK (18 decimales) requiere 1,000,000,000,000,000,000.
Errores comunes
- Dar por hecho 18. Codificar a mano 1018 convierte un pago de 100 USDC en 0.0000000001 USDC. Lee
decimals()del contrato. - Fiarse del símbolo. Los tokens puenteados con el mismo ticker pueden usar decimales distintos en cadenas distintas. Comprueba el contrato con el que realmente interactúas.
- Redondear antes de multiplicar. Convierte primero el importe legible al entero bruto y luego haz la aritmética con enteros; la coma flotante puede producir 2499999.9999 en lugar de 2500000.
En código
- ethers.js:
ethers.parseUnits("1.5", 6)→1500000n;ethers.formatUnits(1500000n, 6)→"1.5". - web3.py:
int(Decimal("1.5") * 10**6); evitafloat. - Solana web3.js: los importes en
createTransferInstructionson enteros brutos; multiplica por10 ** mint.decimalsusando BigInt.
Para monedas nativas consulta el conversor de unidades de Ethereum, el conversor de satoshi, el conversor de lamports y el conversor de sun.