Standar Brankas Tokenisasi Asinkron ERC-7540
Pengantar
ERC-7540 memperluas Standar Brankas Tokenisasi ERC-4626 dengan menambahkan dukungan untuk alur deposit dan penebusan asinkron. Ini memperkenalkan pola minta-lalu-klaim (request-then-claim): pengguna pertama-tama mengirimkan permintaan (mengunci aset atau saham mereka), lalu mengklaim hasilnya setelah brankas memprosesnya.
Ini diperlukan ketika sebuah brankas tidak dapat melakukan penyelesaian secara instan dalam satu transaksi, misalnya:
- Protokol aset dunia nyata (RWA) seperti perbendaharaan yang ditokenisasi, kredit swasta, dan aset lainnya dengan siklus penyelesaian T+1 atau T+2
- Peminjaman dengan agunan rendah (undercollateralized) di mana penilaian kredit terjadi secara offchain
- Strategi brankas lintas rantai di mana proses bridging (penjembatanan) menimbulkan penundaan
- Token staking likuid (LST) dengan periode pelepasan ikatan (unbonding)
Brankas dapat memilih untuk menjadi asinkron hanya pada deposit, hanya pada penebusan, atau keduanya. Fleksibilitas ini memungkinkan pengembang brankas menambahkan alur asinkron hanya di tempat strategi dasarnya membutuhkannya, sambil menjaga sisi lainnya tetap sinkron.
Prasyarat
Untuk lebih memahami halaman ini, kami sarankan Anda membaca terlebih dahulu tentang standar token, ERC-20, dan ERC-4626.
ERC-4626 vs ERC-7540
Dalam ERC-4626, sebuah deposit diselesaikan secara atomik: investor mengirimkan aset dan menerima kembali saham dalam satu transaksi tunggal.
ERC-7540 membagi ini menjadi dua langkah. Investor pertama-tama memanggil requestDeposit() untuk mengunci aset, lalu menunggu manajer brankas memproses permintaan tersebut. Setelah terpenuhi, investor memanggil deposit() untuk mengklaim saham mereka. Nilai tukar ditentukan pada saat pemenuhan, bukan pada saat permintaan.
Alur penebusan bekerja dengan cara yang sama: requestRedeem() mengunci saham, dan setelah terpenuhi investor memanggil redeem() untuk mengklaim aset.
Fungsi dan Fitur ERC-7540
ERC-7540 mewarisi antarmuka ERC-4626 secara penuh tetapi menggunakan kembali deposit/mint/withdraw/redeem sebagai fungsi klaim. Fungsi requestDeposit dan requestRedeem yang baru menangani langkah permintaan awal.
Setiap permintaan bergerak melalui tiga state: tertunda (dikirimkan, menunggu pemrosesan), dapat diklaim (terpenuhi dan diberi harga), dan terklaim (investor telah mengumpulkan saham atau aset mereka).
Alur permintaan deposit
requestDeposit
function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId)
Mentransfer assets dari owner ke dalam brankas dan mengirimkan permintaan untuk deposit. Alamat controller menerima kendali atas permintaan tersebut. Mengembalikan requestId yang mengidentifikasi batch permintaan.
pendingDepositRequest
function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)
Mengembalikan jumlah assets dalam permintaan deposit yang tertunda (belum dapat diklaim) untuk controller dan requestId yang diberikan.
claimableDepositRequest
function claimableDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)
Mengembalikan jumlah assets dalam permintaan deposit yang dapat diklaim (terpenuhi tetapi belum terklaim) untuk controller dan requestId yang diberikan.
Mengklaim deposit
Setelah permintaan deposit menjadi dapat diklaim, pengguna memanggil fungsi standar ERC-4626 deposit atau mint untuk mengklaim saham mereka. Dalam ERC-7540, fungsi-fungsi ini tidak lagi mentransfer aset (itu sudah terjadi pada saat permintaan). Mereka hanya mencetak saham ke penerima.
Alur permintaan penebusan
requestRedeem
function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId)
Mengunci shares dari owner dan mengirimkan permintaan untuk menebus. Alamat controller menerima kendali atas permintaan tersebut.
pendingRedeemRequest
function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)
Mengembalikan jumlah shares dalam permintaan penebusan yang tertunda untuk controller dan requestId yang diberikan.
claimableRedeemRequest
function claimableRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)
Mengembalikan jumlah shares dalam permintaan penebusan yang dapat diklaim untuk controller dan requestId yang diberikan.
Mengklaim penebusan
Setelah permintaan penebusan menjadi dapat diklaim, pengguna memanggil fungsi standar ERC-4626 redeem atau withdraw untuk mengklaim aset mereka.
Manajemen operator
ERC-7540 menyertakan pola operator (dari ERC-6909 (terbuka di tab baru)) yang memungkinkan pihak ketiga untuk mengelola permintaan atas nama pengguna.
setOperator
function setOperator(address operator, bool approved) external returns (bool)
Menyetujui atau mencabut operator untuk bertindak atas nama msg.sender untuk permintaan dan klaim deposit/penebusan.
isOperator
function isOperator(address controller, address operator) external view returns (bool)
Mengembalikan apakah operator disetujui untuk bertindak atas nama controller.
ID Permintaan
ID Permintaan membedakan antara batch permintaan yang berbeda. Semua permintaan yang berbagi requestId yang sama bersifat sepadan (fungible): mereka bertransisi antar state secara bersamaan dan menerima nilai tukar yang sama.
Ketika sebuah brankas mengembalikan requestId = 0 untuk semua permintaan, hanya alamat controller yang membedakan state permintaan. Beberapa permintaan dari pengontrol yang sama akan diagregasi.
Peristiwa
Peristiwa DepositRequest
HARUS dipancarkan ketika permintaan deposit dikirimkan melalui requestDeposit.
event DepositRequest(
address indexed controller,
address indexed owner,
uint256 indexed requestId,
address sender,
uint256 assets
)
Peristiwa RedeemRequest
HARUS dipancarkan ketika permintaan penebusan dikirimkan melalui requestRedeem.
event RedeemRequest(
address indexed controller,
address indexed owner,
uint256 indexed requestId,
address sender,
uint256 shares
)
Peristiwa OperatorSet
HARUS dipancarkan ketika seorang operator disetujui atau dicabut melalui setOperator.
event OperatorSet(
address indexed controller,
address indexed operator,
bool approved
)
Fungsi pratinjau
Fungsi pratinjau harus mengembalikan (revert) hanya untuk alur yang asinkron, karena nilai tukar tidak diketahui sampai permintaan terpenuhi. Dalam brankas deposit asinkron, previewDeposit dan previewMint HARUS mengembalikan, sementara previewRedeem dan previewWithdraw tetap bekerja seperti dalam ERC-4626 (dan sebaliknya untuk brankas penebusan asinkron). Ini adalah perbedaan perilaku utama dari ERC-4626.