Mengatasi Gagal Withdraw dari Kontrak Cerdas ke Gnosis Safe di Polygon
Resolving Warning! Error encountered during contract execution [execution reverted]
Dalam dunia smart contract, terkadang kita menghadapi situasi di mana dana terkunci dalam kontrak yang sudah di-deploy di jaringan mainnet. Masalah ini semakin rumit jika kontrak tersebut menggunakan fungsi transfer()
untuk mengirim dana ke alamat Gnosis Safe — sebuah smart contract wallet — yang dikenal memiliki kebutuhan gas lebih tinggi dari wallet biasa (EOA). Artikel ini membahas bagaimana saya berhasil menarik dana dari kontrak lama ke Gnosis Safe, walaupun sebelumnya transaksi selalu gagal.
Masalah yang Dihadapi
Kontrak saya memiliki fungsi withdraw()
seperti berikut:
function withdraw() external onlyOwner {
require(address(this).balance > 0, " ");
payable(owner()).transfer(address(this).balance * 20 / 100);
payable(** Gnosis Safe Wallet ** ).transfer(address(this).balance);
}
Fungsi ini membagi dana antara owner()
dan alamat Gnosis Safe. Namun, karena transfer()
memiliki batasan gas (2300 gas), pengiriman ke Gnosis gagal dan menyebabkan seluruh transaksi revert.
Karena kontrak sudah ter-deploy di mainnet dan tidak menggunakan proxy, saya tidak bisa memperbarui kodenya.
Solusi yang Sukses
Setelah banyak percobaan gagal, saya menemukan solusi berdasarkan rekomendasi dari dokumentasi Gnosis Safe.
Langkah-langkah yang saya lakukan:
Transfer Kepemilikan Kontrak ke alamat Gnosis Safe melalui fitur
writeContract
di Polygonscan (menggunakantransferOwnership(address)
).Putus Koneksi Wallet EOA dari Polygonscan.
Hubungkan Polygonscan ke Gnosis Safe:
Salin pairing code saat mencoba connect dari Polygonscan.
Buka https://app.safe.global, lalu pilih Connect dApps to Safe.
Tempel pairing code dan setujui koneksi melalui wallet EOA.
Panggil Fungsi
withdraw()
dari halamanwriteContract
Polygonscan. Transaksi dikirim ke interface Gnosis.Eksekusi Transaksi di Safe:
Pada Safe interface, pilih opsi sponsor (free gas) atau gunakan wallet biasa.
Klik execute. Transaksi berhasil.
Hasil
Dana berhasil ditransfer sepenuhnya ke Gnosis Safe. Karena Gnosis kini menjadi owner()
kontrak, maka dana 20% dan 80% keduanya mengarah ke Gnosis itu sendiri.
Pelajaran Penting
Hindari penggunaan
transfer()
untuk smart contract wallet seperti Gnosis.Gunakan
call{value: ...}()
yang lebih fleksibel dalam pengaturan gas.Jika kontrak sudah terlanjur menggunakan
transfer()
dan tidak dapat diupgrade:Alihkan kepemilikan ke Gnosis Safe.
Manfaatkan Safe App untuk mengeksekusi transaksi.
Referensi Bermanfaat
Semoga artikel ini membantu siapa pun yang mengalami kasus serupa. Jika kamu tertarik membaca lebih lanjut atau punya pertanyaan, jangan ragu untuk menghubungi saya atau tinggalkan komentar di bawah!
Comments