EIP-7702 dalam Praktik: Membangun Alur Akun Pintar Setelah Pectra
Engineering Team
Apa yang Dimungkinkan EIP-7702
EIP-7702, diaktifkan dengan upgrade Pectra Ethereum pada Maret 2025, memperkenalkan tipe transaksi baru yang memungkinkan Externally Owned Account (EOA) mana pun untuk mengatur delegation designator — pointer ke kontrak pintar yang kodenya diadopsi sementara oleh EOA selama durasi transaksi. Ini berarti alamat dompet MetaMask Anda yang sudah ada dapat mengeksekusi logika kontrak pintar arbitrer (batch call, validasi kustom, sponsorship gas) tanpa men-deploy dompet kontrak baru atau mengubah alamat Anda.
Ini adalah peningkatan UX paling signifikan dalam sejarah Ethereum. Pengguna tidak lagi perlu memilih antara kesederhanaan EOA dan kekuatan akun pintar.
EIP-7702 vs ERC-4337: Kapan Menggunakan Masing-Masing
Keduanya memungkinkan account abstraction, tetapi beroperasi di level berbeda dan cocok untuk kasus penggunaan berbeda:
| Fitur | EIP-7702 | ERC-4337 |
|---|---|---|
| Level | Protokol (tipe tx baru) | Aplikasi (kontrak pintar) |
| Tipe akun | Meng-upgrade EOA yang ada | Memerlukan dompet kontrak pintar baru |
| Alamat | Mempertahankan alamat EOA yang ada | Alamat baru (counterfactual) |
| Persistensi | Delegasi per-transaksi | Kontrak pintar permanen |
| Bundler diperlukan | Tidak (alur tx standar) | Ya (mempool terpisah) |
| Overhead gas | ~20.000 gas untuk delegasi | ~42.000 gas untuk validasi UserOp |
| Dompet yang didukung | MetaMask, Coinbase Wallet, Rainbow | Khusus (Safe, ZeroDev, Biconomy) |
| Terbaik untuk | Meng-upgrade pengguna yang ada | Pengguna baru, logika akun kompleks |
Kerangka Keputusan
Gunakan EIP-7702 ketika:
- Pengguna Anda sudah memiliki dompet EOA (MetaMask, Coinbase Wallet)
- Anda membutuhkan transaksi batch atau sponsorship gas
- Anda menginginkan kompleksitas integrasi minimal
- Logika akun pintar bersifat per-transaksi (tidak permanen)
Gunakan ERC-4337 ketika:
- Anda membangun dompet baru atau meng-onboard pengguna baru
- Anda membutuhkan logika akun persisten (multisig permanen, recovery kompleks)
- Anda menginginkan akun menjadi kontrak pintar secara default
- Anda membutuhkan fitur lanjutan seperti modul akun, plugin, atau guardian
Contoh Kode
Transaksi Batch
Kasus penggunaan EIP-7702 paling umum: mengeksekusi beberapa operasi dalam satu transaksi. Tidak ada lagi alur dua langkah “approve lalu swap”.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;
/// @title BatchExecutor — Target delegasi EIP-7702 untuk batch call
/// @notice EOA mendelegasikan ke kontrak ini untuk mengeksekusi beberapa call secara atomik
contract BatchExecutor {
struct Call {
address target;
uint256 value;
bytes data;
}
/// @notice Mengeksekusi batch call dari EOA yang mendelegasikan
/// @param calls Array call yang akan dieksekusi
function executeBatch(Call[] calldata calls) external payable {
for (uint256 i = 0; i < calls.length; i++) {
(bool success, bytes memory result) = calls[i].target.call{
value: calls[i].value
}(calls[i].data);
if (!success) {
assembly {
revert(add(result, 32), mload(result))
}
}
}
}
}
Penggunaan sisi klien dengan ethers.js v6:
import { ethers } from "ethers";
// Tipe transaksi EIP-7702 (type: 4)
const batchTx = {
type: 4,
to: userAddress, // EOA mendelegasikan ke dirinya sendiri
authorizationList: [{
chainId: 1,
address: BATCH_EXECUTOR_ADDRESS, // target delegasi
nonce: await provider.getTransactionCount(userAddress),
yParity: 0, r: "0x...", s: "0x..."
}],
data: batchExecutorInterface.encodeFunctionData("executeBatch", [[
{
target: USDC_ADDRESS,
value: 0,
data: usdcInterface.encodeFunctionData("approve", [
UNISWAP_ROUTER, ethers.parseUnits("1000", 6)
])
},
{
target: UNISWAP_ROUTER,
value: 0,
data: routerInterface.encodeFunctionData("exactInputSingle", [{
tokenIn: USDC_ADDRESS,
tokenOut: WETH_ADDRESS,
fee: 3000,
recipient: userAddress,
amountIn: ethers.parseUnits("1000", 6),
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
}])
}
]])
};
const tx = await signer.sendTransaction(batchTx);
Sponsorship Gas
Dengan EIP-7702, paymaster dapat mensponsori gas untuk transaksi EOA apa pun:
/// @title SponsoredExecutor — sponsorship gas melalui EIP-7702
contract SponsoredExecutor {
mapping(address => uint256) public nonces;
/// @notice Mengeksekusi call atas nama pengguna, gas dibayar oleh msg.sender
function sponsoredExecute(
address user,
address target,
bytes calldata data,
uint256 userNonce,
uint256 deadline,
bytes calldata signature
) external {
require(block.timestamp <= deadline, "Expired");
require(nonces[user] == userNonce, "Invalid nonce");
nonces[user]++;
bytes32 digest = _hashTypedData(user, target, data, userNonce, deadline);
address signer = ECDSA.recover(digest, signature);
require(signer == user, "Invalid signature");
(bool success, bytes memory result) = target.call(data);
require(success, "Call failed");
}
}
Social Recovery
EIP-7702 memungkinkan pola social recovery tanpa memerlukan dompet kontrak pintar permanen:
/// @title RecoveryModule — social recovery melalui EIP-7702
contract RecoveryModule {
struct RecoveryConfig {
address[] guardians;
uint256 threshold;
uint256 delay;
}
mapping(address => RecoveryConfig) public configs;
mapping(bytes32 => uint256) public recoveryTimestamps;
mapping(bytes32 => uint256) public approvalCounts;
mapping(bytes32 => mapping(address => bool)) public hasApproved;
function setupRecovery(
address[] calldata guardians,
uint256 threshold,
uint256 delay
) external {
require(guardians.length >= threshold, "Invalid threshold");
require(threshold >= 2, "Min 2 guardians");
configs[msg.sender] = RecoveryConfig(guardians, threshold, delay);
}
function approveRecovery(
address account,
address newOwner
) external {
RecoveryConfig memory config = configs[account];
require(_isGuardian(config, msg.sender), "Not a guardian");
bytes32 recoveryId = keccak256(abi.encode(account, newOwner));
require(!hasApproved[recoveryId][msg.sender], "Already approved");
hasApproved[recoveryId][msg.sender] = true;
approvalCounts[recoveryId]++;
if (approvalCounts[recoveryId] >= config.threshold) {
recoveryTimestamps[recoveryId] = block.timestamp + config.delay;
}
}
function executeRecovery(
address account,
address newOwner
) external {
bytes32 recoveryId = keccak256(abi.encode(account, newOwner));
uint256 timestamp = recoveryTimestamps[recoveryId];
require(timestamp > 0 && block.timestamp >= timestamp, "Not ready");
}
}
Status Integrasi Dompet
Per Maret 2026, dukungan EIP-7702 telah diluncurkan di dompet-dompet utama:
MetaMask
MetaMask menambahkan dukungan EIP-7702 di versi 12.4 (September 2025). Pengguna melihat lencana “Smart Transaction” ketika dApp meminta transaksi type-4.
Coinbase Wallet
Coinbase Wallet adalah pengadopsi paling agresif, mengintegrasikan EIP-7702 ke fitur “Smart Wallet” (diluncurkan November 2025). Fitur utama:
- Auto-batching — dompet secara otomatis mem-batch urutan approve+swap
- Sponsorship gas — Coinbase mensponsori gas untuk transaksi di bawah $1 biaya
- DeFi satu klik — target delegasi pre-built untuk operasi DeFi umum
Rainbow, Rabby, dan Lainnya
Rainbow menambahkan dukungan pada Januari 2026. Rabby mendukung transaksi type-4 tetapi tidak memiliki UI visualisasi batch. Frame adalah salah satu yang pertama mendukung EIP-7702, mengirimkan dukungan pada April 2025.
Panduan Migrasi: Dari EOA ke Akun Pintar
Bagi developer dApp, berikut jalur migrasi yang direkomendasikan untuk mendukung EIP-7702:
Langkah 1: Deploy Target Delegasi
Buat dan audit kontrak pintar yang akan didelegasikan pengguna Anda.
Langkah 2: Perbarui Frontend Anda
Deteksi apakah dompet yang terhubung mendukung EIP-7702:
async function supportsEIP7702(provider: ethers.Provider): Promise<boolean> {
try {
const capabilities = await provider.send(
"wallet_getCapabilities", []
);
return capabilities?.atomicBatch?.supported === true;
} catch {
return false;
}
}
Langkah 3: Implementasikan Graceful Degradation
async function executeSwap(tokenIn, tokenOut, amount) {
if (await supportsEIP7702(provider)) {
return executeBatchSwap(tokenIn, tokenOut, amount);
} else {
await approve(tokenIn, ROUTER, amount);
return swap(tokenIn, tokenOut, amount);
}
}
Pertimbangan Keamanan
EIP-7702 memperkenalkan permukaan serangan baru yang harus dipahami developer:
Verifikasi Target Delegasi
Kontrak target delegasi memiliki kontrol penuh atas aset EOA selama transaksi. Target delegasi berbahaya dapat mentransfer semua ETH dan token dari EOA.
Mitigasi: Hanya delegasikan ke kontrak yang telah diaudit dan diverifikasi.
Perlindungan Replay
Daftar otorisasi EIP-7702 menyertakan nonce untuk mencegah serangan replay. Developer harus memastikan nonce otorisasi cocok dengan nonce EOA saat ini.
Phishing melalui Delegasi
Penyerang mungkin menipu pengguna untuk menandatangani daftar otorisasi yang mendelegasikan ke kontrak berbahaya.
Mitigasi: Dompet harus menampilkan dengan jelas kode apa yang didelegasikan EOA.
Reentrancy dalam Eksekusi Batch
Batch executor yang menggunakan call dalam loop rentan terhadap reentrancy:
bool private locked;
modifier noReentrant() {
require(!locked, "Reentrant");
locked = true;
_;
locked = false;
}
function executeBatch(Call[] calldata calls) external payable noReentrant {
// ...
}
Tabrakan Storage
Gunakan EIP-7201 (namespaced storage) di semua target delegasi:
bytes32 constant STORAGE_SLOT = keccak256(
abi.encode(uint256(keccak256("batch.executor.storage")) - 1)
) & ~bytes32(uint256(0xff));
Pertanyaan yang Sering Diajukan
Apakah EIP-7702 mengubah alamat dompet saya?
Tidak. Alamat EOA Anda tetap sama. EIP-7702 sementara memberikan alamat Anda kemampuan kontrak pintar selama durasi satu transaksi.
Bisakah saya menggunakan EIP-7702 di L2?
Ya. Semua L2 utama (Arbitrum, Base, Optimism, zkSync) telah mengadopsi EIP-7702 sebagai bagian dari upgrade setara Pectra mereka.
Apa yang terjadi jika target delegasi memiliki bug?
Kerusakan terbatas pada satu transaksi. Namun, dalam transaksi tersebut, target delegasi memiliki akses penuh ke aset EOA.
Apakah EIP-7702 kompatibel dengan hardware wallet?
Ya. Hardware wallet (Ledger, Trezor) dapat menandatangani transaksi type-4. Ledger menambahkan dukungan di firmware versi 2.3.0 (Desember 2025).
Berapa banyak gas yang dihemat EIP-7702?
Untuk alur approve+swap tipikal, EIP-7702 menghemat sekitar 40-50% gas. Untuk operasi DeFi multi-langkah yang kompleks, penghematan bisa mencapai 60-70%.