Standar Token Payable ERC-1363
Pembaruan terakhir halaman: 4 April 2025
Pengantar
Apa itu ERC-1363?
ERC-1363 adalah antarmuka ekstensi untuk token ERC-20 yang mendukung eksekusi logika kustom pada kontrak penerima setelah transfer, atau pada kontrak pembelanja setelah persetujuan, semuanya dalam satu transaksi tunggal.
Perbedaan dari ERC-20
Operasi standar ERC-20 seperti transfer, transferFrom, dan approve, tidak mengizinkan eksekusi kode pada kontrak penerima atau pembelanja tanpa transaksi terpisah.
Hal ini menimbulkan kompleksitas dalam pengembangan UI dan hambatan pada adopsi karena pengguna harus menunggu transaksi pertama dieksekusi dan kemudian mengirimkan yang kedua.
Mereka juga harus membayar GAS dua kali.
ERC-1363 membuat token yang sepadan (fungible) mampu melakukan tindakan dengan lebih mudah dan bekerja tanpa menggunakan pendengar offchain apa pun. Ini memungkinkan untuk melakukan panggilan balik (callback) pada kontrak penerima atau pembelanja, setelah transfer atau persetujuan, dalam satu transaksi tunggal.
Prasyarat
Untuk lebih memahami halaman ini, kami sarankan Anda membaca terlebih dahulu tentang:
Isi
ERC-1363 memperkenalkan API standar untuk token ERC-20 agar dapat berinteraksi dengan kontrak pintar setelah transfer, transferFrom, atau approve.
Standar ini menyediakan fungsionalitas dasar untuk mentransfer token, serta memungkinkan token untuk disetujui sehingga dapat dibelanjakan oleh pihak ketiga onchain lainnya, dan kemudian melakukan panggilan balik pada kontrak penerima atau pembelanja.
Ada banyak usulan penggunaan kontrak pintar yang dapat menerima panggilan balik ERC-20.
Contohnya bisa berupa:
- Crowdsale: token yang dikirim memicu alokasi hadiah instan.
- Layanan: pembayaran mengaktifkan akses layanan dalam satu langkah.
- Faktur: token menyelesaikan faktur secara otomatis.
- Langganan: menyetujui tarif tahunan mengaktifkan langganan dalam pembayaran bulan pertama.
Karena alasan ini, standar ini awalnya dinamakan "Payable Token".
Perilaku panggilan balik semakin memperluas utilitasnya, memungkinkan interaksi yang mulus seperti:
- Mengunci: token yang ditransfer memicu penguncian otomatis dalam kontrak mengunci.
- Pemungutan Suara: token yang diterima mendaftarkan suara dalam sistem tata kelola.
- Menukar: persetujuan token mengaktifkan logika tukar dalam satu langkah tunggal.
Token ERC-1363 dapat digunakan untuk utilitas spesifik dalam semua kasus yang memerlukan panggilan balik untuk dieksekusi setelah transfer atau persetujuan diterima. ERC-1363 juga berguna untuk menghindari kehilangan token atau penguncian token dalam kontrak pintar dengan memverifikasi kemampuan penerima untuk menangani token.
Tidak seperti proposal ekstensi ERC-20 lainnya, ERC-1363 tidak menimpa metode transfer dan transferFrom ERC-20 dan mendefinisikan ID antarmuka yang akan diimplementasikan dengan mempertahankan kompatibilitas ke belakang dengan ERC-20.
Dari EIP-1363 (opens in a new tab):
Metode
Kontrak pintar yang mengimplementasikan standar ERC-1363 HARUS mengimplementasikan semua fungsi dalam antarmuka ERC1363, serta antarmuka ERC20 dan ERC165.
1pragma solidity ^0.8.0;23/* *4 * @title ERC13635 * @dev Antarmuka ekstensi untuk token ERC-20 yang mendukung pengeksekusian kode pada kontrak penerima6 * setelah `transfer` atau `transferFrom`, atau kode pada kontrak pembelanja setelah `approve`, dalam satu transaksi tunggal. */7/**8 * @title ERC13639 * @dev An extension interface for ERC-20 tokens that supports executing code on a recipient contract10 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.11 */12interface ERC1363 is ERC20, ERC165 {13 /* * CATATAN: pengidentifikasi ERC-165 untuk antarmuka ini adalah 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 /*22 * NOTE: the ERC-165 identifier for this interface is 0xb0202a11.23 * 0xb0202a11 ===24 * bytes4(keccak256('transferAndCall(address,uint256)')) ^25 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^26 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^27 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^28 * bytes4(keccak256('approveAndCall(address,uint256)')) ^29 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))30 */3132 /* *33 * @dev Memindahkan sejumlah `value` token dari akun pemanggil ke `to`34 * dan kemudian memanggil `ERC1363Receiver::onTransferReceived` pada `to`.35 * @param to Alamat tujuan transfer token.36 * @param value Jumlah token yang akan ditransfer.37 * @return Nilai boolean yang menunjukkan operasi berhasil kecuali jika terjadi kesalahan (throwing). */38 /**39 * @dev Moves a `value` amount of tokens from the caller's account to `to`40 * and then calls `ERC1363Receiver::onTransferReceived` on `to`.41 * @param to The address to which tokens are being transferred.42 * @param value The amount of tokens to be transferred.43 * @return A boolean value indicating the operation succeeded unless throwing.44 */45 function transferAndCall(address to, uint256 value) external returns (bool);4647 /* *48 * @dev Memindahkan sejumlah `value` token dari akun pemanggil ke `to`49 * dan kemudian memanggil `ERC1363Receiver::onTransferReceived` pada `to`.50 * @param to Alamat tujuan transfer token.51 * @param value Jumlah token yang akan ditransfer.52 * @param data Data tambahan tanpa format yang ditentukan, dikirim dalam panggilan ke `to`.53 * @return Nilai boolean yang menunjukkan operasi berhasil kecuali jika terjadi kesalahan (throwing). */54 /**55 * @dev Moves a `value` amount of tokens from the caller's account to `to`56 * and then calls `ERC1363Receiver::onTransferReceived` on `to`.57 * @param to The address to which tokens are being transferred.58 * @param value The amount of tokens to be transferred.59 * @param data Additional data with no specified format, sent in call to `to`.60 * @return A boolean value indicating the operation succeeded unless throwing.61 */62 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);6364 /* *65 * @dev Memindahkan sejumlah `value` token dari `from` ke `to` menggunakan mekanisme jatah (allowance)66 * dan kemudian memanggil `ERC1363Receiver::onTransferReceived` pada `to`.67 * @param from Alamat asal pengiriman token.68 * @param to Alamat tujuan transfer token.69 * @param value Jumlah token yang akan ditransfer.70 * @return Nilai boolean yang menunjukkan operasi berhasil kecuali jika terjadi kesalahan (throwing). */71 /**72 * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism73 * and then calls `ERC1363Receiver::onTransferReceived` on `to`.74 * @param from The address from which to send tokens.75 * @param to The address to which tokens are being transferred.76 * @param value The amount of tokens to be transferred.77 * @return A boolean value indicating the operation succeeded unless throwing.78 */79 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);8081 /* *82 * @dev Memindahkan sejumlah `value` token dari `from` ke `to` menggunakan mekanisme jatah (allowance)83 * dan kemudian memanggil `ERC1363Receiver::onTransferReceived` pada `to`.84 * @param from Alamat asal pengiriman token.85 * @param to Alamat tujuan transfer token.86 * @param value Jumlah token yang akan ditransfer.87 * @param data Data tambahan tanpa format yang ditentukan, dikirim dalam panggilan ke `to`.88 * @return Nilai boolean yang menunjukkan operasi berhasil kecuali jika terjadi kesalahan (throwing). */89 /**90 * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism91 * and then calls `ERC1363Receiver::onTransferReceived` on `to`.92 * @param from The address from which to send tokens.93 * @param to The address to which tokens are being transferred.94 * @param value The amount of tokens to be transferred.95 * @param data Additional data with no specified format, sent in call to `to`.96 * @return A boolean value indicating the operation succeeded unless throwing.97 */98 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);99100 /* *101 * @dev Menetapkan sejumlah `value` token sebagai jatah (allowance) bagi `spender` atas token pemanggil102 * dan kemudian memanggil `ERC1363Spender::onApprovalReceived` pada `spender`.103 * @param spender Alamat yang akan membelanjakan dana.104 * @param value Jumlah token yang akan dibelanjakan.105 * @return Nilai boolean yang menunjukkan operasi berhasil kecuali jika terjadi kesalahan (throwing). */106 /**107 * @dev Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens108 * and then calls `ERC1363Spender::onApprovalReceived` on `spender`.109 * @param spender The address which will spend the funds.110 * @param value The amount of tokens to be spent.111 * @return A boolean value indicating the operation succeeded unless throwing.112 */113 function approveAndCall(address spender, uint256 value) external returns (bool);114115 /* *116 * @dev Menetapkan sejumlah `value` token sebagai jatah (allowance) bagi `spender` atas token pemanggil117 * dan kemudian memanggil `ERC1363Spender::onApprovalReceived` pada `spender`.118 * @param spender Alamat yang akan membelanjakan dana.119 * @param value Jumlah token yang akan dibelanjakan.120 * @param data Data tambahan tanpa format yang ditentukan, dikirim dalam panggilan ke `spender`.121 * @return Nilai boolean yang menunjukkan operasi berhasil kecuali jika terjadi kesalahan (throwing). */122 /**123 * @dev Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens124 * and then calls `ERC1363Spender::onApprovalReceived` on `spender`.125 * @param spender The address which will spend the funds.126 * @param value The amount of tokens to be spent.127 * @param data Additional data with no specified format, sent in call to `spender`.128 * @return A boolean value indicating the operation succeeded unless throwing.129 */130 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}Tampilkan semuaKontrak pintar yang ingin menerima token ERC-1363 melalui transferAndCall atau transferFromAndCall HARUS mengimplementasikan antarmuka ERC1363Receiver:
1/* *2 * @title ERC1363Receiver3 * @dev Antarmuka untuk kontrak apa pun yang ingin mendukung `transferAndCall` atau `transferFromAndCall` dari kontrak token ERC-1363. */4/**5 * @title ERC1363Receiver6 * @dev Interface for any contract that wants to support `transferAndCall` or `transferFromAndCall` from ERC-1363 token contracts.7 */8interface ERC1363Receiver {9 /* *10 * @dev Kapan pun token ERC-1363 ditransfer ke kontrak ini melalui `ERC1363::transferAndCall` atau `ERC1363::transferFromAndCall`11 * oleh `operator` dari `from`, fungsi ini dipanggil.12 *13 * CATATAN: Untuk menerima transfer, ini harus mengembalikan14 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`15 * (yaitu 0x88a7ca5c, atau pemilih fungsinya sendiri).16 *17 * @param operator Alamat yang memanggil fungsi `transferAndCall` atau `transferFromAndCall`.18 * @param from Alamat asal transfer token.19 * @param value Jumlah token yang ditransfer.20 * @param data Data tambahan tanpa format yang ditentukan.21 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` jika transfer diizinkan kecuali jika terjadi kesalahan (throwing). */22 /**23 * @dev Whenever ERC-1363 tokens are transferred to this contract via `ERC1363::transferAndCall` or `ERC1363::transferFromAndCall`24 * by `operator` from `from`, this function is called.25 *26 * NOTE: To accept the transfer, this must return27 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`28 * (i.e. 0x88a7ca5c, or its own function selector).29 *30 * @param operator The address which called `transferAndCall` or `transferFromAndCall` function.31 * @param from The address which are tokens transferred from.32 * @param value The amount of tokens transferred.33 * @param data Additional data with no specified format.34 * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` if transfer is allowed unless throwing.35 */36 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);37}Tampilkan semuaKontrak pintar yang ingin menerima token ERC-1363 melalui approveAndCall HARUS mengimplementasikan antarmuka ERC1363Spender:
1/* *2 * @title ERC1363Spender3 * @dev Antarmuka untuk kontrak apa pun yang ingin mendukung `approveAndCall` dari kontrak token ERC-1363. */4/**5 * @title ERC1363Spender6 * @dev Interface for any contract that wants to support `approveAndCall` from ERC-1363 token contracts.7 */8interface ERC1363Spender {9 /* *10 * @dev Kapan pun `owner` token ERC-1363 menyetujui kontrak ini melalui `ERC1363::approveAndCall`11 * untuk membelanjakan token mereka, fungsi ini dipanggil.12 *13 * CATATAN: Untuk menerima persetujuan, ini harus mengembalikan14 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`15 * (yaitu 0x7b04a2d0, atau pemilih fungsinya sendiri).16 *17 * @param owner Alamat yang memanggil fungsi `approveAndCall` dan sebelumnya memiliki token tersebut.18 * @param value Jumlah token yang akan dibelanjakan.19 * @param data Data tambahan tanpa format yang ditentukan.20 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` jika persetujuan diizinkan kecuali jika terjadi kesalahan (throwing). */21 /**22 * @dev Whenever an ERC-1363 tokens `owner` approves this contract via `ERC1363::approveAndCall`23 * to spend their tokens, this function is called.24 *25 * NOTE: To accept the approval, this must return26 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`27 * (i.e. 0x7b04a2d0, or its own function selector).28 *29 * @param owner The address which called `approveAndCall` function and previously owned the tokens.30 * @param value The amount of tokens to be spent.31 * @param data Additional data with no specified format.32 * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` if approval is allowed unless throwing.33 */34 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);35}Tampilkan semua