メインコンテンツへスキップ
Change page

ERC-1363 支払い可能トークン標準

最終更新: 2025年4月4日

はじめに

ERC-1363とは何か?

ERC-1363はERC-20トークンの拡張インターフェースであり、送金後に受信者コントラクトで、または承認後にスペンダーコントラクトでカスタムロジックを実行することを、すべて単一のトランザクション内でサポートします。

ERC-20との違い

transfertransferFromapproveなどの標準的なERC-20の操作では、別のトランザクションなしで受信者またはスペンダーコントラクト上でコードを実行することはできません。 これによりUI開発が複雑化し、導入の障壁となります。ユーザーは最初のトランザクションの実行を待ってから2つ目を送信する必要があるためです。 また、ガスも2回支払わなければなりません。

ERC-1363は、代替可能トークンがより簡単にアクションを実行し、オフチェーンリスナーを使用せずに動作できるようにします。 これにより、単一のトランザクションで、送金または承認後に、受信者またはスペンダーコントラクトへのコールバックが可能になります。

前提条件

このページをよりよく理解するために、まず以下について読むことをお勧めします。

規格の概要

ERC-1363は、transfertransferFromまたはapproveの後にERC-20トークンがスマートコントラクトと対話するための標準APIを導入します。

この標準は、トークンを送金する基本的な機能を提供します。また、トークンを承認して別のオンチェーンの第三者が使用できるようにし、その後、受信者またはスペンダーコントラクトでコールバックを実行することも可能です。

ERC-20のコールバックを受け入れることができるスマートコントラクトには、多くの使用法が提案されています。

例としては:

  • クラウドセール:送信されたトークンが、即時の報酬割り当てをトリガーします。
  • サービス:支払いがワンステップでサービスアクセスを有効化します。
  • 請求書:トークンが請求書を自動的に決済します。
  • サブスクリプション:年間レートを承認すると、最初の月の支払いでサブスクリプションが有効になります。

これらの理由から、元々は**「Payable Token」**と名付けられました。

コールバックの動作はその有用性をさらに広げ、以下のようなシームレスなインタラクションを可能にします。

  • ステーキング:送金されたトークンが、ステーキングコントラクトでの自動ロックをトリガーします。
  • 投票:受け取ったトークンが、ガバナンスシステムで投票を登録します。
  • スワッピング:トークンの承認が、ワンステップでスワップロジックを有効化します。

ERC-1363トークンは、送金または承認を受けた後にコールバックを実行する必要があるすべてのケースで、特定のユーティリティに使用できます。 ERC-1363は、受信者がトークンを処理できる能力があるか検証することで、スマートコントラクトでのトークンの紛失やロックを回避するのにも役立ちます。

他のERC-20拡張提案とは異なり、ERC-1363はERC-20のtransferおよびtransferFromメソッドを上書きせず、ERC-20との後方互換性を維持しながら実装すべきインターフェースIDを定義します。

EIP-1363 (opens in a new tab) から引用:

メソッド

ERC-1363標準を実装するスマートコントラクトは、ERC1363インターフェース、ならびにERC20およびERC165インターフェースのすべての関数を必ず実装しなければなりません。

