Standard dei Token Pagabili ERC-1363
Ultimo aggiornamento della pagina: 4 aprile 2025
Introduzione
Cos'è l'ERC-1363?
L'ERC-1363 è un'interfaccia di estensione per i token ERC-20 che supporta l'esecuzione di logica personalizzata su un contratto ricevente dopo i trasferimenti, o su un contratto di spesa dopo le approvazioni, tutto all'interno di una singola transazione.
Differenze rispetto all'ERC-20
Le operazioni standard dell'ERC-20 come transfer, transferFrom e approve, non consentono l'esecuzione di codice sul contratto ricevente o di spesa senza una transazione separata.
Ciò introduce complessità nello sviluppo dell'interfaccia utente (UI) e attrito nell'adozione, poiché gli utenti devono attendere l'esecuzione della prima transazione per poi inviare la seconda.
Devono inoltre pagare il gas due volte.
L'ERC-1363 rende i token fungibili capaci di eseguire azioni più facilmente e di funzionare senza l'uso di alcun listener fuori catena. Consente di effettuare una callback su un contratto ricevente o di spesa, dopo un trasferimento o un'approvazione, in una singola transazione.
Prerequisiti
Per comprendere meglio questa pagina, ti consigliamo di leggere prima:
Corpo
L'ERC-1363 introduce un'API standard per i token ERC-20 per interagire con i contratti intelligenti dopo transfer, transferFrom o approve.
Questo standard fornisce funzionalità di base per trasferire token, oltre a consentire l'approvazione dei token in modo che possano essere spesi da un'altra terza parte on-chain, per poi effettuare una callback sul contratto ricevente o di spesa.
Ci sono molti usi proposti per i contratti intelligenti che possono accettare callback ERC-20.
Alcuni esempi potrebbero essere:
- Crowdsale: i token inviati innescano l'allocazione istantanea delle ricompense.
- Servizi: il pagamento attiva l'accesso al servizio in un solo passaggio.
- Fatture: i token saldano le fatture automaticamente.
- Abbonamenti: l'approvazione della tariffa annuale attiva l'abbonamento con il pagamento del primo mese.
Per questi motivi è stato originariamente chiamato "Token Pagabile".
Il comportamento della callback espande ulteriormente la sua utilità, consentendo interazioni fluide come:
- Staking: i token trasferiti innescano il blocco automatico in un contratto di staking.
- Votazione: i token ricevuti registrano i voti in un sistema di governance.
- Scambio: le approvazioni dei token attivano la logica di scambio in un singolo passaggio.
I token ERC-1363 possono essere utilizzati per utilità specifiche in tutti i casi che richiedono l'esecuzione di una callback dopo un trasferimento o un'approvazione ricevuta. L'ERC-1363 è utile anche per evitare la perdita o il blocco dei token nei contratti intelligenti verificando la capacità del destinatario di gestire i token.
A differenza di altre proposte di estensione dell'ERC-20, l'ERC-1363 non sovrascrive i metodi transfer e transferFrom dell'ERC-20 e definisce gli ID delle interfacce da implementare mantenendo la retrocompatibilità con l'ERC-20.
Dall'EIP-1363 (opens in a new tab):
Metodi
I contratti intelligenti che implementano lo standard ERC-1363 DEVONO implementare tutte le funzioni nell'interfaccia ERC1363, così come le interfacce ERC20 e ERC165.
1pragma solidity ^0.8.0;23/* *4 * @title ERC13635 * @dev Un'interfaccia di estensione per i token ERC-20 che supporta l'esecuzione di codice su un contratto destinatario6 * dopo `transfer` o `transferFrom`, o di codice su un contratto spenditore dopo `approve`, in una singola transazione. */789101112interface ERC1363 is ERC20, ERC165 {13 /* * NOTE: l'identificatore ERC-165 per questa interfaccia è 0xb0202a11.14 * 0xb0202a11 ===15 * bytes4(keccak256('transferAndCall(address,uint256)')) ^16 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^17 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^18 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^19 * bytes4(keccak256('approveAndCall(address,uint256)')) ^20 * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */21 2223242526272829303132 /* *33 * @dev Sposta una quantità `value` di token dall'account del chiamante a `to`34 * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`.35 * @param to L'indirizzo a cui vengono trasferiti i token.36 * @param value La quantità di token da trasferire.37 * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */38 39404142434445 function transferAndCall(address to, uint256 value) external returns (bool);4647 /* *48 * @dev Sposta una quantità `value` di token dall'account del chiamante a `to`49 * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`.50 * @param to L'indirizzo a cui vengono trasferiti i token.51 * @param value La quantità di token da trasferire.52 * @param data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `to`.53 * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */54 5556575859606162 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);6364 /* *65 * @dev Sposta una quantità `value` di token da `from` a `to` utilizzando il meccanismo di allowance66 * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`.67 * @param from L'indirizzo da cui inviare i token.68 * @param to L'indirizzo a cui vengono trasferiti i token.69 * @param value La quantità di token da trasferire.70 * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */71 7273747576777879 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);8081 /* *82 * @dev Sposta una quantità `value` di token da `from` a `to` utilizzando il meccanismo di allowance83 * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`.84 * @param from L'indirizzo da cui inviare i token.85 * @param to L'indirizzo a cui vengono trasferiti i token.86 * @param value La quantità di token da trasferire.87 * @param data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `to`.88 * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */89 909192939495969798 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);99100 /* *101 * @dev Imposta una quantità `value` di token come allowance di `spender` sui token del chiamante102 * e poi chiama `ERC1363Spender::onApprovalReceived` su `spender`.103 * @param spender L'indirizzo che spenderà i fondi.104 * @param value La quantità di token da spendere.105 * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */106 107108109110111112113 function approveAndCall(address spender, uint256 value) external returns (bool);114115 /* *116 * @dev Imposta una quantità `value` di token come allowance di `spender` sui token del chiamante117 * e poi chiama `ERC1363Spender::onApprovalReceived` su `spender`.118 * @param spender L'indirizzo che spenderà i fondi.119 * @param value La quantità di token da spendere.120 * @param data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `spender`.121 * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */122 123124125126127128129130 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);131}132133interface ERC20 {134 event Transfer(address indexed from, address indexed to, uint256 value);135 event Approval(address indexed owner, address indexed spender, uint256 value);136 function transfer(address to, uint256 value) external returns (bool);137 function transferFrom(address from, address to, uint256 value) external returns (bool);138 function approve(address spender, uint256 value) external returns (bool);139 function totalSupply() external view returns (uint256);140 function balanceOf(address account) external view returns (uint256);141 function allowance(address owner, address spender) external view returns (uint256);142}143144interface ERC165 {145 function supportsInterface(bytes4 interfaceId) external view returns (bool);146}Mostra tuttoUn contratto intelligente che desidera accettare token ERC-1363 tramite transferAndCall o transferFromAndCall DEVE implementare l'interfaccia ERC1363Receiver:
1/* *2 * @title ERC1363Receiver3 * @dev Interfaccia per qualsiasi contratto che desidera supportare `transferAndCall` o `transferFromAndCall` dai contratti token ERC-1363. */45678interface ERC1363Receiver {9 /* *10 * @dev Ogni volta che i token ERC-1363 vengono trasferiti a questo contratto tramite `ERC1363::transferAndCall` o `ERC1363::transferFromAndCall`11 * da `operator` da `from`, viene chiamata questa funzione.12 *13 * NOTE: Per accettare il trasferimento, questa deve restituire14 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`15 * (cioè 0x88a7ca5c, o il proprio selettore di funzione).16 *17 * @param operator L'indirizzo che ha chiamato la funzione `transferAndCall` o `transferFromAndCall`.18 * @param from L'indirizzo da cui vengono trasferiti i token.19 * @param value La quantità di token trasferiti.20 * @param data Dati aggiuntivi senza formato specificato.21 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` se il trasferimento è consentito a meno che non venga lanciata un'eccezione. */22 2324252627282930313233343536 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);37}Mostra tuttoUn contratto intelligente che desidera accettare token ERC-1363 tramite approveAndCall DEVE implementare l'interfaccia ERC1363Spender:
1/* *2 * @title ERC1363Spender3 * @dev Interfaccia per qualsiasi contratto che desidera supportare `approveAndCall` dai contratti token ERC-1363. */45678interface ERC1363Spender {9 /* *10 * @dev Ogni volta che un `owner` di token ERC-1363 approva questo contratto tramite `ERC1363::approveAndCall`11 * per spendere i propri token, viene chiamata questa funzione.12 *13 * NOTE: Per accettare l'approvazione, questa deve restituire14 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`15 * (cioè 0x7b04a2d0, o il proprio selettore di funzione).16 *17 * @param owner L'indirizzo che ha chiamato la funzione `approveAndCall` e che in precedenza possedeva i token.18 * @param value La quantità di token da spendere.19 * @param data Dati aggiuntivi senza formato specificato.20 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` se l'approvazione è consentita a meno che non venga lanciata un'eccezione. */21 22232425262728293031323334 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);35}Mostra tutto