Přeskočit na hlavní obsah
Change page

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.

Z EIP-1363opens in a new tab:

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;
2
3/**
4 * @title ERC1363
5 * @dev Rozšiřující rozhraní pro tokeny ERC-20, které podporuje spouštění kódu na kontraktu příjemce
6 * 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 */
19
20 /**
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);
28
29 /**
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);
38
39 /**
40 * @dev Přesune množství tokenů `value` z `from` na `to` pomocí mechanismu povolenky
41 * 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);
48
49 /**
50 * @dev Přesune množství tokenů `value` z `from` na `to` pomocí mechanismu povolenky
51 * 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);
59
60 /**
61 * @dev Nastaví množství tokenů `value` jako povolenku pro `spender` nad tokeny volajícího
62 * 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);
68
69 /**
70 * @dev Nastaví množství tokenů `value` jako povolenku pro `spender` nad tokeny volajícího
71 * 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}
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}
Zobrazit vše

Chytrý kontrakt, který chce přijímat tokeny ERC-1363 přes transferAndCall nebo transferFromAndCall, MUSÍ implementovat rozhraní ERC1363Receiver:

1/**
2 * @title ERC1363Receiver
3 * @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átit
11 * `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še

Chytrý kontrakt, který chce přijímat tokeny ERC-1363 přes approveAndCall, MUSÍ implementovat rozhraní ERC1363Spender:

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

Další čtení

Byl tento článek užitečný?