Langsung ke konten utama
BlockchainMar 28, 2026

EIP-7702 dalam Praktik: Membangun Alur Akun Pintar Setelah Pectra

OS
Open Soft Team

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:

FiturEIP-7702ERC-4337
LevelProtokol (tipe tx baru)Aplikasi (kontrak pintar)
Tipe akunMeng-upgrade EOA yang adaMemerlukan dompet kontrak pintar baru
AlamatMempertahankan alamat EOA yang adaAlamat baru (counterfactual)
PersistensiDelegasi per-transaksiKontrak pintar permanen
Bundler diperlukanTidak (alur tx standar)Ya (mempool terpisah)
Overhead gas~20.000 gas untuk delegasi~42.000 gas untuk validasi UserOp
Dompet yang didukungMetaMask, Coinbase Wallet, RainbowKhusus (Safe, ZeroDev, Biconomy)
Terbaik untukMeng-upgrade pengguna yang adaPengguna 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%.