October 20, 2026
|
Exploit Postmortem
Cover image for "DLMC Token's $226K Loss and How Olympix Would Have Prevented It"

DLMC Token's $226K Loss and How Olympix Would Have Prevented It

Date: June 24, 2026

Chain: BNB Chain

Loss: 226,119.12 USDT, about $226K, the DLMC contract's entire USDT reserve

Class: price formula that leaves contract-held tokens out of the supply

The attacker who drained DLMC Token on June 24, 2026 sold just 65,908.69 DLMC to do it. Those tokens had arrived a few moments earlier as a referral bonus, and the DLMC contract bought them back at nearly $25 each, paying out 1,646,119.12 USDT from its reserve. According to Defimon's alert, the same token had been priced at about $0.10 before the transaction started.

Everything happened in one transaction at 11:15:10 UTC. A flash loan funded two large purchases, the purchases pushed DLMC's internal price from about $0.10 to about $25 by Defimon's count, and the bonus tokens were sold at the new price. The contract's price formula divided its USDT reserve by the supply held outside the contract, and every purchase grew the reserve while sending most of the newly minted tokens to the contract itself, where the formula didn't count them.

A Token That Sets Its Own Price

DLMC didn't trade against an outside pool for its main price. According to Defimon, it ran an internal bonding curve: the contract held a USDT reserve, sold newly minted DLMC to buyers through buy(), and bought DLMC back through sell(), with a live price recalculated in a function called _updatePrice(). Buyers could register under referrers, and the contract's referral and level logic paid bonus tokens up the chain whenever someone below made a purchase.

Defimon gives the formula as livePrice equal to the USDT reserve divided by circulating supply, where circulating supply leaves out the tokens the contract itself holds. Crypto Times describes the same rule as reserves divided by external supply only. Crypto Times notes the project had claimed its ownership was renounced, and the DLMC contract's owner function does return the zero address.

A Denominator That Missed the New Tokens

Each purchase put USDT into the reserve and minted new DLMC, but the exploit transaction shows that nearly all of the new tokens went to the DLMC contract's own address. That raised the numerator of the price formula by the full purchase while barely moving the denominator, since the denominator skipped exactly the address receiving the new supply. A large enough purchase therefore raised the price for everyone who already held DLMC, including anyone holding bonus tokens they'd paid nothing for.

The lesson is that a price built from a ratio has to count every claim on the reserve in its denominator. Tokens sitting in the contract weren't out of circulation in any meaningful sense, because the same contract paid them out as referral bonuses, and once paid out they could be sold back against the reserve at the inflated price. It's like valuing a company's shares by counting only the ones outside the vault, while the vault keeps handing shares to employees who can sell them the same afternoon.

Two Buys and a Sell

The attacker's wallet, 0x74C4a756933d0f713FacB1dEa325ef511646C3b1, deployed an attack contract that flash-borrowed 1,420,000 USDT from a PancakeSwap pair. According to Crypto Times and Defimon, it worked through two helper contracts registered as affiliates, the second one under the first.

The first helper, 0xe81bf6e392eca9ad594b5452ea53cf7071760a04, bought with 420,000 USDT. The DLMC contract minted 865,163.19 DLMC to its own address and passed only small portions of it on to other addresses. The second helper, 0x8b5a72c4ce0d3a7676ce06b8e42aeb255bba476e, bought with 1,000,000 USDT, and the contract minted 1,839,009.85 DLMC to itself. Out of that second purchase, the contract sent 73,560.39 DLMC to the first helper, the upline bonus Defimon describes. Crypto Times reports the internal price rising to nearly $25 after the buys, from about $0.41 by its count.

The first helper then sold 65,908.69 DLMC back to the contract, staying just under what Defimon describes as a sell cap of four times the helper's investment. The contract paid 1,646,119.12 USDT for them and, according to Defimon, its reserve fell to 6 wei. Since the attacker had put 1,420,000 USDT in through the two buys, the contract's net loss was 226,119.12 USDT, which was everything it held before the transaction. The attack contract repaid the flash loan with 1,423,558.90 USDT and sent the remaining 222,560.22 USDT to 0x701bB7B460AE231dBbCFa3d87f0Ab5B458429699, the figure TenArmor and Crypto Times reported as the loss.

From BNB Chain to Tornado Cash

AMLBot reported on June 28 that the attacker had swapped the funds, bridged them to Ethereum through Li.Fi and Mayan Swift, and deposited 37 ETH into Tornado Cash in 10 ETH and 1 ETH notes. As of October 20, 2026, we hadn't found a post-mortem or recovery statement from the DLMC team.

How Olympix Follows a Reserve Through a Price Formula

Olympix reads DLMC as an attacker would, as states, transitions and entry points, and it takes in what the token is meant to do, sell and buy back against its own reserve with referral bonuses on top, to infer the invariants the code relies on but never states. The states that matter are the USDT reserve, the contract's own token balance and the supply held outside it, and buy(), sell() and the bonus logic are the transitions that move them. The engine flags the signal in _updatePrice(): a price computed from a balance anyone can increase with a purchase, divided by a supply figure that excludes the very address the purchase mints to.

The invariant fits in a sentence: no sequence of buys and sells in one transaction should let anyone withdraw more USDT from the reserve than they put in. BugPoCer works outward from that rule. It runs Counterexample-Guided Invariant Refutation, inferring the invariant from how buy(), sell(), the bonus payouts and the price update fit together, and executing paths until one breaks it. Paths that never move the price drop out quickly, and the ones left are those where a large buy is followed by a sale of tokens the seller didn't pay for.

The counterexample is the June 24 transaction, produced in development. Register one account under another, buy heavily through the second so the first earns bonus tokens while the price climbs, and sell those bonus tokens at the new price. BugPoCer reports that sequence with its minimal conditions, borrowed USDT and a two-level referral chain, plus a generated Forge test that replays it and shows the reserve emptying. It runs automatically as code is written, at every merge and before release, so a pricing change like this one shows up before the contract ever holds a reserve.

Counting Every Token That Can Come Back

DLMC's reserve depended on one ratio staying honest, and the ratio left out the tokens most likely to come back for USDT. Pricing from total supply, or from supply that includes everything the contract can still distribute, would have kept a purchase from inflating the value of free bonus tokens. To see how Olympix tests the pricing and payout paths in your own contracts and hands back a runnable counterexample when one drains the reserve, book a technical walkthrough.

On-Chain References

Protocol: DLMC Token

Chain: BNB Chain

Date: June 24, 2026, 11:15:10 UTC

Loss: 226,119.12 USDT net from the DLMC reserve (attacker profit 222,560.22 USDT)

Attacker EOA: 0x74c4...b3c1

Attack contract: 0x4adb...414e

Helper contract 1 (upline): 0xe81b...0a04

Helper contract 2: 0x8b5a...476e

DLMC contract (victim): 0xf2ca...bdf2

Flash-loan pair: 0x16b9...0dae

Profit receiver: 0x701b...9699

Exploit tx: 0x1510...1306

Block: 106091607

Sources

Defimon Alerts: DLMC Token Loss ~$226K

Crypto Times: DLMC Token on BNB Chain Loses Approximately $222,600 in Flash Loan Exploit

AMLBot: DLMC Attacker Funds Moved to Tornado Cash

More from Olympix:

No items found.

Ready to Shift Security Assurance In-House? Talk to Our Security Experts Today.