All articles
Comparisons·June 6, 2026·5 min read

In-House Review vs Third-Party Audit: What TON Founders Get

Third-party smart contract audit TON teams need before mainnet: what in-house review catches, what it misses, and when skipping it is safe.

What an In-House Review Actually Catches

A competent internal team catches the obvious stuff, and on TON that's not nothing. If your dev wrote the jetton minter and someone else on the team reviews it before deploy, you'll typically catch: wrong op-code constants, missing throw_unless guards on admin functions, gas estimates that don't cover worst-case forward fees, and the classic "forgot to update total_supply before emitting the transfer notification" bug. Self-review also catches logic errors that show up in normal testing — a burn function that doesn't actually decrement supply, a royalty percentage that's off by a decimal, an NFT collection contract that lets change_owner be called by anyone because someone copy-pasted the message parser from a different contract and forgot to swap the sender check.

If your team runs the contract through func -APS for cell/gas analysis and writes a handful of test cases in Sandbox (the TON testing framework most teams use with @ton/sandbox), you'll shake out maybe 60-70% of the bugs that would actually cause a loss of funds. That's a real number, not a guess — it roughly matches what we see when we're brought in after a team already did their own pass: most of the "easy" stuff is gone, and what's left is the stuff that doesn't show up when you're testing the happy path.

What It Almost Never Catches

Here's the part founders underestimate. In-house review almost never catches bugs that require an adversarial mindset rather than a "does this work" mindset. Three patterns we see constantly on TON specifically:

Spoofed jetton wallet callbacks. TON's jetton standard means every wallet contract is deployed per-owner, and a receiving contract has to verify the sender is the legitimate jetton wallet for that jetton master — not just any contract claiming to be one. A team testing their own code calls the real wallet every time, so this never breaks in their tests. An attacker deploys a fake wallet contract that sends a forged transfer_notification and drains whatever logic trusted the sender blindly.

;; VULNERABLE: trusts the sender without verifying it's the real jetton wallet
() recv_internal(int msg_value, cell in_msg_full, slice in_msg_body) impure {
    int op = in_msg_body~load_uint(32);
    if (op == op::transfer_notification()) {
        int jetton_amount = in_msg_body~load_coins();
        slice from_address = in_msg_body~load_msg_addr();
        ;; credits balance immediately — no check that ctx_sender
        ;; equals the expected jetton wallet address for this master+owner
        credit_balance(from_address, jetton_amount);
    }
}

The fix requires computing the expected wallet address on-chain (via calculate_user_jetton_wallet_address with the jetton master's stored code/data) and comparing it against the actual sender before trusting the payload. It's a two-line check that almost nobody writes unless they've been burned by it or read an audit report that flagged it.

Bounce handling gaps. TON messages can bounce, and if your contract sent coins expecting a callback that never arrives because the target rejected the message, funds get stuck or state gets inconsistent. In-house testing rarely simulates bounced messages because the test flow is written to succeed.

Replay and message ordering assumptions. Teams write logic assuming messages arrive in the order they were sent. TON doesn't guarantee that across different chains of message hops. An auditor who's fuzzed twelve other jetton contracts checks this reflexively; a founder's dev team checks it only if it's bitten them before.

This is the actual gap. In-house review is bounded by what the author already knows to look for. A third-party audit brings a threat model built from every other contract the firm has broken.

What a Third-Party Audit Adds Beyond Bugs

Bug-finding aside, an external audit gives you two things self-review structurally cannot: a public artifact and a fresh set of assumptions. The report itself is a trust signal — investors, launchpads, and DEX listing teams increasingly ask for it before they'll touch a TON token launch, and "we reviewed it ourselves" doesn't satisfy that ask. Second, a paid external team has no stake in the code being fine. Your own engineer, even a careful one, has a mild unconscious incentive to conclude the thing they built is safe. An outside reviewer's job is literally to prove it isn't.

There's also a methodology difference worth naming: a good audit combines manual review with static analysis and, for anything handling meaningful value, targeted formal checks on critical invariants (supply conservation, access control, upgrade paths). We've written before about how manual review compares against automated scanners across Solana and EVM, and the short version holds on TON too — tooling catches patterns, humans catch intent mismatches. For contracts where getting an invariant provably right matters more than finding known bug classes, it's also worth understanding where formal verification actually adds value over manual audit.

In-House Review vs Third-Party Audit

In-House Review Third-Party Audit
Cost Engineer time only $3k–$25k+ depending on scope
Timeline Days 1–3 weeks typical
Catches syntax/logic bugs Yes, mostly Yes
Catches adversarial patterns (spoofed callbacks, replay) Rarely Consistently
Produces a public report No Yes
Credible to investors/launchpads No Yes
Blind to author's own assumptions No — same blind spots Yes — independent threat model
Covers FunC and Tact idioms equally Depends on team experience Should, if the firm knows both (worth confirming — see our FunC vs Tact security comparison)

Which to Pick When

Skipping external audit before mainnet is a real option only in narrow cases: a testnet-only deployment, a contract with no user funds at risk, or genuinely disposable internal tooling. For anything holding a jetton treasury, minting NFTs with real royalty flows, or handling user deposits, in-house review alone is not a substitute — it's a first pass. Do both, in order: internal review to strip out the obvious mistakes cheaply, then an external audit to catch what your own team structurally can't see and to get the report you'll need for listings and investors.

If you're unsure how much scope you actually need before mainnet, a short strategy consultation upfront can right-size the engagement instead of over- or under-scoping it. For teams that want the review depth without a full audit price tag, a code review is a reasonable middle step before committing to the full process.

Get a second, adversarial set of eyes on your TON contract before mainnet — start with a third-party smart contract audit.

Need a bot like this built?

We design, build and run trading bots on Solana, Hyperliquid and Polymarket.

Start a project
#TON#smart contract audit#jetton security#FunC#comparisons