Standard zaplatitelného tokenu ERC-1363
Stránka naposledy aktualizována: 4. dubna 2025
Úvod
Co je ERC-1363?
ERC-1363 je rozšiřující rozhraní pro tokeny ERC-20, které podporuje provádění vlastní logiky na kontraktu příjemce po převodech nebo na kontraktu plátce po schváleních, a to vše v rámci jediné transakce.
Rozdíly oproti ERC-20
Standardní operace ERC-20 jako transfer, transferFrom a approve neumožňují spuštění kódu na kontraktu příjemce nebo plátce bez samostatné transakce.
To vnáší složitost do vývoje uživatelského rozhraní a ztěžuje přijetí, protože uživatelé musí čekat na provedení první transakce a poté odeslat druhou.
Musí také dvakrát zaplatit palivo.
ERC-1363 umožňuje, aby zastupitelné tokeny mohly snadněji provádět akce a fungovat bez použití jakéhokoli off-chain listeneru. Umožňuje provést zpětné volání (callback) na kontraktu příjemce nebo plátce po převodu nebo schválení, a to v jediné transakci.
Předpoklady
Pro lepší porozumění této stránce doporučujeme nejprve přečíst o:
Tělo
ERC-1363 zavádí standardní API pro tokeny ERC-20 pro interakci s chytrými kontrakty po operacích transfer, transferFrom nebo approve.
Tento standard poskytuje základní funkcionalitu pro převod tokenů a také umožňuje schválení tokenů, aby je mohla utratit jiná on-chain třetí strana, a poté provést zpětné volání (callback) na kontraktu příjemce nebo plátce.
Existuje mnoho navrhovaných využití chytrých kontraktů, které mohou přijímat zpětná volání (callbacky) ERC-20.
Mezi příklady patří:
- Hromadné prodeje (crowdsales): odeslané tokeny spouští okamžité přidělení odměny.
- Služby: platba aktivuje přístup ke službě v jednom kroku.
- Faktury: tokeny automaticky hradí faktury.
- Předplatná: schválení roční sazby aktivuje předplatné v rámci platby za první měsíc.
Z těchto důvodů byl původně pojmenován „zaplatitelný token“.
Chování zpětného volání (callback) dále rozšiřuje jeho užitečnost a umožňuje bezproblémové interakce, jako jsou:
- Staking (uzamčení): převedené tokeny spouštějí automatické uzamčení ve stakingovém kontraktu.
- Hlasování: přijaté tokeny registrují hlasy v systému správy.
- Směna (swapping): schválení tokenů aktivuje logiku směny v jediném kroku.
Tokeny ERC-1363 lze použít pro specifické účely ve všech případech, které vyžadují spuštění zpětného volání (callback) po přijatém převodu nebo schválení. ERC-1363 je také užitečný pro zamezení ztráty nebo uzamčení tokenů v chytrých kontraktech ověřením schopnosti příjemce s tokeny nakládat.
Na rozdíl od jiných návrhů na rozšíření ERC-20, ERC-1363 nepřepisuje metody transfer a transferFrom z ERC-20 a definuje ID rozhraní, která se mají implementovat, při zachování zpětné kompatibility s ERC-20.
Metody
Chytré kontrakty implementující standard ERC-1363 MUSÍ implementovat všechny funkce v rozhraní ERC1363 a také rozhraní ERC20 a ERC165.
1pragma solidity ^0.8.0;23/**4 * @title ERC13635 * @dev Rozšiřující rozhraní pro tokeny ERC-20, které podporuje spouštění kódu na kontraktu příjemce6 * po `transfer` nebo `transferFrom` nebo kódu na kontraktu plátce po `approve` v jediné transakci.7 */8interface ERC1363 is ERC20, ERC165 {9 /*10 * POZNÁMKA: Identifikátor ERC-165 pro toto rozhraní je 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 Přesune množství tokenů `value` z účtu volajícího na adresu `to`22 * a poté zavolá `ERC1363Receiver::onTransferReceived` na `to`.23 * @param to Adresa, na kterou se tokeny převádějí.24 * @param value Množství tokenů k převodu.25 * @return Booleovská hodnota, která označuje, že operace byla úspěšná, pokud nevyvolá výjimku.26 */27 function transferAndCall(address to, uint256 value) external returns (bool);2829 /**30 * @dev Přesune množství tokenů `value` z účtu volajícího na adresu `to`31 * a poté zavolá `ERC1363Receiver::onTransferReceived` na `to`.32 * @param to Adresa, na kterou se tokeny převádějí.33 * @param value Množství tokenů k převodu.34 * @param data Dodatečná data bez specifikovaného formátu, odeslaná při volání na `to`.35 * @return Booleovská hodnota, která označuje, že operace byla úspěšná, pokud nevyvolá výjimku.36 */37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);3839 /**40 * @dev Přesune množství tokenů `value` z `from` na `to` pomocí mechanismu povolenky41 * a poté zavolá `ERC1363Receiver::onTransferReceived` na `to`.42 * @param from Adresa, ze které se tokeny odesílají.43 * @param to Adresa, na kterou se tokeny převádějí.44 * @param value Množství tokenů k převodu.45 * @return Booleovská hodnota, která označuje, že operace byla úspěšná, pokud nevyvolá výjimku.46 */47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);4849 /**50 * @dev Přesune množství tokenů `value` z `from` na `to` pomocí mechanismu povolenky51 * a poté zavolá `ERC1363Receiver::onTransferReceived` na `to`.52 * @param from Adresa, ze které se tokeny odesílají.53 * @param to Adresa, na kterou se tokeny převádějí.54 * @param value Množství tokenů k převodu.55 * @param data Dodatečná data bez specifikovaného formátu, odeslaná při volání na `to`.56 * @return Booleovská hodnota, která označuje, že operace byla úspěšná, pokud nevyvolá výjimku.57 */58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);5960 /**61 * @dev Nastaví množství tokenů `value` jako povolenku pro `spender` nad tokeny volajícího62 * a poté zavolá `ERC1363Spender::onApprovalReceived` na `spender`.63 * @param spender Adresa, která utratí prostředky.64 * @param value Množství tokenů, které se mají utratit.65 * @return Booleovská hodnota, která označuje, že operace byla úspěšná, pokud nevyvolá výjimku.66 */67 function approveAndCall(address spender, uint256 value) external returns (bool);6869 /**70 * @dev Nastaví množství tokenů `value` jako povolenku pro `spender` nad tokeny volajícího71 * a poté zavolá `ERC1363Spender::onApprovalReceived` na `spender`.72 * @param spender Adresa, která utratí prostředky.73 * @param value Množství tokenů, které se mají utratit.74 * @param data Dodatečná data bez specifikovaného formátu, odeslaná při volání na `spender`.75 * @return Booleovská hodnota, která označuje, že operace byla úspěšná, pokud nevyvolá výjimku.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}Zobrazit všeChytrý kontrakt, který chce přijímat tokeny ERC-1363 přes transferAndCall nebo transferFromAndCall, MUSÍ implementovat rozhraní ERC1363Receiver:
1/**2 * @title ERC1363Receiver3 * @dev Rozhraní pro jakýkoli kontrakt, který chce podporovat `transferAndCall` nebo `transferFromAndCall` z kontraktů tokenů ERC-1363.4 */5interface ERC1363Receiver {6 /**7 * @dev Kdykoli jsou tokeny ERC-1363 převedeny na tento kontrakt přes `ERC1363::transferAndCall` nebo `ERC1363::transferFromAndCall`8 * `operátorem` z `from`, je zavolána tato funkce.9 *10 * POZNÁMKA: Pro přijetí převodu musí tato funkce vrátit11 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`12 * (tj. 0x88a7ca5c, nebo svůj vlastní selektor funkce).13 *14 * @param operator Adresa, která zavolala funkci `transferAndCall` nebo `transferFromAndCall`.15 * @param from Adresa, ze které jsou tokeny převedeny.16 * @param value Množství převedených tokenů.17 * @param data Dodatečná data bez specifikovaného formátu.18 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`, pokud je převod povolen, jinak vyvolá výjimku.19 */20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);21}Zobrazit všeChytrý kontrakt, který chce přijímat tokeny ERC-1363 přes approveAndCall, MUSÍ implementovat rozhraní ERC1363Spender:
1/**2 * @title ERC1363Spender3 * @dev Rozhraní pro jakýkoli kontrakt, který chce podporovat `approveAndCall` z kontraktů tokenů ERC-1363.4 */5interface ERC1363Spender {6 /**7 * @dev Kdykoli `vlastník` tokenů ERC-1363 schválí tento kontrakt přes `ERC1363::approveAndCall`8 * k utracení svých tokenů, je zavolána tato funkce.9 *10 * POZNÁMKA: Pro přijetí schválení musí tato funkce vrátit11 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`12 * (tj. 0x7b04a2d0, nebo svůj vlastní selektor funkce).13 *14 * @param owner Adresa, která zavolala funkci `approveAndCall` a předtím vlastnila tokeny.15 * @param value Množství tokenů, které se mají utratit.16 * @param data Dodatečná data bez specifikovaného formátu.17 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`, pokud je schválení povoleno, jinak vyvolá výjimku.18 */19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);20}Zobrazit vše