Padrão de Token Pagável ERC-1363
Última atualização da página: 4 de abril de 2025
Introdução
O que é ERC-1363?
O ERC-1363 é uma interface de extensão para tokens ERC-20 que suporta a execução de lógica personalizada em um contrato receptor após transferências, ou em um contrato gastador após aprovações, tudo em uma única transação.
Diferenças do ERC-20
As operações padrão do ERC-20, como transfer, transferFrom e approve, não permitem a execução de código no contrato receptor ou gastador sem uma transação separada.
Isso introduz complexidade no desenvolvimento de UI e atrito na adoção, porque os usuários devem esperar a primeira transação ser executada para então enviar a segunda.
Eles também devem pagar GÁS duas vezes.
O ERC-1363 torna os tokens fungíveis capazes de realizar ações com mais facilidade e funcionar sem o uso de qualquer ouvinte off-chain. Ele permite fazer um callback em um contrato receptor ou gastador, após uma transferência ou aprovação, em uma única transação.
Pré-requisitos
Para entender melhor esta página, recomendamos que primeiro leia sobre:
Body
O ERC-1363 introduz uma API padrão para que os tokens ERC-20 interajam com contratos inteligentes após transfer, transferFrom ou approve.
Este padrão fornece a funcionalidade básica para transferir tokens, bem como permite que os tokens sejam aprovados para que possam ser gastos por um terceiro on-chain, e em seguida, fazer um callback no contrato receptor ou gastador.
Existem muitos usos propostos para contratos inteligentes que podem aceitar callbacks de ERC-20.
Alguns exemplos são:
- Vendas coletivas: os tokens enviados acionam a alocação instantânea de recompensas.
- Serviços: o pagamento ativa o acesso ao serviço em uma única etapa.
- Faturas: os tokens liquidam faturas automaticamente.
- Assinaturas: a aprovação da taxa anual ativa a assinatura com o pagamento do primeiro mês.
Por essas razões, ele foi originalmente nomeado "Payable Token".
O comportamento de callback expande ainda mais sua utilidade, permitindo interações perfeitas como:
- Staking: os tokens transferidos acionam o bloqueio automático em um contrato de staking.
- Votação: os tokens recebidos registram votos em um sistema de governança.
- Troca: aprovações de token ativam a lógica de troca em uma única etapa.
Os tokens ERC-1363 podem ser usados para utilidades específicas em todos os casos que exigem a execução de um callback após o recebimento de uma transferência ou aprovação. O ERC-1363 também é útil para evitar a perda ou o bloqueio de tokens em contratos inteligentes, verificando a capacidade do destinatário de lidar com os tokens.
Diferentemente de outras propostas de extensão do ERC-20, o ERC-1363 não substitui os métodos transfer e transferFrom do ERC-20 e define os IDs das interfaces a serem implementadas, mantendo a retrocompatibilidade com o ERC-20.
De EIP-1363 (opens in a new tab):
Métodos
Os contratos inteligentes que implementam o padrão ERC-1363 DEVEM implementar todas as funções na interface ERC1363, bem como as interfaces ERC20 e ERC165.
1pragma solidity ^0.8.0;23/**4 * @title ERC13635 * @dev Uma interface de extensão para tokens ERC-20 que suporta a execução de código em um contrato receptor6 * após `transfer` ou `transferFrom`, ou código em um contrato gastador após `approve`, em uma única transação.7 */8interface ERC1363 is ERC20, ERC165 {9 /*10 * NOTA: o identificador ERC-165 para esta interface é 0xb0202a11.11 * 0xb0202a11 ===12 * bytes4(keccak256('transferAndCall(address,uint256)')) ^13 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^14 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^15 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^16 * bytes4(keccak256('approveAndCall(address,uint256)')) ^17 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))18 */1920 /**21 * @dev Move uma quantidade de tokens de `value` da conta do chamador para `to`22 * e então chama `ERC1363Receiver::onTransferReceived` em `to`.23 * @param to O endereço para o qual os tokens estão sendo transferidos.24 * @param value A quantidade de tokens a serem transferidos.25 * @return Um valor booleano que indica que a operação foi bem-sucedida, a menos que uma exceção seja lançada.26 */27 function transferAndCall(address to, uint256 value) external returns (bool);2829 /**30 * @dev Move uma quantidade de tokens de `value` da conta do chamador para `to`31 * e então chama `ERC1363Receiver::onTransferReceived` em `to`.32 * @param to O endereço para o qual os tokens estão sendo transferidos.33 * @param value A quantidade de tokens a serem transferidos.34 * @param data Dados adicionais sem formato especificado, enviados na chamada para `to`.35 * @return Um valor booleano que indica que a operação foi bem-sucedida, a menos que uma exceção seja lançada.36 */37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);3839 /**40 * @dev Move uma quantidade de tokens de `value` de `from` para `to` usando o mecanismo de permissão (allowance)41 * e então chama `ERC1363Receiver::onTransferReceived` em `to`.42 * @param from O endereço do qual os tokens são enviados.43 * @param to O endereço para o qual os tokens estão sendo transferidos.44 * @param value A quantidade de tokens a serem transferidos.45 * @return Um valor booleano que indica que a operação foi bem-sucedida, a menos que uma exceção seja lançada.46 */47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);4849 /**50 * @dev Move uma quantidade de tokens de `value` de `from` para `to` usando o mecanismo de permissão (allowance)51 * e então chama `ERC1363Receiver::onTransferReceived` em `to`.52 * @param from O endereço do qual os tokens são enviados.53 * @param to O endereço para o qual os tokens estão sendo transferidos.54 * @param value A quantidade de tokens a serem transferidos.55 * @param data Dados adicionais sem formato especificado, enviados na chamada para `to`.56 * @return Um valor booleano que indica que a operação foi bem-sucedida, a menos que uma exceção seja lançada.57 */58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);5960 /**61 * @dev Define uma quantidade de tokens de `value` como a permissão (allowance) de `spender` sobre os tokens do chamador62 * e então chama `ERC1363Spender::onApprovalReceived` em `spender`.63 * @param spender O endereço que gastará os fundos.64 * @param value A quantidade de tokens a serem gastos.65 * @return Um valor booleano que indica que a operação foi bem-sucedida, a menos que uma exceção seja lançada.66 */67 function approveAndCall(address spender, uint256 value) external returns (bool);6869 /**70 * @dev Define uma quantidade de tokens de `value` como a permissão (allowance) de `spender` sobre os tokens do chamador71 * e então chama `ERC1363Spender::onApprovalReceived` em `spender`.72 * @param spender O endereço que gastará os fundos.73 * @param value A quantidade de tokens a serem gastos.74 * @param data Dados adicionais sem formato especificado, enviados na chamada para `spender`.75 * @return Um valor booleano que indica que a operação foi bem-sucedida, a menos que uma exceção seja lançada.76 */77 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);78}7980interface ERC20 {81 event Transfer(address indexed from, address indexed to, uint256 value);82 event Approval(address indexed owner, address indexed spender, uint256 value);83 function transfer(address to, uint256 value) external returns (bool);84 function transferFrom(address from, address to, uint256 value) external returns (bool);85 function approve(address spender, uint256 value) external returns (bool);86 function totalSupply() external view returns (uint256);87 function balanceOf(address account) external view returns (uint256);88 function allowance(address owner, address spender) external view returns (uint256);89}9091interface ERC165 {92 function supportsInterface(bytes4 interfaceId) external view returns (bool);93}Exibir tudoUm contrato inteligente que queira aceitar tokens ERC-1363 via transferAndCall ou transferFromAndCall DEVE implementar a interface ERC1363Receiver:
1/**2 * @title ERC1363Receiver3 * @dev Interface para qualquer contrato que queira suportar `transferAndCall` ou `transferFromAndCall` de contratos de token ERC-1363.4 */5interface ERC1363Receiver {6 /**7 * @dev Sempre que tokens ERC-1363 são transferidos para este contrato via `ERC1363::transferAndCall` ou `ERC1363::transferFromAndCall`8 * por `operator` de `from`, esta função é chamada.9 *10 * NOTA: Para aceitar a transferência, esta função deve retornar11 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`12 * (ou seja, 0x88a7ca5c, ou seu próprio seletor de função).13 *14 * @param operator O endereço que chamou a função `transferAndCall` ou `transferFromAndCall`.15 * @param from O endereço do qual os tokens são transferidos.16 * @param value A quantidade de tokens transferidos.17 * @param data Dados adicionais sem formato especificado.18 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` se a transferência for permitida, a menos que uma exceção seja lançada.19 */20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);21}Exibir tudoUm contrato inteligente que queira aceitar tokens ERC-1363 via approveAndCall DEVE implementar a interface ERC1363Spender:
1/**2 * @title ERC1363Spender3 * @dev Interface para qualquer contrato que queira dar suporte a `approveAndCall` de contratos de token ERC-1363.4 */5interface ERC1363Spender {6 /**7 * @dev Sempre que o `owner` (dono) de um token ERC-1363 aprova este contrato via `ERC1363::approveAndCall`8 * para gastar seus tokens, esta função é chamada.9 *10 * NOTA: Para aceitar a aprovação, esta função deve retornar11 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`12 * (ou seja, 0x7b04a2d0, ou seu próprio seletor de função).13 *14 * @param owner O endereço que chamou a função `approveAndCall` e que anteriormente possuía os tokens.15 * @param value A quantidade de tokens a ser gasta.16 * @param data Dados adicionais sem formato especificado.17 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` se a aprovação for permitida, a menos que uma exceção seja lançada.18 */19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);20}Exibir tudo