June 15, 2026
|
Exploit Postmortem

ONTR Token's $98.3K Loss and How Olympix Would Have Prevented It

Date: May 28, 2026

Chain: Ethereum mainnetLoss: approximately $98.3K (49.4801 WETH)

Class: broken access control and unauthorized balance inflation

Status: in scope for pre-deployment analysis, preventable

Summary

On May 28, 2026, the ONTR token was drained of roughly $98.3K in WETH. The contract carried two code-level flaws that worked together. Its onlyOwner modifier treated a renounced owner as a pass-all condition instead of a lock, and the contract contained obfuscated functions that could inflate an account balance without changing total supply or emitting transfer events. After the creator renounced ownership, which holders widely read as a safety guarantee, an attacker called transferOwnership() to take the supposedly locked contract, fabricated a token balance out of nothing, and sold it into the ONTR/WETH pool to extract real WETH. No keys were stolen. Every step ran through the contract's own logic, and both flaws were present in the source before the token ever reached mainnet.

Background

Renouncing ownership is one of the most common signals a token project uses to reassure holders. Setting the owner to the zero address is supposed to permanently disable owner-only functions, removing the team's ability to mint, pause, or otherwise interfere with the token. Holders, listing sites, and many automated scanners treat a renounced contract as safer by default.

ONTR inverted that assumption. Renouncement did not lock the contract. It opened it.

Root Cause

There were two distinct contract-level vulnerabilities, both written in the token's own Solidity and both present before deployment.

The first was an access control flaw in the onlyOwner modifier. Rather than requiring the caller to be the current owner, the guard treated owner == address(0) as an authorized state. A correct implementation locks every owner-only function the moment ownership is renounced. This implementation did the opposite. Once the owner was set to the zero address, the modifier passed for any caller, so every owner-gated function became publicly callable.

The second was an unauthorized balance manipulation path. The contract included functions with deliberately uninformative names, desertJasper(), glenFlash(), and ashBud(), that could increase an address balance directly. The inflation changed a single account's balance by 1e30 base units while leaving totalSupply untouched and emitting no transfer or mint events. That breaks the core ERC-20 invariant that account balances and total supply move together and that balance changes are logged on-chain, which is also why the manipulation left no mint trail for explorers or holders to see.

Attack Flow

  1. The creator renounced ownership at deployment, setting owner to the zero address. On the surface this looked like a standard safety step.
  2. Because the onlyOwner modifier treated the zero-address owner as authorized, the attacker called transferOwnership() and assigned ownership to themselves, taking control of a contract that appeared locked.
  3. With ownership, the attacker called desertJasper() to stage hidden balances, then used glenFlash() to execute ashBud(), inflating an account balance by 1e30 base units. Total supply did not change and no events were emitted.
  4. The attacker sold the fabricated ONTR into the ONTR/WETH PancakeSwap pair, converting tokens that were backed by nothing into real WETH and draining the pool of 49.4801 WETH, approximately $98.3K.

Impact

The pool's WETH liquidity was extracted in full to the attacker, leaving holders with a token whose supply could be fabricated at will and whose price had collapsed against the drained pair. The loss was approximately $98.3K. Because the inflation bypassed total supply and event logs, the manipulation was invisible to anyone watching standard supply metrics until the WETH had already left the pool.

The Problem With Audit-Only Security

Most token and protocol security still rests on two things: a one-time audit before launch, and surface signals like renounced ownership or a verified contract. Both are treated as proof that a contract is safe. Neither tests whether the contract actually holds its guarantees.

A pre-launch audit is a snapshot. It reflects a specific version of the code at a specific moment, reviewed by hand under a fixed budget and timeline. Manual review is sample-based by nature, so a single inverted comparison inside a modifier or a set of deliberately misnamed functions can pass unnoticed, particularly when the code is built to look ordinary. The review also ends at launch, while the contract lives on-chain indefinitely and any later change reopens the gap. A clean report then becomes its own risk, because it produces confidence that verification is finished when it has only been sampled.

Surface signals are weaker still. Renounced ownership tells a holder that the owner address is the zero address. It does not tell them what the onlyOwner modifier does when the owner is the zero address. In ONTR the two diverged completely. The signal said locked. The code said open to everyone. Verified-source badges, renouncement, and a passing audit all describe the contract from the outside. None of them execute its functions against the invariants that actually matter, that ownership cannot be seized, that balances cannot move without supply moving, and that every balance change is logged.

