Skip to content
NutShell

NutShell

Verified crisis detection that buys real downside

Created on 5th September 2026

•

NutShell

NutShell

Verified crisis detection that buys real downside

The problem NutShell solves

Crypto moves on news before it moves on price.

When a bridge is drained or a lending market halts, the information is public
minutes before the oracle catches up. If you are asleep, at work, or just not
refreshing Twitter, you absorb the entire move.

The obvious defence is to hold put options all the time. Almost nobody does,
because permanent protection costs several percent of notional a year against a
yield of a few percent. It is negative carry by construction, so protection has
to be event driven. That moves the hard part somewhere else: an event driven
hedger is only as good as its trigger. Fire on rumour and you burn premium on
every false alarm. Wait for confirmation and you buy insurance after the crash.

NutShell is the trigger. It reads eight public newswires continuously,
measures each claim against Base mainnet itself, has three independent AI models
score it, and buys a real protective put on Thetanuts only when the evidence and
the models agree.

Who it is for

  • Anyone holding ETH, BTC or SOL who cannot watch the news 24/7. The agent
    watches instead, and it can only ever spend a capped premium budget.
  • Small DAO treasuries with no risk desk. Automated, bounded downside cover
    with a written reason attached to every trade.
  • Anyone who just wants a claim checked. The verification page is public and
    needs no wallet. Paste a headline, get three named models scoring it with their
    request ids.

What it actually changes

BeforeWith NutShell
You find out when the price already movedThe agent reads the wire and the chain in the same minute
Protection costs more than the position earnsOne dollar of premium bought $912 of ETH downside cover, about 0.1% of notional
"The AI said so"Every verdict names its model, shows its request id, and the id resolves on Gonka's chain
A hedge is a number in a spreadsheetEvery position traces back to the exact sentence that bought it, under one id

Premiums come out of vault yield. Principal is never touched. The agent runs on a
policy bounded burner wallet that can do exactly one thing, buy a protective put,
against exactly one allowlisted contract, under a hard per trade ceiling.

Live on Base mainnet. Four real fills, real USDC, all verifiable on BaseScan.

Challenges we ran into

The evidence layer was confidently wrong before it was useful

Our biggest failure was not a crash. It was a correct measurement driving a wrong
conclusion.

A scripted claim said $40M had been drained from a Base bridge. Our oracle check
compared Base DEX spot against Chainlink, found them agreeing to within 0.14%,
and returned CONTRADICTS. Both models then scored the claim FAKE at 22 and 25,
both citing that exact reading, and the decision fell from HEDGE_SMALL to REJECT.

The measurement was right. The inference was garbage. $40M is roughly 0.014% of
ETH's market cap, so a drain that size need not move the price at all. Price
agreement is not evidence that no drain occurred, but the model had no way to
know that.

We fixed it by classifying what a claim actually asserts (price, custody, or
halt) and letting each check contradict only claims about the thing it measures.
Corroboration stays unrestricted, because finding real distress is always worth
surfacing, while wrongly ruling out a true report is the error that costs someone
a hedge. After the fix the same scenario returned zero contradicting checks and
MiniMax scored it 68 REAL.

A related one: we pointed a balance check at Aave v3's Pool contract and it
reported 114 USDC while DeFiLlama showed billions in TVL. Aave v3 holds reserves
in aTokens. We were measuring an address that never custodies anything and
reporting "no drain" with total confidence. Now an address below a custody floor
returns INCONCLUSIVE instead of a reassuring zero.

Thetanuts: the order book has traps that only fail on-chain

Spreads look like puts. Filtering on isCall === false seemed obviously
right. Every longer dated order we selected that way reverted with
Panic(17) OVERFLOW inside the contract. Their calldata carries two or three
strikes: they are spreads, not vanilla puts. We now require exactly one strike
before an order is fillable.

previewFillOrder echoes your own input back. Its totalCollateral field
returns the budget you passed in, not a computed charge, so it can never reveal a
shortfall. We had been approving against it and were only accidentally correct,
because integer flooring means the real charge always lands just under the
budget. Worth knowing before it bites someone else.

A fill reverted with "transfer amount exceeds allowance" against an allowance
that was sufficient.
We chased four wrong theories (unmined approval, wrong
variable, rounding, a referrer fee) before static calling the fill against every
candidate order and finding all of them would succeed. The approval had mined on
one node while our eth_call was served by another a block behind. A stale read,
not a logic bug. Retrying filled it.

There is no early exit. We tested it rather than assuming: close() reverts
unless one address holds both sides, reclaimCollateral() is seller only, and
nothing bids for puts. Recovery on abandoning a hedge is 0%. That single fact
reshaped the product, because if you cannot undo a purchase then the only place
you can save money is before you make it. It is why agreement gates spending.

Gonka: the model catalogue can lie to you

GET /models listed moonshotai/Kimi-K2.6. Every POST /chat against it
returned 400 unsupported model, naming in its own error body the two models it
would actually serve. A health check that trusts the catalogue reports a full
three model panel while live runs quietly fail quorum, which is exactly what
happened to us.

So we stopped asking the catalogue and started judging on outcomes. The call path
records success and failure per model in a rolling window, and a model that
resolves but has answered nothing is reported as unusable. The health endpoint
cannot be contradicted by the thing it is checking.

Two more, both measured: streaming silently disables the SDK timeout, because
the HTTP response opens immediately, so one queued call ran 600s past a 120s
budget. We stayed non-streaming. And node selection happens upstream, so the
same model answers in under a second or in 40 seconds depending which node takes
it. We send a duplicate request at 14s and take whichever lands first, which
turns a straggler into a fast vote instead of a lost one.

Tracks Applied (3)

BEST PRODUCT BUILT ON THE THETANUTS SDK

Does it work? Yes, and it is running, not described. Four options bought on Base mainnet with real USDC, each one a depl...Read More

Thetanuts Finance

AI × OPTIONS

**The bar is one real on-chain trade against live pricing, and we cleared it four times.** | Asset | Strike | Entry tra...Read More

Thetanuts Finance

AI For Society

The challenge names an AI Fact Checker as the preferred application: a decentralized truth engine using multi-model infe...Read More

Gonka Router

Discussion

Builders also viewed

See more projects on Devfolio