Pular para o conteúdo principal
Change page

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;
2
3/**
4 * @title ERC1363
5 * @dev Uma interface de extensão para tokens ERC-20 que suporta a execução de código em um contrato receptor
6 * 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 */
19
20 /**
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);
28
29 /**
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);
38
39 /**
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);
48
49 /**
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);
59
60 /**
61 * @dev Define uma quantidade de tokens de `value` como a permissão (allowance) de `spender` sobre os tokens do chamador
62 * 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);
68
69 /**
70 * @dev Define uma quantidade de tokens de `value` como a permissão (allowance) de `spender` sobre os tokens do chamador
71 * 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}
79
80interface 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}
90
91interface ERC165 {
92 function supportsInterface(bytes4 interfaceId) external view returns (bool);
93}
Exibir tudo

Um contrato inteligente que queira aceitar tokens ERC-1363 via transferAndCall ou transferFromAndCall DEVE implementar a interface ERC1363Receiver:

1/**
2 * @title ERC1363Receiver
3 * @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 retornar
11 * `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 tudo

Um contrato inteligente que queira aceitar tokens ERC-1363 via approveAndCall DEVE implementar a interface ERC1363Spender:

1/**
2 * @title ERC1363Spender
3 * @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 retornar
11 * `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

Leitura adicional

Este artigo foi útil?