Los estándares ERC definen interfaces comunes para contratos de tokens en Ethereum. Su adopción permite que billeteras, exchanges y otras dapps interactúen con cualquier implementación compatible sin conocer su código interno.
ERC-20: activos fungibles
EIP-20 establece el contrato de referencia para tokens fungibles, donde cada unidad es idéntica e intercambiable. La interfaz mínima incluye métodos para consultar metadatos, saldos, transferencias y autorizaciones de gasto.
interface IFungibleToken {
// Metadatos
function name() external view returns (string memory tokenName);
function symbol() external view returns (string memory tokenSymbol);
function decimals() external view returns (uint8 precision);
// Suministro y saldos
function totalSupply() external view returns (uint256 maxSupply);
function balanceOf(address account) external view returns (uint256 accountBalance);
// Transferencias directas
function transfer(address recipient, uint256 amount) external returns (bool success);
// Transferencias delegadas
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool success);
function approve(address spender, uint256 amount) external returns (bool success);
function allowance(address owner, address spender) external view returns (uint256 remainingAmount);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
decimals indica la cantidad de posiciones decimales: si vale 18, una unidad mínima representa 10⁻¹⁸ tokens. approve autoriza a un tercero a mover fondos desde la cuenta del llamante, mientras que transferFrom ejecuta ese movimiento previa autorización.
ERC-721: activos no fungibles
EIP-721 modela tokens únicos e indivisibles. Cada activo se identifica mediante un uint256 distinto y cuenta con un único propietario, lo que permite representar objetos de colección, identidades digitales o derechos de propiedad.
interface INonFungibleToken {
// Consulta de propiedad
function balanceOf(address holder) external view returns (uint256 ownedCount);
function ownerOf(uint256 assetId) external view returns (address currentOwner);
// Autorizaciones
function approve(address delegate, uint256 assetId) external payable;
function getApproved(uint256 assetId) external view returns (address delegate);
function setApprovalForAll(address operator, bool authorized) external;
function isApprovedForAll(address holder, address operator) external view returns (bool approved);
// Transferencias
function transferFrom(address currentOwner, address newOwner, uint256 assetId) external payable;
function safeTransferFrom(address currentOwner, address newOwner, uint256 assetId) external payable;
function safeTransferFrom(address currentOwner, address newOwner, uint256 assetId, bytes calldata extraData) external payable;
// Metadatos
function name() external view returns (string memory collectionName);
function symbol() external view returns (string memory collectionSymbol);
function tokenURI(uint256 assetId) external view returns (string memory resourceLocation);
// Enumerabilidad
function totalSupply() external view returns (uint256 issuedCount);
function tokenByIndex(uint256 index) external view returns (uint256 assetId);
function tokenOfOwnerByIndex(address holder, uint256 index) external view returns (uint256 assetId);
event Transfer(address indexed previousOwner, address indexed newOwner, uint256 indexed assetId);
event Approval(address indexed assetOwner, address indexed approvedAccount, uint256 indexed assetId);
event ApprovalForAll(address indexed assetOwner, address indexed authorizedOperator, bool approved);
}
Las variantes safeTransferFrom verifican que el destinatario sea una cuenta externa o un contrato que implemente IERC721Receiver, evitando así la pérdida accidental de activos en direcciones que no pueden gestionarlos.
Otros estándares relevantes
- ERC-1155: contratos multi-token que gestionan tanto activos fungibles como no fungibles dentro de una misma implementación, reduciendo costes de despliegue y transferencia.
- ERC-918: especificación para tokens minables mediante prueba de trabajo dentro del propio contrato.
- ERC-888 y ERC-1178: propuestas orientadas a representar múltiples clases de activos y balances multidimensionales.
- ERC-874: propuesta cerrada que exploraba mecanismos de transferencia con pesos no fungibles.