Trong thế giới blockchain, đặc biệt là trên các nền tảng Layer 2 như Base, các giao dịch on-chain không chỉ phản ánh sự sôi động của thị trường mà còn tiết lộ những chiến lược giao dịch độc đáo và các cơ chế tự động hóa phức tạp. Một trong những yếu tố quan trọng góp phần vào sự phát triển của hệ sinh thái này chính là các bot giao dịch – những công cụ tự động thực hiện các lệnh mua bán, chênh lệch giá, hoặc thậm chí khai thác các cơ hội từ lỗi hệ thống.
Bài viết này sẽ đi sâu vào phân tích hoạt động của một số bot đặc biệt trên Base, thông qua việc theo dõi và giải mã các giao dịch on-chain. Từ đó, chúng ta sẽ tìm hiểu cách mà các bot này tối ưu hóa lợi nhuận, tương tác với các giao thức, và ảnh hưởng đến thị trường. Những góc nhìn này không chỉ giúp bạn hiểu rõ hơn về cách vận hành của hệ sinh thái Base mà còn mở ra cơ hội học hỏi và ứng dụng cho chính mình.
Mục lục
Bot 0x538C24776876F7aC07993866684e01d96130530A
Giao dịch 0x6c2dc4d069b4ed190adaa5dd6d9c8eb230e1b8abb5bbdfc157f6852d291018d8
Chúng ta cần xem xét và phân tích chi tiết cho giao dịch 0x6c2dc4d069b4ed190adaa5dd6d9c8eb230e1b8abb5bbdfc157f6852d291018d8, giao dịch này thực hiện 5 lần swap:
- Địa chỉ 0x538c24…30530a thực hiện hoán đổi 0.0127956293558139 WETH trên pool 0xe38d18…490ff3 đối lấy 100294.262285858 BABYDEGEN
- Địa chỉ 0x4752ba…72ad24 thực hiện hoán đổi 107179.995385103 BABYDEGEN trên pool 0xe38d18…490ff3 để nhận được 0.0135853396068426 WETH và chuyển tới địa chỉ 0x7c327d…2fe7b2
- Địa chỉ 0x4752ba…72ad24 thực hiện hoán đổi 0.013585339606842646 WETH trên pool 0x7c327d…2fe7b2 đổi lấy 3055.728236269408204841 DEGEN chuyển tới địa chỉ 0x08bea9…546160
- Địa chỉ 0x538c24…30530a thực hiện hoán đổi 90515.571712986963456754 BABYDEGEN trên pool 0xd45779…313261 đổi lấy 3040.861864441837018437 DEGEN
- Địa chỉ 0x538c24…30530a thực hiện hoán đổi 3040.861864441837018437 DEGEN trên pool 0x7c327d…2fe7b2 đổi lấy 0.013444810337823384 DEGEN
Bây giờ chúng ta xem sự kiện transfer và phân tích, chú ý rằng token BABYDEGEN có phí mua bán là 5%.
Sau khi tổng hợp cả sự kiện transfer và swap thì luồng giao dịch của Bot như sau:
- B1: Bot thực hiện vay 0.012795629355813902 WETH từ Vault 0xba1222…6bf2c8. Bot này vay không mất phí. (Dòng 1)
- B2: Bot dùng WETH ở trên hoán đổi trên pool UniswapV2Pair:BABYDEGEN-WETH để mong muốn lấy 100294.262285858 BABYDEGEN (Dòng 2). Nhưng thực tế token này mất phí mua bán nên lượng nhận về ít hơn thực tế. Cụ thể:
- Bot chỉ nhận được 95% tức 95,279.54917156522469132 BABYDEGEN (Dòng 4)
- Còn phí 5,014.713114292906562701 BABYDEGEN (5%) được đẩy sang contract của token (Dòng 3)
- Quá trình này đồng thời cũng kích hoạt lệnh swap bên trong hàm transfer() của BABYDEGEN, lệnh này swap 107179.995385 BABYDEGEN sử dụng UniswapV2Router02 qua path [BABYDEGEN-WETH-DEGEN] để nhận về 3,055.728236269408204841 DEGEN chuyển về địa chỉ DividendTokenDividendTracker (Dòng 6-7-8-9)
- B3: Bot thực hiện chuyển 95,279.54917156522469132 BABYDEGEN vào pool UniswapV2Pair:BABYDEGEN-DEGEN, mất 5% phí tương đương 4,763.977458578261234566 BABYDEGEN (Dòng 10), thực tế có 95% tương đương 90,515.571712986963456754 BABYDEGEN được đẩy vào pool (Dòng 11) và nhận được 3,040.861864441837018437 DEGEN
- B5: Bot thực hiện chuyển 3,040.861864441837018437 DEGEN (Dòng 15) vào pool UniswapV2Pair:WETH-DEGEN để lấy 0.013444810337823384 WETH (Dòng 16).
- B6: Bot thực hiện gửi trả 0.012795629355813902 WETH đã vay từ Vault (Dòng 17)
Ghi chú: Trong log có một số sự kiện nhưng ta có thể bỏ qua
- Theo cơ chế nhận thưởng khi nắm giữ BABYDEGEN, thì Bot nhận được DIVIDEND_TRACKER khi nắm giữ BABYDEGEN (Dòng 5) và bị đốt khi không nắm giữ BABYDEGEN (Dòng 12)
- Lượng reward không đáng kể khi giao dịch (Dòng 13)
Như vậy nhìn sự kiện giao dịch khá phức tạp nhưng thực chất bot này chỉ thực hiện 1 cyclic trade:
- Đi qua 3 pool: 0xe38d184e6C3d8B7b4AA21de866a4adE8De490FF3-0xd457793A12dEEC4c90F2Fb2Fc3296E760f313261-0x7C327d692B72f60b28AecEDbcC1BA784712fE7b2
- Path tương ứng: WETH-BABYDEGEN-DEGEN-WETH
Một số nhận xét về bot 0x538C24776876F7aC07993866684e01d96130530A
Sau khi phân tích một số giao dịch trên kết hợp với xem lịch sử giao dịch trên BaseScan thì có một số nhận xét như sau:
- Bot này là bot thực hiện Cyclic Trade (Giao dịch vòng)
- Bot này chỉ hành động khi phát hiện có cơ hội thực sự
- Bot này vay tiền từ Vault (0xBA12222222228d8Ba445958a75a0704d566BF2C8) để thực hiện giao dịch. Bot này có lợi thế là lệnh vay từ Vault không tốn phí.
- Hỗ trợ giao dịch cả với các token có tính phí.
Bot 0xCF6A86850303F00064dE90e923490adA4dA37ca1
Giao dịch 0x031f658e46e104bbd0e4ef66c81d773bee5eea0e2dcda8e674407de1968dea00
Bây giờ chúng ta debug chi tiết giao dịch 0x031f658e46e104bbd0e4ef66c81d773bee5eea0e2dcda8e674407de1968dea00. Sau khi decode giao dịch thấy:
- Dữ liệu gọi hàm liquidity(), slot0(), tickBitmap(), ticks(), getReserves() => Gồm cả hàm AMM V2 và V3
- Với các Pool V3, hàm ticks() và tickBitmap() được gọi rất nhiều, mỗi hàm phải được gọi tới hơn 900 lần (tickBitmap: 941 lần, ticks: 640 lần)
- Các Pool V2, nó gọi hàm getAmountOut() của Router để tính amountOut
- Với các Pool V3, nó gọi hàm quoteExactInputSingle() để tính amountOut => Mình nhớ rõ ràng hàm này không phải là hàm view thì sao có thể gọi được => Kiểm tra kỹ hơn hóa ra nó gọi tới contract UniswapV3StaticQuoter => Hóa ra có dự án xây dựng Static Quoter để tính amountOut: uniswap-v3-static-quoter. Một số dự án không có Static Quoter sẽ dùng trực tiếp Quoter của dự án gốc như PancakeV3.
- Các sub trade trong giao dịch bị revert hầu hết đều “Out of gas” => Xem trong gethtrace2 sẽ thấy. Thường các lệnh “out of gas” này do truy vấn tới các pool v3 với quá nhiều số lần lặp để tính amountOut.
- Giao dịch gồm nhiều trade, mỗi trade nó gọi hàm getAmountOut() và quoteExactInputSingle() để kiểm tra, có lãi mới trade.
- AmountIn fix cứng là 400 USDC, 0.18579422979 WETH => Khả năng fix cứng là 400$, lượng token WETH sẽ được tính bằng 400$/PriceWeth.
- Thấy có 2 lệnh trên cùng path: USDbC-WETH-USDbC đều cho lợi nhuận => Do fix amount chứ không phải tính amount tối ưu, do đó có thể có nhiều lần trade 1 path đều có lợi nhuận
- Trong lệnh fransferFrom() ở cuối cùng sẽ chuyển profit sang ví 0xc2B3e647Fb8Ede1FA8Bb513C62D4D305AE9d7028
Giao dịch 0xc30f82e3632cd711b3b11bbd1a8b2d2e9cc55765c18156e9d00770752923f0fd
Bây giờ chúng ta debug chi tiết giao dịch 0xc30f82e3632cd711b3b11bbd1a8b2d2e9cc55765c18156e9d00770752923f0fd. Sau khi decode giao dịch thấy về cơ bản gần giống giao dịch trên, có một số khác:
- AmountIn fix cứng là 60 USDC, 0.00147839952 tBTC, 0.02780288137 WETH=> Khả năng fix cứng là 400$, lượng token WETH sẽ được tính bằng 400$/PriceWeth.
Địa chỉ nhận profit 0xc2B3e647Fb8Ede1FA8Bb513C62D4D305AE9d7028
Qua phân tích giao dịch thấy bot này sau khi thực hiện giao dịch sẽ chuyển lợi nhuận vào địa chỉ 0xc2B3e647Fb8Ede1FA8Bb513C62D4D305AE9d7028. Bây giờ chúng ta truy vấn balance từ quá khứ đến hiện tại của ví 0xc2B3e647Fb8Ede1FA8Bb513C62D4D305AE9d7028. Để truy vấn balance trong quá khứ chúng ta sẽ dùng Hardhat để tạo một forking mainnet từ block mong muốn, chi tiết xem: Hướng dẫn tạo các “Forking mainnet” để sử dụng trên local cho các mạng dạng EVM
Ngoài check lại địa chỉ trên ta thấy địa chỉ trên bắt đầu có giao dịch từ block 6566780, block hiện tại là 7843209, đã qua 1,276,429 block. Cứ 2s sẽ có 1 block, vậy 1 ngày sẽ có 43,200 block.
Bạn nhớ rằng API của Web3 có chỗ trợ call lên blockchain để lấy thông tin ở 1 blocknumber bất kỳ:
Sau khi lấy dữ liệu thì thấy trong vòng 1 tháng, lợi nhuận đâu đó khoảng 1369$. Chi tiết dữ liệu xem ảnh dưới:
Tính thêm đến hết tháng 12/2023 thì nói chung đâu đó lợi nhuận khoảng hơn 1000$ / tháng.
Một số nhận xét về bot 0xCF6A86850303F00064dE90e923490adA4dA37ca1
Sau khi kiểm tra lịch sử giao dịch của Bot trên BaseScan thì thấy cứ 1 vài phút sẽ có một giao dịch: 0xe4b96e577af67a8c94865af58ab56d77f752cfa6a1bdb21f548ab367a882909c, 0xc30f82e3632cd711b3b11bbd1a8b2d2e9cc55765c18156e9d00770752923f0fd, 0x031f658e46e104bbd0e4ef66c81d773bee5eea0e2dcda8e674407de1968dea00. Chứng tỏ đây là bot chỉ kích hoạt lệnh khi có cơ hội.
Các giao dịch đều tiêu thụ rất nhiều Gas, Gas Used sử dụng từ khoảng 13M đến 26M. Điều này chứng tỏ bot tính toán rất nhiều => Khả năng cao scan đồng thời nhiều path trên Blockchain.
Gas Price cực nhỏ, khoảng 0.00001 Gwei => Do đó mặc dù execution nhiều nhưng phí trên L2 khá thấp. Phí chủ yếu là phí trên L1. Dữ liệu đầu vài Calldata rất thấp, chỉ vài byte => Tối ưu phí trên L1
Hầu hết các giao dịch đều hiển thị biểu tượng Warnning và có thông báo “Although one or more Error Occurred [out of gas] Contract Execution Completed” => Điều này chứng tỏ contract có cài đặt cơ chế revert cho từng giao dịch đơn lẻ, giao dịch tổng thể vẫn thành công. Ví dụ nếu quét 100 path, thì những path đầu có cơ hội thực hiện transfer thì sẽ tốn nhiều Gas, khi đó các path cuối sẽ không đủ gas.
Xem chi tiết dữ liệu thì contract chính thực hiện giao dịch là 0xa1b39786882de81dc4309e406911d262761c3c82 => Vậy contract 0xCF6A86850303F00064dE90e923490adA4dA37ca1 giống như dạng Multicall.
Một số nhận xét về bot này:
- Bot này là bot thực hiện Cyclic Trade (Giao dịch vòng)
- Bot này chỉ hành động khi phát hiện có cơ hội thực sự
- Bot này vay tiền từ Vault (0xBA12222222228d8Ba445958a75a0704d566BF2C8) để thực hiện giao dịch, Cũng là anh em với bot 0x538C24776876F7aC07993866684e01d96130530A ở trên.
- Bot này tối ưu phí gas cho L1
- Bot này thực hiện quét đồng thời nhiều path trước đó, nếu có cơ hội sẽ gọi multicall để thực hiện.
Trả lời