Standard tokenów płatnych ERC-1363
Strona ostatnio zaktualizowana: 4 kwietnia 2025
Wprowadzenie
Czym jest ERC-1363?
ERC-1363 to rozszerzony interfejs dla tokenów ERC-20, który umożliwia wykonanie niestandardowej logiki w kontrakcie odbiorcy po transferach lub w kontrakcie wydającego po zatwierdzeniach, a wszystko to w ramach jednej transakcji.
Różnice w stosunku do ERC-20
Standardowe operacje ERC-20, takie jak transfer, transferFrom i approve, nie pozwalają na wykonanie kodu w kontrakcie odbiorcy lub wydającego bez oddzielnej transakcji.
Wprowadza to złożoność w tworzeniu interfejsu użytkownika i utrudnia adaptację, ponieważ użytkownicy muszą czekać na wykonanie pierwszej transakcji, a następnie przesłać drugą.
Muszą również dwukrotnie zapłacić za GAZ.
ERC-1363 sprawia, że tokeny zamienne mogą łatwiej wykonywać działania i działać bez użycia jakiegokolwiek nasłuchiwacza off-chain. Pozwala to na wykonanie wywołania zwrotnego w kontrakcie odbiorcy lub wydającego po transferze lub zatwierdzeniu, w ramach jednej transakcji.
Wymagania wstępne
Aby lepiej zrozumieć tę stronę, zalecamy najpierw przeczytać o:
Treść
ERC-1363 wprowadza standardowe API dla tokenów ERC-20 do interakcji z inteligentnymi kontraktami po operacjach transfer, transferFrom lub approve.
Standard ten zapewnia podstawową funkcjonalność transferu tokenów, a także umożliwia zatwierdzanie tokenów, aby mogły być wydawane przez inną stronę trzecią on-chain, a następnie wykonanie wywołania zwrotnego w kontrakcie odbiorcy lub wydającego.
Istnieje wiele proponowanych zastosowań inteligentnych kontraktów, które mogą akceptować wywołania zwrotne ERC-20.
Przykłady:
- Crowdsale: wysłane tokeny powodują natychmiastową alokację nagród.
- Usługi: płatność aktywuje dostęp do usługi w jednym kroku.
- Faktury: tokeny automatycznie regulują faktury.
- Subskrypcje: zatwierdzenie rocznej stawki aktywuje subskrypcję wraz z płatnością za pierwszy miesiąc.
Z tych powodów pierwotnie nazwano go "Tokenem płatnym".
Zachowanie wywołania zwrotnego dodatkowo rozszerza jego użyteczność, umożliwiając płynne interakcje, takie jak:
- Staking: przetransferowane tokeny powodują automatyczną blokadę w kontrakcie stakingowym.
- Głosowanie: otrzymane tokeny rejestrują głosy w systemie zarządzania.
- Wymiana: zatwierdzenia tokenów aktywują logikę wymiany w jednym kroku.
Tokeny ERC-1363 mogą być używane do określonych zastosowań we wszystkich przypadkach, które wymagają wykonania wywołania zwrotnego po otrzymaniu transferu lub zatwierdzenia. ERC-1363 jest również przydatny do unikania utraty lub blokowania tokenów w inteligentnych kontraktach poprzez weryfikację zdolności odbiorcy do obsługi tokenów.
W przeciwieństwie do innych propozycji rozszerzeń ERC-20, ERC-1363 nie nadpisuje metod transfer i transferFrom z ERC-20 i definiuje ID interfejsów do zaimplementowania, zachowując wsteczną kompatybilność z ERC-20.
Na podstawie EIP-1363opens in a new tab:
Metody
Inteligentne kontrakty implementujące standard ERC-1363 MUSZĄ implementować wszystkie funkcje z interfejsu ERC1363, a także interfejsy ERC20 i ERC165.
1pragma solidity ^0.8.0;23/**4 * @title ERC13635 * @dev Interfejs rozszerzający dla tokenów ERC-20, który umożliwia wykonanie kodu w kontrakcie odbiorcy6 * po `transfer` lub `transferFrom` lub kodu w kontrakcie wydającego po `approve`, w ramach jednej transakcji.7 */8interface ERC1363 is ERC20, ERC165 {9 /*10 * UWAGA: identyfikator ERC-165 dla tego interfejsu to 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 Przenosi `value` tokenów z konta wywołującego do `to`,22 * a następnie wywołuje `ERC1363Receiver::onTransferReceived` na `to`.23 * @param to Adres, na który tokeny są przesyłane.24 * @param value Ilość tokenów do przesłania.25 * @return Wartość logiczna wskazująca, że operacja się powiodła, chyba że zostanie zgłoszony błąd.26 */27 function transferAndCall(address to, uint256 value) external returns (bool);2829 /**30 * @dev Przenosi `value` tokenów z konta wywołującego do `to`,31 * a następnie wywołuje `ERC1363Receiver::onTransferReceived` na `to`.32 * @param to Adres, na który tokeny są przesyłane.33 * @param value Ilość tokenów do przesłania.34 * @param data Dodatkowe dane bez określonego formatu, wysyłane w wywołaniu do `to`.35 * @return Wartość logiczna wskazująca, że operacja się powiodła, chyba że zostanie zgłoszony błąd.36 */37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);3839 /**40 * @dev Przenosi `value` tokenów z `from` do `to` za pomocą mechanizmu allowance41 * a następnie wywołuje `ERC1363Receiver::onTransferReceived` na `to`.42 * @param from Adres, z którego wysyłane są tokeny.43 * @param to Adres, na który tokeny są przesyłane.44 * @param value Ilość tokenów do przesłania.45 * @return Wartość logiczna wskazująca, że operacja się powiodła, chyba że zostanie zgłoszony błąd.46 */47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);4849 /**50 * @dev Przenosi `value` tokenów z `from` do `to` za pomocą mechanizmu allowance51 * a następnie wywołuje `ERC1363Receiver::onTransferReceived` na `to`.52 * @param from Adres, z którego wysyłane są tokeny.53 * @param to Adres, na który tokeny są przesyłane.54 * @param value Ilość tokenów do przesłania.55 * @param data Dodatkowe dane bez określonego formatu, wysyłane w wywołaniu do `to`.56 * @return Wartość logiczna wskazująca, że operacja się powiodła, chyba że zostanie zgłoszony błąd.57 */58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);5960 /**61 * @dev Ustawia `value` tokenów jako allowance dla `spender` nad tokenami wywołującego62 * i następnie wywołuje `ERC1363Spender::onApprovalReceived` na `spender`.63 * @param spender Adres, który wyda środki.64 * @param value Ilość tokenów do wydania.65 * @return Wartość logiczna wskazująca, że operacja się powiodła, chyba że zostanie zgłoszony błąd.66 */67 function approveAndCall(address spender, uint256 value) external returns (bool);6869 /**70 * @dev Ustawia `value` tokenów jako allowance dla `spender` nad tokenami wywołującego71 * i następnie wywołuje `ERC1363Spender::onApprovalReceived` na `spender`.72 * @param spender Adres, który wyda środki.73 * @param value Ilość tokenów do wydania.74 * @param data Dodatkowe dane bez określonego formatu, wysyłane w wywołaniu do `spender`.75 * @return Wartość logiczna wskazująca, że operacja się powiodła, chyba że zostanie zgłoszony błąd.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}Pokaż wszystkoInteligentny kontrakt, który chce akceptować tokeny ERC-1363 za pośrednictwem transferAndCall lub transferFromAndCall, MUSI zaimplementować interfejs ERC1363Receiver:
1/**2 * @title ERC1363Receiver3 * @dev Interfejs dla każdego kontraktu, który chce wspierać `transferAndCall` lub `transferFromAndCall` z kontraktów tokenów ERC-1363.4 */5interface ERC1363Receiver {6 /**7 * @dev Ilekroć tokeny ERC-1363 są przesyłane do tego kontraktu za pośrednictwem `ERC1363::transferAndCall` lub `ERC1363::transferFromAndCall`8 * przez `operator` z `from`, ta funkcja jest wywoływana.9 *10 * UWAGA: Aby zaakceptować transfer, funkcja musi zwrócić11 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`12 * (tj. 0x88a7ca5c lub własny selektor funkcji).13 *14 * @param operator Adres, który wywołał funkcję `transferAndCall` lub `transferFromAndCall`.15 * @param from Adres, z którego przesyłane są tokeny.16 * @param value Ilość przesłanych tokenów.17 * @param data Dodatkowe dane bez określonego formatu.18 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` jeśli transfer jest dozwolony, chyba że zostanie zgłoszony błąd.19 */20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);21}Pokaż wszystkoInteligentny kontrakt, który chce akceptować tokeny ERC-1363 za pośrednictwem approveAndCall, MUSI zaimplementować interfejs ERC1363Spender:
1/**2 * @title ERC1363Spender3 * @dev Interfejs dla każdego kontraktu, który chce wspierać `approveAndCall` z kontraktów tokenów ERC-1363.4 */5interface ERC1363Spender {6 /**7 * @dev Ilekroć `owner` tokenów ERC-1363 zatwierdzi ten kontrakt za pośrednictwem `ERC1363::approveAndCall`8 * do wydawania swoich tokenów, ta funkcja jest wywoływana.9 *10 * UWAGA: Aby zaakceptować zatwierdzenie, funkcja musi zwrócić11 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`12 * (tj. 0x7b04a2d0 lub własny selektor funkcji).13 *14 * @param owner Adres, który wywołał funkcję `approveAndCall` i wcześniej posiadał tokeny.15 * @param value Ilość tokenów do wydania.16 * @param data Dodatkowe dane bez określonego formatu.17 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` jeśli zatwierdzenie jest dozwolone, chyba że zostanie zgłoszony błąd.18 */19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);20}Pokaż wszystko