Đốt token do bán kích hoạt khiến bể thanh khoản TENDRIL trên BNB Chain cạn kiệt
CoinDesk đưa tin: Một lệnh bán kích hoạt đợt đốt token, gần như rút cạn phần TENDRIL trong bể thanh khoản TENDRIL trên BNB Chain vào ngày 4/11/2026, tạo điều kiện cho một giao dịch hoán đổi lấy đi gần 4,42 triệu USDT. Dòng tiền ròng chảy ra từ giao dịch này nhỏ hơn, ở mức 555,670.538752928908475139 USDT, do một lượng lớn USDT đã chảy vào trước chính giao dịch đó. Vậy việc bán kích hoạt đốt token như thế nào? Trước khi phần TENDRIL còn lại của người bán đi vào bể thanh khoản, một bộ điều khiển đã được gọi. Lúc 16:02:45 UTC, lệnh transferFrom của router khởi tạo việc bán 39,053,180,124.060957132414461269 TENDRIL, kích hoạt logic phí và bộ điều khiển của token. Các khoản chuyển vào bể chính chịu thuế bán 30%, trừ khi được gửi từ hai địa chỉ đã cấu hình là _poolControl và _markControl. Hợp đồng thực hiện giao dịch này không thuộc diện miễn trừ. Vì vậy, token trước tiên chuyển 11,715,954,037.218287139724338380 TENDRIL đến _poolControl. Sau đó, token gọi hàm sellToken của bộ điều khiển, truyền vào số lượng bán gốc chứ không chỉ phần thuế. Lệnh gọi này hoàn tất trước khi token ghi nhận 70% còn lại vào bể. Dấu vết lời gọi lịch sử cho thấy trình tự: transferFrom, sellToken, controlburn và sync, sau đó là giao dịch hoán đổi cuối cùng. Dấu vết mã lệnh của bộ điều khiển xác nhận rằng nó đã nhân số lượng bán gốc với 2 để xác định chính xác lượng token sau đó bị rút khỏi bể. Controlburn loại token khỏi bể mà không làm giảm tổng nguồn cung. Hàm controlburn chuyển TENDRIL từ số dư của bể đến một địa chỉ chết, nhưng không giảm tổng nguồn cung được ghi nhận cho token và không đốt token của nhà cung cấp thanh khoản. Kiểm tra quyền của hàm yêu cầu người gọi phải khớp với _poolControl. Sau khi được cấp quyền, hàm dùng _basicTransfer để trừ token khỏi số dư của bể và ghi có vào địa chỉ chết. Ở đây không có cấp quyền cho bể hay rút thanh khoản: hợp đồng token trực tiếp kiểm soát bản ghi số dư của chính nó. Log 28 ghi nhận việc rút 78,106,360,248.121914264828922538 TENDRIL, chỉ còn lại 6,678 đơn vị gốc trong bể. Xét 18 chữ số thập phân của TENDRIL, lượng còn lại chỉ là 0.000000000000006678 TENDRIL. Đợt đốt này không đồng thời rút USDT. Gần như toàn bộ số dư TENDRIL biến mất, trong khi USDT trong bể vẫn sẵn sàng cho giao dịch hoán đổi tiếp theo. Việc từ bỏ quyền sở hữu không vô hiệu hóa đường truy cập này. Trong khối 131653426, trước sự cố, owner() trả về địa chỉ zero. Tuy nhiên, controlburn kiểm tra bộ điều khiển đã cấu hình chứ không kiểm tra owner(), nên đường truy cập này vẫn hợp lệ. Hàm không mở cho tất cả mọi người; bất kỳ người gọi nào cũng sẽ trượt kiểm tra cấp quyền. Việc đặt lại dự trữ cho phép rút gần như toàn bộ USDT. Bộ điều khiển gọi sync() ngay sau khi đốt, ghi nhận số dư token sau khi bể bị rút cạn trước khi phần token bán còn lại đến. Log 29 đặt dự trữ thành 4,421,023.357469283419586501 USDT và 0.000000000000006678 TENDRIL. Sau đó, 27,337,226,086.842669992690122889 TENDRIL đi vào bể. Giao dịch hoán đổi cuối cùng rút 4,421,023.357469283419586499 USDT, chỉ còn lại 0.000000000000000002 USDT. Công thức tích không đổi giải thích quy mô đầu ra này. Bỏ qua phí và làm tròn để minh họa, có thể tính lượng USDT đầu ra bằng cách nhân dự trữ USDT với lượng token đầu vào, rồi chia cho tổng dự trữ token và lượng token đầu vào. Khi dự trữ token được ghi nhận gần bằng 0, lượng đầu vào chi phối mẫu số, và đầu ra tiến gần toàn bộ dự trữ USDT. Lượng rút ra cuối cùng lần này không phải lượng ròng được lấy khỏi bể. Tổng dòng USDT chảy ra đạt 5,117,517.824288279504509510, trong khi tổng dòng vào là 4,561,847.285535350596034371. Trừ hai số này cho nhau thu được dòng ra ròng 555,670.538752928908475139 USDT. Mã hợp đồng và diễn biến lịch sử đã tái dựng toàn bộ trình tự. Đợt đốt token do lệnh bán này kích hoạt được tái dựng bằng mã nguồn đã xác minh, các lời gọi lịch sử, nhật ký sự kiện và dấu vết mã lệnh thông qua một block explorer. Sau khi biên dịch lại với Solidity v0.8.24+commit.e11b9ed9, tắt tối ưu hóa, mã runtime thực thi tại khối 131653426 khớp với bytecode hợp đồng, không tính metadata của trình biên dịch. Các tham số đốt được giải mã khớp chính xác với lượng được chuyển từ bể đến địa chỉ chết. Các phép toán số nguyên cũng tương ứng đúng với phần thuế, lượng token còn lại để bán và số dư dự trữ. Tổng nguồn cung không đổi giữa các khối liền kề trước và sau giao dịch. Giao dịch sự kiện thành công này xuất hiện trong khối 131653427. Biên lai xác minh qua hai điểm cuối RPC công khai của BNB Chain khớp nhau, và khi rà soát vào ngày 6/11/2026, dòng USDT ở cấp địa chỉ hoàn toàn nhất quán. Bài viết này được tạo với sự hỗ trợ của trí tuệ nhân tạo và được đội ngũ biên tập rà soát.