ONTR is what happens when the security model stops at the audit and the surface. The flaws were not subtle consequences of some deep interaction. They were a guard that passed for the wrong caller and a function that minted balance off the books, both sitting in plain Solidity, both invisible to anyone trusting the signals instead of testing the code.

How Olympix Would Have Prevented It

Olympix moves security into development, where the code is written and changed, rather than treating it as a single gate before launch. Its tooling runs against the contract's own source continuously and automatically, so the question is never whether someone happened to read the right line, but whether the contract can be made to violate its guarantees.

For ONTR, both flaws fall directly in that path. BugPocer flags access-control conditions that an unauthorized caller can satisfy, including a guard that treats a renounced or zero-address owner as authorized, and it generates a proof-of-concept showing an arbitrary address passing the modifier and seizing ownership. It flags unauthorized balance and supply manipulation by testing the invariant that balance changes are matched by supply changes and logged as events, and it produces a proof-of-concept that demonstrates the off-the-books inflation and the resulting pool drain. Obfuscated function names and an inverted comparison do not hide behavior from analysis that tests the property rather than reading the prose.

The proof-of-concept is the part that changes the outcome. A finding tells a team a function looks risky. A working exploit, generated automatically and reproducible on demand, tells them exactly how the contract is drained and forces the fix before deployment. That is the difference between a contract that has been looked at and a contract that is provably secure against this class of attack.

This is not an argument against audits. A skilled human review remains valuable. It is an argument that an audit alone is not a security model, because it is a snapshot, and the surface signals stacked on top of it are not verification at all. Continuous, code-level analysis with automated proof-of-concept generation is what closes the gap between what a contract claims and what it can be forced to do.

Takeaway

Renouncing ownership is only as strong as the access-control code behind it, and a passing audit is only as strong as what it happened to sample. ONTR lost $98.3K because its security rested on signals that described the contract from the outside while its actual logic did the opposite of what those signals promised. The flaws were ordinary, present at deployment, and reachable by anyone, which is exactly the profile that pre-deployment, code-level analysis with proof-of-concept generation is built to catch. Security that tests a contract's guarantees, continuously and before it ships, is the difference between a token that looks safe and one that is. You can see Olympix find this class of flaw in your own contracts, with a working proof-of-concept for every finding, in a free demo.

On-Chain References

Vulnerable Token:0xf074865358b0dd039beee075831f8a2ae6b1f3f3
Attacker EOA: 0xE806B37A9F965bd9D54AaDf9560C78957550b760
Attacker Contract: 0xd7a33e89abc1ac5b2497d9589c81784a2bc52491
Victim Pair (ONTR/WETH): 0xd46d89f4675bc96328fbdeb443842cdb5fcd83fd
Transaction: 0x98f80eff0ce609606bb73cef3edfbb4c1d415ffc7676fec16f4d980c54903621

What’s a Rich Text element?

The rich text element allows you to create and format headings, paragraphs, blockquotes, images, and video all in one place instead of having to add and format them individually. Just double-click and easily create content.

A rich text element can be used with static or dynamic content. For static content, just drop it into any page and begin editing. For dynamic content, add a rich text field to any collection and then connect a rich text element to that field in the settings panel. Voila!

Headings, paragraphs, blockquotes, figures, images, and figure captions can all be styled after a class is added to the rich text element using the "When inside of" nested selector system.

  1. Follow-up: Conduct a follow-up review to ensure that the remediation steps were effective and that the smart contract is now secure.
  2. Follow-up: Conduct a follow-up review to ensure that the remediation steps were effective and that the smart contract is now secure.

In Brief

  • Remitano suffered a $2.7M loss due to a private key compromise.
  • GAMBL’s recommendation system was exploited.
  • DAppSocial lost $530K due to a logic vulnerability.
  • Rocketswap’s private keys were inadvertently deployed on the server.

Hacks

Hacks Analysis

Huobi  |  Amount Lost: $8M

On September 24th, the Huobi Global exploit on the Ethereum Mainnet resulted in a $8 million loss due to the compromise of private keys. The attacker executed the attack in a single transaction by sending 4,999 ETH to a malicious contract. The attacker then created a second malicious contract and transferred 1,001 ETH to this new contract. Huobi has since confirmed that they have identified the attacker and has extended an offer of a 5% white hat bounty reward if the funds are returned to the exchange.

Exploit Contract: 0x2abc22eb9a09ebbe7b41737ccde147f586efeb6a

More from Olympix:

No items found.

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