[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-eip-7702-dalam-praktik-membangun-alur-akun-pintar-setelah-pectra":3},{"article":4,"author":55},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":34,"related_articles":35},"d0000000-0000-0000-0000-000000000572","a0000000-0000-0000-0000-000000000022","EIP-7702 dalam Praktik: Membangun Alur Akun Pintar Setelah Pectra","eip-7702-dalam-praktik-membangun-alur-akun-pintar-setelah-pectra","EIP-7702 memungkinkan EOA Ethereum mana pun untuk sementara bertindak sebagai kontrak pintar dalam satu transaksi. Berikut cara mengimplementasikan transaksi batch, sponsorship gas, dan social recovery menggunakan primitif account abstraction baru.","## Apa yang Dimungkinkan EIP-7702\n\nEIP-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.\n\nIni adalah peningkatan UX paling signifikan dalam sejarah Ethereum. Pengguna tidak lagi perlu memilih antara kesederhanaan EOA dan kekuatan akun pintar.\n\n## EIP-7702 vs ERC-4337: Kapan Menggunakan Masing-Masing\n\nKeduanya memungkinkan account abstraction, tetapi beroperasi di level berbeda dan cocok untuk kasus penggunaan berbeda:\n\n| Fitur | EIP-7702 | ERC-4337 |\n|-------|----------|----------|\n| Level | Protokol (tipe tx baru) | Aplikasi (kontrak pintar) |\n| Tipe akun | Meng-upgrade EOA yang ada | Memerlukan dompet kontrak pintar baru |\n| Alamat | Mempertahankan alamat EOA yang ada | Alamat baru (counterfactual) |\n| Persistensi | Delegasi per-transaksi | Kontrak pintar permanen |\n| Bundler diperlukan | Tidak (alur tx standar) | Ya (mempool terpisah) |\n| Overhead gas | ~20.000 gas untuk delegasi | ~42.000 gas untuk validasi UserOp |\n| Dompet yang didukung | MetaMask, Coinbase Wallet, Rainbow | Khusus (Safe, ZeroDev, Biconomy) |\n| Terbaik untuk | Meng-upgrade pengguna yang ada | Pengguna baru, logika akun kompleks |\n\n### Kerangka Keputusan\n\n**Gunakan EIP-7702 ketika:**\n- Pengguna Anda sudah memiliki dompet EOA (MetaMask, Coinbase Wallet)\n- Anda membutuhkan transaksi batch atau sponsorship gas\n- Anda menginginkan kompleksitas integrasi minimal\n- Logika akun pintar bersifat per-transaksi (tidak permanen)\n\n**Gunakan ERC-4337 ketika:**\n- Anda membangun dompet baru atau meng-onboard pengguna baru\n- Anda membutuhkan logika akun persisten (multisig permanen, recovery kompleks)\n- Anda menginginkan akun menjadi kontrak pintar secara default\n- Anda membutuhkan fitur lanjutan seperti modul akun, plugin, atau guardian\n\n## Contoh Kode\n\n### Transaksi Batch\n\nKasus penggunaan EIP-7702 paling umum: mengeksekusi beberapa operasi dalam satu transaksi. Tidak ada lagi alur dua langkah \"approve lalu swap\".\n\n```solidity\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.25;\n\n\u002F\u002F\u002F @title BatchExecutor — Target delegasi EIP-7702 untuk batch call\n\u002F\u002F\u002F @notice EOA mendelegasikan ke kontrak ini untuk mengeksekusi beberapa call secara atomik\ncontract BatchExecutor {\n    struct Call {\n        address target;\n        uint256 value;\n        bytes data;\n    }\n    \n    \u002F\u002F\u002F @notice Mengeksekusi batch call dari EOA yang mendelegasikan\n    \u002F\u002F\u002F @param calls Array call yang akan dieksekusi\n    function executeBatch(Call[] calldata calls) external payable {\n        for (uint256 i = 0; i \u003C calls.length; i++) {\n            (bool success, bytes memory result) = calls[i].target.call{\n                value: calls[i].value\n            }(calls[i].data);\n            \n            if (!success) {\n                assembly {\n                    revert(add(result, 32), mload(result))\n                }\n            }\n        }\n    }\n}\n```\n\nPenggunaan sisi klien dengan ethers.js v6:\n\n```typescript\nimport { ethers } from \"ethers\";\n\n\u002F\u002F Tipe transaksi EIP-7702 (type: 4)\nconst batchTx = {\n    type: 4,\n    to: userAddress, \u002F\u002F EOA mendelegasikan ke dirinya sendiri\n    authorizationList: [{\n        chainId: 1,\n        address: BATCH_EXECUTOR_ADDRESS, \u002F\u002F target delegasi\n        nonce: await provider.getTransactionCount(userAddress),\n        yParity: 0, r: \"0x...\", s: \"0x...\"\n    }],\n    data: batchExecutorInterface.encodeFunctionData(\"executeBatch\", [[\n        {\n            target: USDC_ADDRESS,\n            value: 0,\n            data: usdcInterface.encodeFunctionData(\"approve\", [\n                UNISWAP_ROUTER, ethers.parseUnits(\"1000\", 6)\n            ])\n        },\n        {\n            target: UNISWAP_ROUTER,\n            value: 0,\n            data: routerInterface.encodeFunctionData(\"exactInputSingle\", [{\n                tokenIn: USDC_ADDRESS,\n                tokenOut: WETH_ADDRESS,\n                fee: 3000,\n                recipient: userAddress,\n                amountIn: ethers.parseUnits(\"1000\", 6),\n                amountOutMinimum: 0,\n                sqrtPriceLimitX96: 0\n            }])\n        }\n    ]])\n};\n\nconst tx = await signer.sendTransaction(batchTx);\n```\n\n### Sponsorship Gas\n\nDengan EIP-7702, paymaster dapat mensponsori gas untuk transaksi EOA apa pun:\n\n```solidity\n\u002F\u002F\u002F @title SponsoredExecutor — sponsorship gas melalui EIP-7702\ncontract SponsoredExecutor {\n    mapping(address => uint256) public nonces;\n    \n    \u002F\u002F\u002F @notice Mengeksekusi call atas nama pengguna, gas dibayar oleh msg.sender\n    function sponsoredExecute(\n        address user,\n        address target,\n        bytes calldata data,\n        uint256 userNonce,\n        uint256 deadline,\n        bytes calldata signature\n    ) external {\n        require(block.timestamp \u003C= deadline, \"Expired\");\n        require(nonces[user] == userNonce, \"Invalid nonce\");\n        nonces[user]++;\n        \n        bytes32 digest = _hashTypedData(user, target, data, userNonce, deadline);\n        address signer = ECDSA.recover(digest, signature);\n        require(signer == user, \"Invalid signature\");\n        \n        (bool success, bytes memory result) = target.call(data);\n        require(success, \"Call failed\");\n    }\n}\n```\n\n### Social Recovery\n\nEIP-7702 memungkinkan pola social recovery tanpa memerlukan dompet kontrak pintar permanen:\n\n```solidity\n\u002F\u002F\u002F @title RecoveryModule — social recovery melalui EIP-7702\ncontract RecoveryModule {\n    struct RecoveryConfig {\n        address[] guardians;\n        uint256 threshold;\n        uint256 delay;\n    }\n    \n    mapping(address => RecoveryConfig) public configs;\n    mapping(bytes32 => uint256) public recoveryTimestamps;\n    mapping(bytes32 => uint256) public approvalCounts;\n    mapping(bytes32 => mapping(address => bool)) public hasApproved;\n    \n    function setupRecovery(\n        address[] calldata guardians,\n        uint256 threshold,\n        uint256 delay\n    ) external {\n        require(guardians.length >= threshold, \"Invalid threshold\");\n        require(threshold >= 2, \"Min 2 guardians\");\n        configs[msg.sender] = RecoveryConfig(guardians, threshold, delay);\n    }\n    \n    function approveRecovery(\n        address account,\n        address newOwner\n    ) external {\n        RecoveryConfig memory config = configs[account];\n        require(_isGuardian(config, msg.sender), \"Not a guardian\");\n        \n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        require(!hasApproved[recoveryId][msg.sender], \"Already approved\");\n        \n        hasApproved[recoveryId][msg.sender] = true;\n        approvalCounts[recoveryId]++;\n        \n        if (approvalCounts[recoveryId] >= config.threshold) {\n            recoveryTimestamps[recoveryId] = block.timestamp + config.delay;\n        }\n    }\n    \n    function executeRecovery(\n        address account,\n        address newOwner\n    ) external {\n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        uint256 timestamp = recoveryTimestamps[recoveryId];\n        require(timestamp > 0 && block.timestamp >= timestamp, \"Not ready\");\n    }\n}\n```\n\n## Status Integrasi Dompet\n\nPer Maret 2026, dukungan EIP-7702 telah diluncurkan di dompet-dompet utama:\n\n### MetaMask\n\nMetaMask menambahkan dukungan EIP-7702 di versi 12.4 (September 2025). Pengguna melihat lencana \"Smart Transaction\" ketika dApp meminta transaksi type-4.\n\n### Coinbase Wallet\n\nCoinbase Wallet adalah pengadopsi paling agresif, mengintegrasikan EIP-7702 ke fitur \"Smart Wallet\" (diluncurkan November 2025). Fitur utama:\n- **Auto-batching** — dompet secara otomatis mem-batch urutan approve+swap\n- **Sponsorship gas** — Coinbase mensponsori gas untuk transaksi di bawah $1 biaya\n- **DeFi satu klik** — target delegasi pre-built untuk operasi DeFi umum\n\n### Rainbow, Rabby, dan Lainnya\n\nRainbow 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.\n\n## Panduan Migrasi: Dari EOA ke Akun Pintar\n\nBagi developer dApp, berikut jalur migrasi yang direkomendasikan untuk mendukung EIP-7702:\n\n### Langkah 1: Deploy Target Delegasi\n\nBuat dan audit kontrak pintar yang akan didelegasikan pengguna Anda.\n\n### Langkah 2: Perbarui Frontend Anda\n\nDeteksi apakah dompet yang terhubung mendukung EIP-7702:\n\n```typescript\nasync function supportsEIP7702(provider: ethers.Provider): Promise\u003Cboolean> {\n    try {\n        const capabilities = await provider.send(\n            \"wallet_getCapabilities\", []\n        );\n        return capabilities?.atomicBatch?.supported === true;\n    } catch {\n        return false;\n    }\n}\n```\n\n### Langkah 3: Implementasikan Graceful Degradation\n\n```typescript\nasync function executeSwap(tokenIn, tokenOut, amount) {\n    if (await supportsEIP7702(provider)) {\n        return executeBatchSwap(tokenIn, tokenOut, amount);\n    } else {\n        await approve(tokenIn, ROUTER, amount);\n        return swap(tokenIn, tokenOut, amount);\n    }\n}\n```\n\n## Pertimbangan Keamanan\n\nEIP-7702 memperkenalkan permukaan serangan baru yang harus dipahami developer:\n\n### Verifikasi Target Delegasi\n\nKontrak target delegasi memiliki **kontrol penuh** atas aset EOA selama transaksi. Target delegasi berbahaya dapat mentransfer semua ETH dan token dari EOA.\n\n**Mitigasi:** Hanya delegasikan ke kontrak yang telah diaudit dan diverifikasi.\n\n### Perlindungan Replay\n\nDaftar otorisasi EIP-7702 menyertakan nonce untuk mencegah serangan replay. Developer harus memastikan nonce otorisasi cocok dengan nonce EOA saat ini.\n\n### Phishing melalui Delegasi\n\nPenyerang mungkin menipu pengguna untuk menandatangani daftar otorisasi yang mendelegasikan ke kontrak berbahaya.\n\n**Mitigasi:** Dompet harus menampilkan dengan jelas kode apa yang didelegasikan EOA.\n\n### Reentrancy dalam Eksekusi Batch\n\nBatch executor yang menggunakan `call` dalam loop rentan terhadap reentrancy:\n\n```solidity\nbool private locked;\n\nmodifier noReentrant() {\n    require(!locked, \"Reentrant\");\n    locked = true;\n    _;\n    locked = false;\n}\n\nfunction executeBatch(Call[] calldata calls) external payable noReentrant {\n    \u002F\u002F ...\n}\n```\n\n### Tabrakan Storage\n\nGunakan EIP-7201 (namespaced storage) di semua target delegasi:\n\n```solidity\nbytes32 constant STORAGE_SLOT = keccak256(\n    abi.encode(uint256(keccak256(\"batch.executor.storage\")) - 1)\n) & ~bytes32(uint256(0xff));\n```\n\n## Pertanyaan yang Sering Diajukan\n\n### Apakah EIP-7702 mengubah alamat dompet saya?\n\nTidak. Alamat EOA Anda tetap sama. EIP-7702 sementara memberikan alamat Anda kemampuan kontrak pintar selama durasi satu transaksi.\n\n### Bisakah saya menggunakan EIP-7702 di L2?\n\nYa. Semua L2 utama (Arbitrum, Base, Optimism, zkSync) telah mengadopsi EIP-7702 sebagai bagian dari upgrade setara Pectra mereka.\n\n### Apa yang terjadi jika target delegasi memiliki bug?\n\nKerusakan terbatas pada satu transaksi. Namun, dalam transaksi tersebut, target delegasi memiliki akses penuh ke aset EOA.\n\n### Apakah EIP-7702 kompatibel dengan hardware wallet?\n\nYa. Hardware wallet (Ledger, Trezor) dapat menandatangani transaksi type-4. Ledger menambahkan dukungan di firmware versi 2.3.0 (Desember 2025).\n\n### Berapa banyak gas yang dihemat EIP-7702?\n\nUntuk alur approve+swap tipikal, EIP-7702 menghemat sekitar **40-50%** gas. Untuk operasi DeFi multi-langkah yang kompleks, penghematan bisa mencapai 60-70%.","\u003Ch2 id=\"apa-yang-dimungkinkan-eip-7702\">Apa yang Dimungkinkan EIP-7702\u003C\u002Fh2>\n\u003Cp>EIP-7702, diaktifkan dengan upgrade Pectra Ethereum pada Maret 2025, memperkenalkan tipe transaksi baru yang memungkinkan Externally Owned Account (EOA) mana pun untuk mengatur \u003Cstrong>delegation designator\u003C\u002Fstrong> — 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.\u003C\u002Fp>\n\u003Cp>Ini adalah peningkatan UX paling signifikan dalam sejarah Ethereum. Pengguna tidak lagi perlu memilih antara kesederhanaan EOA dan kekuatan akun pintar.\u003C\u002Fp>\n\u003Ch2 id=\"eip-7702-vs-erc-4337-kapan-menggunakan-masing-masing\">EIP-7702 vs ERC-4337: Kapan Menggunakan Masing-Masing\u003C\u002Fh2>\n\u003Cp>Keduanya memungkinkan account abstraction, tetapi beroperasi di level berbeda dan cocok untuk kasus penggunaan berbeda:\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Fitur\u003C\u002Fth>\u003Cth>EIP-7702\u003C\u002Fth>\u003Cth>ERC-4337\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Level\u003C\u002Ftd>\u003Ctd>Protokol (tipe tx baru)\u003C\u002Ftd>\u003Ctd>Aplikasi (kontrak pintar)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Tipe akun\u003C\u002Ftd>\u003Ctd>Meng-upgrade EOA yang ada\u003C\u002Ftd>\u003Ctd>Memerlukan dompet kontrak pintar baru\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Alamat\u003C\u002Ftd>\u003Ctd>Mempertahankan alamat EOA yang ada\u003C\u002Ftd>\u003Ctd>Alamat baru (counterfactual)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Persistensi\u003C\u002Ftd>\u003Ctd>Delegasi per-transaksi\u003C\u002Ftd>\u003Ctd>Kontrak pintar permanen\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Bundler diperlukan\u003C\u002Ftd>\u003Ctd>Tidak (alur tx standar)\u003C\u002Ftd>\u003Ctd>Ya (mempool terpisah)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Overhead gas\u003C\u002Ftd>\u003Ctd>~20.000 gas untuk delegasi\u003C\u002Ftd>\u003Ctd>~42.000 gas untuk validasi UserOp\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Dompet yang didukung\u003C\u002Ftd>\u003Ctd>MetaMask, Coinbase Wallet, Rainbow\u003C\u002Ftd>\u003Ctd>Khusus (Safe, ZeroDev, Biconomy)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Terbaik untuk\u003C\u002Ftd>\u003Ctd>Meng-upgrade pengguna yang ada\u003C\u002Ftd>\u003Ctd>Pengguna baru, logika akun kompleks\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>Kerangka Keputusan\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Gunakan EIP-7702 ketika:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Pengguna Anda sudah memiliki dompet EOA (MetaMask, Coinbase Wallet)\u003C\u002Fli>\n\u003Cli>Anda membutuhkan transaksi batch atau sponsorship gas\u003C\u002Fli>\n\u003Cli>Anda menginginkan kompleksitas integrasi minimal\u003C\u002Fli>\n\u003Cli>Logika akun pintar bersifat per-transaksi (tidak permanen)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Gunakan ERC-4337 ketika:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Anda membangun dompet baru atau meng-onboard pengguna baru\u003C\u002Fli>\n\u003Cli>Anda membutuhkan logika akun persisten (multisig permanen, recovery kompleks)\u003C\u002Fli>\n\u003Cli>Anda menginginkan akun menjadi kontrak pintar secara default\u003C\u002Fli>\n\u003Cli>Anda membutuhkan fitur lanjutan seperti modul akun, plugin, atau guardian\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"contoh-kode\">Contoh Kode\u003C\u002Fh2>\n\u003Ch3>Transaksi Batch\u003C\u002Fh3>\n\u003Cp>Kasus penggunaan EIP-7702 paling umum: mengeksekusi beberapa operasi dalam satu transaksi. Tidak ada lagi alur dua langkah “approve lalu swap”.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.25;\n\n\u002F\u002F\u002F @title BatchExecutor — Target delegasi EIP-7702 untuk batch call\n\u002F\u002F\u002F @notice EOA mendelegasikan ke kontrak ini untuk mengeksekusi beberapa call secara atomik\ncontract BatchExecutor {\n    struct Call {\n        address target;\n        uint256 value;\n        bytes data;\n    }\n    \n    \u002F\u002F\u002F @notice Mengeksekusi batch call dari EOA yang mendelegasikan\n    \u002F\u002F\u002F @param calls Array call yang akan dieksekusi\n    function executeBatch(Call[] calldata calls) external payable {\n        for (uint256 i = 0; i &lt; calls.length; i++) {\n            (bool success, bytes memory result) = calls[i].target.call{\n                value: calls[i].value\n            }(calls[i].data);\n            \n            if (!success) {\n                assembly {\n                    revert(add(result, 32), mload(result))\n                }\n            }\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Penggunaan sisi klien dengan ethers.js v6:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">import { ethers } from \"ethers\";\n\n\u002F\u002F Tipe transaksi EIP-7702 (type: 4)\nconst batchTx = {\n    type: 4,\n    to: userAddress, \u002F\u002F EOA mendelegasikan ke dirinya sendiri\n    authorizationList: [{\n        chainId: 1,\n        address: BATCH_EXECUTOR_ADDRESS, \u002F\u002F target delegasi\n        nonce: await provider.getTransactionCount(userAddress),\n        yParity: 0, r: \"0x...\", s: \"0x...\"\n    }],\n    data: batchExecutorInterface.encodeFunctionData(\"executeBatch\", [[\n        {\n            target: USDC_ADDRESS,\n            value: 0,\n            data: usdcInterface.encodeFunctionData(\"approve\", [\n                UNISWAP_ROUTER, ethers.parseUnits(\"1000\", 6)\n            ])\n        },\n        {\n            target: UNISWAP_ROUTER,\n            value: 0,\n            data: routerInterface.encodeFunctionData(\"exactInputSingle\", [{\n                tokenIn: USDC_ADDRESS,\n                tokenOut: WETH_ADDRESS,\n                fee: 3000,\n                recipient: userAddress,\n                amountIn: ethers.parseUnits(\"1000\", 6),\n                amountOutMinimum: 0,\n                sqrtPriceLimitX96: 0\n            }])\n        }\n    ]])\n};\n\nconst tx = await signer.sendTransaction(batchTx);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Sponsorship Gas\u003C\u002Fh3>\n\u003Cp>Dengan EIP-7702, paymaster dapat mensponsori gas untuk transaksi EOA apa pun:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F\u002F @title SponsoredExecutor — sponsorship gas melalui EIP-7702\ncontract SponsoredExecutor {\n    mapping(address =&gt; uint256) public nonces;\n    \n    \u002F\u002F\u002F @notice Mengeksekusi call atas nama pengguna, gas dibayar oleh msg.sender\n    function sponsoredExecute(\n        address user,\n        address target,\n        bytes calldata data,\n        uint256 userNonce,\n        uint256 deadline,\n        bytes calldata signature\n    ) external {\n        require(block.timestamp &lt;= deadline, \"Expired\");\n        require(nonces[user] == userNonce, \"Invalid nonce\");\n        nonces[user]++;\n        \n        bytes32 digest = _hashTypedData(user, target, data, userNonce, deadline);\n        address signer = ECDSA.recover(digest, signature);\n        require(signer == user, \"Invalid signature\");\n        \n        (bool success, bytes memory result) = target.call(data);\n        require(success, \"Call failed\");\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Social Recovery\u003C\u002Fh3>\n\u003Cp>EIP-7702 memungkinkan pola social recovery tanpa memerlukan dompet kontrak pintar permanen:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F\u002F @title RecoveryModule — social recovery melalui EIP-7702\ncontract RecoveryModule {\n    struct RecoveryConfig {\n        address[] guardians;\n        uint256 threshold;\n        uint256 delay;\n    }\n    \n    mapping(address =&gt; RecoveryConfig) public configs;\n    mapping(bytes32 =&gt; uint256) public recoveryTimestamps;\n    mapping(bytes32 =&gt; uint256) public approvalCounts;\n    mapping(bytes32 =&gt; mapping(address =&gt; bool)) public hasApproved;\n    \n    function setupRecovery(\n        address[] calldata guardians,\n        uint256 threshold,\n        uint256 delay\n    ) external {\n        require(guardians.length &gt;= threshold, \"Invalid threshold\");\n        require(threshold &gt;= 2, \"Min 2 guardians\");\n        configs[msg.sender] = RecoveryConfig(guardians, threshold, delay);\n    }\n    \n    function approveRecovery(\n        address account,\n        address newOwner\n    ) external {\n        RecoveryConfig memory config = configs[account];\n        require(_isGuardian(config, msg.sender), \"Not a guardian\");\n        \n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        require(!hasApproved[recoveryId][msg.sender], \"Already approved\");\n        \n        hasApproved[recoveryId][msg.sender] = true;\n        approvalCounts[recoveryId]++;\n        \n        if (approvalCounts[recoveryId] &gt;= config.threshold) {\n            recoveryTimestamps[recoveryId] = block.timestamp + config.delay;\n        }\n    }\n    \n    function executeRecovery(\n        address account,\n        address newOwner\n    ) external {\n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        uint256 timestamp = recoveryTimestamps[recoveryId];\n        require(timestamp &gt; 0 &amp;&amp; block.timestamp &gt;= timestamp, \"Not ready\");\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"status-integrasi-dompet\">Status Integrasi Dompet\u003C\u002Fh2>\n\u003Cp>Per Maret 2026, dukungan EIP-7702 telah diluncurkan di dompet-dompet utama:\u003C\u002Fp>\n\u003Ch3>MetaMask\u003C\u002Fh3>\n\u003Cp>MetaMask menambahkan dukungan EIP-7702 di versi 12.4 (September 2025). Pengguna melihat lencana “Smart Transaction” ketika dApp meminta transaksi type-4.\u003C\u002Fp>\n\u003Ch3>Coinbase Wallet\u003C\u002Fh3>\n\u003Cp>Coinbase Wallet adalah pengadopsi paling agresif, mengintegrasikan EIP-7702 ke fitur “Smart Wallet” (diluncurkan November 2025). Fitur utama:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Auto-batching\u003C\u002Fstrong> — dompet secara otomatis mem-batch urutan approve+swap\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Sponsorship gas\u003C\u002Fstrong> — Coinbase mensponsori gas untuk transaksi di bawah $1 biaya\u003C\u002Fli>\n\u003Cli>\u003Cstrong>DeFi satu klik\u003C\u002Fstrong> — target delegasi pre-built untuk operasi DeFi umum\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Rainbow, Rabby, dan Lainnya\u003C\u002Fh3>\n\u003Cp>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.\u003C\u002Fp>\n\u003Ch2 id=\"panduan-migrasi-dari-eoa-ke-akun-pintar\">Panduan Migrasi: Dari EOA ke Akun Pintar\u003C\u002Fh2>\n\u003Cp>Bagi developer dApp, berikut jalur migrasi yang direkomendasikan untuk mendukung EIP-7702:\u003C\u002Fp>\n\u003Ch3>Langkah 1: Deploy Target Delegasi\u003C\u002Fh3>\n\u003Cp>Buat dan audit kontrak pintar yang akan didelegasikan pengguna Anda.\u003C\u002Fp>\n\u003Ch3>Langkah 2: Perbarui Frontend Anda\u003C\u002Fh3>\n\u003Cp>Deteksi apakah dompet yang terhubung mendukung EIP-7702:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">async function supportsEIP7702(provider: ethers.Provider): Promise&lt;boolean&gt; {\n    try {\n        const capabilities = await provider.send(\n            \"wallet_getCapabilities\", []\n        );\n        return capabilities?.atomicBatch?.supported === true;\n    } catch {\n        return false;\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Langkah 3: Implementasikan Graceful Degradation\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-typescript\">async function executeSwap(tokenIn, tokenOut, amount) {\n    if (await supportsEIP7702(provider)) {\n        return executeBatchSwap(tokenIn, tokenOut, amount);\n    } else {\n        await approve(tokenIn, ROUTER, amount);\n        return swap(tokenIn, tokenOut, amount);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"pertimbangan-keamanan\">Pertimbangan Keamanan\u003C\u002Fh2>\n\u003Cp>EIP-7702 memperkenalkan permukaan serangan baru yang harus dipahami developer:\u003C\u002Fp>\n\u003Ch3>Verifikasi Target Delegasi\u003C\u002Fh3>\n\u003Cp>Kontrak target delegasi memiliki \u003Cstrong>kontrol penuh\u003C\u002Fstrong> atas aset EOA selama transaksi. Target delegasi berbahaya dapat mentransfer semua ETH dan token dari EOA.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Mitigasi:\u003C\u002Fstrong> Hanya delegasikan ke kontrak yang telah diaudit dan diverifikasi.\u003C\u002Fp>\n\u003Ch3>Perlindungan Replay\u003C\u002Fh3>\n\u003Cp>Daftar otorisasi EIP-7702 menyertakan nonce untuk mencegah serangan replay. Developer harus memastikan nonce otorisasi cocok dengan nonce EOA saat ini.\u003C\u002Fp>\n\u003Ch3>Phishing melalui Delegasi\u003C\u002Fh3>\n\u003Cp>Penyerang mungkin menipu pengguna untuk menandatangani daftar otorisasi yang mendelegasikan ke kontrak berbahaya.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Mitigasi:\u003C\u002Fstrong> Dompet harus menampilkan dengan jelas kode apa yang didelegasikan EOA.\u003C\u002Fp>\n\u003Ch3>Reentrancy dalam Eksekusi Batch\u003C\u002Fh3>\n\u003Cp>Batch executor yang menggunakan \u003Ccode>call\u003C\u002Fcode> dalam loop rentan terhadap reentrancy:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">bool private locked;\n\nmodifier noReentrant() {\n    require(!locked, \"Reentrant\");\n    locked = true;\n    _;\n    locked = false;\n}\n\nfunction executeBatch(Call[] calldata calls) external payable noReentrant {\n    \u002F\u002F ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Tabrakan Storage\u003C\u002Fh3>\n\u003Cp>Gunakan EIP-7201 (namespaced storage) di semua target delegasi:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">bytes32 constant STORAGE_SLOT = keccak256(\n    abi.encode(uint256(keccak256(\"batch.executor.storage\")) - 1)\n) &amp; ~bytes32(uint256(0xff));\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"pertanyaan-yang-sering-diajukan\">Pertanyaan yang Sering Diajukan\u003C\u002Fh2>\n\u003Ch3 id=\"apakah-eip-7702-mengubah-alamat-dompet-saya\">Apakah EIP-7702 mengubah alamat dompet saya?\u003C\u002Fh3>\n\u003Cp>Tidak. Alamat EOA Anda tetap sama. EIP-7702 sementara memberikan alamat Anda kemampuan kontrak pintar selama durasi satu transaksi.\u003C\u002Fp>\n\u003Ch3 id=\"bisakah-saya-menggunakan-eip-7702-di-l2\">Bisakah saya menggunakan EIP-7702 di L2?\u003C\u002Fh3>\n\u003Cp>Ya. Semua L2 utama (Arbitrum, Base, Optimism, zkSync) telah mengadopsi EIP-7702 sebagai bagian dari upgrade setara Pectra mereka.\u003C\u002Fp>\n\u003Ch3 id=\"apa-yang-terjadi-jika-target-delegasi-memiliki-bug\">Apa yang terjadi jika target delegasi memiliki bug?\u003C\u002Fh3>\n\u003Cp>Kerusakan terbatas pada satu transaksi. Namun, dalam transaksi tersebut, target delegasi memiliki akses penuh ke aset EOA.\u003C\u002Fp>\n\u003Ch3 id=\"apakah-eip-7702-kompatibel-dengan-hardware-wallet\">Apakah EIP-7702 kompatibel dengan hardware wallet?\u003C\u002Fh3>\n\u003Cp>Ya. Hardware wallet (Ledger, Trezor) dapat menandatangani transaksi type-4. Ledger menambahkan dukungan di firmware versi 2.3.0 (Desember 2025).\u003C\u002Fp>\n\u003Ch3 id=\"berapa-banyak-gas-yang-dihemat-eip-7702\">Berapa banyak gas yang dihemat EIP-7702?\u003C\u002Fh3>\n\u003Cp>Untuk alur approve+swap tipikal, EIP-7702 menghemat sekitar \u003Cstrong>40-50%\u003C\u002Fstrong> gas. Untuk operasi DeFi multi-langkah yang kompleks, penghematan bisa mencapai 60-70%.\u003C\u002Fp>\n","id","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:42.816894Z","Pelajari cara mengimplementasikan transaksi batch EIP-7702, sponsorship gas, dan social recovery. Contoh kode, dukungan dompet, dan panduan keamanan.","EIP-7702",null,"index, follow",[21,26,30],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000013","Security","security","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000009","Web3","web3","Blockchain",[36,42,48],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":34,"published_at":41},"d0000000-0000-0000-0000-000000000596","Lapisan Interoperabilitas Ethereum: Bagaimana 55+ L2 Menjadi Satu Chain","lapisan-interoperabilitas-ethereum-bagaimana-55-l2-menjadi-satu-chain","Ethereum memiliki 55+ rollup Layer 2, memecah likuiditas dan pengalaman pengguna. Lapisan Interoperabilitas Ethereum — menggabungkan pesan lintas-rollup, shared sequencer, dan based rollup — bertujuan menyatukan mereka menjadi satu jaringan yang dapat dikomposisi.","2026-03-28T10:44:44.364342Z",{"id":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"d0000000-0000-0000-0000-000000000595","ZK Proofs Melampaui Rollups: Inferensi AI Terverifikasi di Ethereum","zk-proofs-melampaui-rollups-inferensi-ai-terverifikasi-ethereum","Zero-knowledge proofs bukan lagi sekadar alat penskalaan. Pada 2026, zkML memungkinkan inferensi AI terverifikasi on-chain, ZK coprocessor memindahkan komputasi berat off-chain dengan verifikasi on-chain, dan sistem pembuktian baru seperti SP1 dan Jolt menjadikannya praktis.","2026-03-28T10:44:44.358370Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":53,"published_at":54},"d0000000-0000-0000-0000-000000000594","Membangun di TON pada 2026: Pembayaran Kripto di Telegram Mini Apps dengan TON Pay SDK","membangun-di-ton-2026-pembayaran-kripto-telegram-mini-apps-ton-pay-sdk","Ekosistem TON telah berkembang hingga 500M+ pengguna aktif bulanan Mini App, 3600+ aplikasi, dan 400M+ dompet. Panduan ini membahas integrasi TON Pay SDK untuk pembayaran kripto di Telegram Mini Apps, dari autentikasi dompet hingga transfer Jetton.","Telegram","2026-03-28T10:44:44.340210Z",{"id":13,"name":56,"slug":57,"bio":58,"photo_url":18,"linkedin":18,"role":59,"created_at":60,"updated_at":60},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]