1pragma solidity ^0.8.0;
2
3/**
4 * @title ERC1363
5 * @dev `transfer`または`transferFrom`の後、受信者コントラクト上でコードを実行するか、または`approve`の後、スペンダーコントラクト上でコードを実行することを単一のトランザクションでサポートする、ERC-20トークンの拡張インターフェースです。
6 */
7interface ERC1363 is ERC20, ERC165 {
8 /*
9 * 注:このインターフェースのERC-165識別子は0xb0202a11です。
10 * 0xb0202a11 ===
11 * bytes4(keccak256('transferAndCall(address,uint256)')) ^
12 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
13 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
14 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
15 * bytes4(keccak256('approveAndCall(address,uint256)')) ^
16 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
17 */
18
19 /**
20 * @dev 呼び出し元のアカウントから`to`に`value`量のトークンを移動させ、
21 * その後、`to`で`ERC1363Receiver::onTransferReceived`を呼び出します。
22 * @param to トークンの転送先アドレス。
23 * @param value 転送するトークンの量。
24 * @return スローされない限り、操作が成功したことを示すブール値。
25 */
26 function transferAndCall(address to, uint256 value) external returns (bool);
27
28 /**
29 * @dev 呼び出し元のアカウントから`to`に`value`量のトークンを移動させ、
30 * その後、`to`で`ERC1363Receiver::onTransferReceived`を呼び出します。
31 * @param to トークンの転送先アドレス。
32 * @param value 転送するトークンの量。
33 * @param data 指定されたフォーマットのない追加データで、`to`への呼び出しで送信されます。
34 * @return スローされない限り、操作が成功したことを示すブール値。
35 */
36 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
37
38 /**
39 * @dev アローワンスメカニズムを使用して`from`から`to`に`value`量のトークンを移動させ、
40 * その後、`to`で`ERC1363Receiver::onTransferReceived`を呼び出します。
41 * @param from トークンを送信するアドレス。
42 * @param to トークンの転送先アドレス。
43 * @param value 転送するトークンの量。
44 * @return スローされない限り、操作が成功したことを示すブール値。
45 */
46 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
47
48 /**
49 * @dev アローワンスメカニズムを使用して`from`から`to`に`value`量のトークンを移動させ、
50 * その後、`to`で`ERC1363Receiver::onTransferReceived`を呼び出します。
51 * @param from トークンを送信するアドレス。
52 * @param to トークンの転送先アドレス。
53 * @param value 転送するトークンの量。
54 * @param data 指定されたフォーマットのない追加データで、`to`への呼び出しで送信されます。
55 * @return スローされない限り、操作が成功したことを示すブール値。
56 */
57 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
58
59 /**
60 * @dev 呼び出し元のトークンに対する`spender`のアローワンスとして、`value`量のトークンを設定し、
61 * その後、`spender`で`ERC1363Spender::onApprovalReceived`を呼び出します。
62 * @param spender 資金を使用するアドレス。
63 * @param value 使用されるトークンの量。
64 * @return スローされない限り、操作が成功したことを示すブール値。
65 */
66 function approveAndCall(address spender, uint256 value) external returns (bool);
67
68 /**
69 * @dev 呼び出し元のトークンに対する`spender`のアローワンスとして、`value`量のトークンを設定し、
70 * その後、`spender`で`ERC1363Spender::onApprovalReceived`を呼び出します。
71 * @param spender 資金を使用するアドレス。
72 * @param value 使用されるトークンの量。
73 * @param data 指定されたフォーマットのない追加データで、`spender`への呼び出しで送信されます。
74 * @return スローされない限り、操作が成功したことを示すブール値。
75 */
76 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
77}
78
79interface ERC20 {
80 event Transfer(address indexed from, address indexed to, uint256 value);
81 event Approval(address indexed owner, address indexed spender, uint256 value);
82 function transfer(address to, uint256 value) external returns (bool);
83 function transferFrom(address from, address to, uint256 value) external returns (bool);
84 function approve(address spender, uint256 value) external returns (bool);
85 function totalSupply() external view returns (uint256);
86 function balanceOf(address account) external view returns (uint256);
87 function allowance(address owner, address spender) external view returns (uint256);
88}
89
90interface ERC165 {
91 function supportsInterface(bytes4 interfaceId) external view returns (bool);
92}
すべて表示

transferAndCallまたはtransferFromAndCallを介してERC-1363トークンを受け入れたいスマートコントラクトは、ERC1363Receiverインターフェースを必ず実装しなければなりません:

1/**
2 * @title ERC1363Receiver
3 * @dev ERC-1363トークンコントラクトからの`transferAndCall`または`transferFromAndCall`をサポートしたいすべてのコントラクトのためのインターフェースです。
4 */
5interface ERC1363Receiver {
6 /**
7 * @dev ERC-1363トークンが、`operator`によって`from`からこのコントラクトに`ERC1363::transferAndCall`または`ERC1363::transferFromAndCall`を介して転送されるたびに、この関数が呼び出されます。
8 *
9 * 注:転送を受け入れるには、この関数は
10 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`
11 * (つまり0x88a7ca5c、またはそれ自身の関数セレクター) を返さなければなりません。
12 *
13 * @param operator `transferAndCall`または`transferFromAndCall`関数を呼び出したアドレス。
14 * @param from トークンが転送された元のアドレス。
15 * @param value 転送されたトークンの量。
16 * @param data 指定されたフォーマットのない追加データ。
17 * @return スローされない限り、転送が許可されている場合は`bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`。
18 */
19 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);
20}
すべて表示

approveAndCallを介してERC-1363トークンを受け入れたいスマートコントラクトは、ERC1363Spenderインターフェースを必ず実装しなければなりません:

1/**
2 * @title ERC1363Spender
3 * @dev ERC-1363トークンコントラクトからの`approveAndCall`をサポートしたいすべてのコントラクトのためのインターフェースです。
4 */
5interface ERC1363Spender {
6 /**
7 * @dev ERC-1363トークンの`owner`が、自身のトークンを使用するために`ERC1363::approveAndCall`を介してこのコントラクトを承認するたびに、この関数が呼び出されます。
8 *
9 * 注:承認を受け入れるには、この関数は
10 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`
11 * (つまり0x7b04a2d0、またはそれ自身の関数セレクター) を返さなければなりません。
12 *
13 * @param owner `approveAndCall`関数を呼び出し、以前はトークンを所有していたアドレス。
14 * @param value 使用されるトークンの量。
15 * @param data 指定されたフォーマットのない追加データ。
16 * @return スローされない限り、承認が許可されている場合は`bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`。
17 */
18 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
19}
すべて表示

参考リンク

この記事は役に立ちましたか?