StonkHush

Chapter 07 · 5 min read

Security review

Our own read of both contracts, every finding checked against the code and marked open, by design or accepted.

  1. 7.1What was reviewed↓
  2. 7.2Solana program↓
  3. 7.3Robinhood Chain escrow↓

7.1

What was reviewed

Our own line-by-line read of both contracts, every finding checked against the code. It is not a third-party audit: it is here so you can see what we know about the code and what is still open. The same review sits in the contracts repository.

5 November 2026 · commit 2f14085 · 2 high, 4 medium, 8 low, 6 informational · no critical issue, and no path in the current code for anyone to take funds out of escrow (an upgrade could change that: S-1)

Reviewed
Both contracts at commit 2f14085, the code that is live on mainnet
Open
A fix is planned: by upgrade on Solana, by a new deployment on Robinhood Chain, whose contract can't be upgraded
By design
Intended, and described in these docs
Accepted
The risk is understood and kept, with the reason given
Not applicable
Checked, and the concern doesn't arise for this code

7.2

Solana program

lib.rs, the Anchor program

  • S-1The upgrade key and the admin are one walletThe program can be upgraded, and an upgrade can change what it does with escrow. Until the upgrade key moves to a multisig, trust in this one wallet is trust in the program.HighOpen
  • S-2Every fill needs the one matcher keyIf the matcher key is lost or the engine is down, nothing fills until the admin sets a new one. It can't move funds or fill at a price the owner didn't seal, and cancel never needs it.MediumAccepted
  • S-3set_config changes the admin in one step, with no empty-key checkA mistyped admin can't be undone, and an empty matcher would stop every fill. Planned: a propose-and-accept admin change and checks against empty keys.MediumOpen
  • S-4init_config isn't tied to the deployerWhoever calls it first becomes admin. On mainnet it was called by the deployer at launch, so this only matters for a fresh deployment. Planned: tie it to the upgrade key.LowOpen
  • S-5Config changes emit no eventsA fee, matcher or fee-wallet change is visible only by reading the config account. Planned: a Config event.LowOpen
  • S-6The fee is read at fill timeAn order pays the fee in force when it fills, which is 0.5% today and can never exceed the 1% cap written into the program.LowBy design
  • S-7Cancelling a sell needs your coin account to existThe coins go back to your token account for that coin. If you closed it, open it again, then cancel.LowBy design
  • S-8Coins sent straight into a filled order's vault keep it openOnly possible by sending coins to the vault by hand. The order can no longer fill, and its owner's cancel returns everything.LowAccepted
  • S-9The commitment doesn't cover the coinThe sealed hash covers price, payout and a 32-byte random salt. The site makes a fresh salt for every order, so no two orders share a commitment.InfoAccepted
  • S-10Coin extensions are checked when an order opensToken-2022 extensions are fixed when a coin is created and can't be added later. The program refuses transfer hooks, permanent delegates, pausable and frozen-by-default coins up front.InfoNot applicable

7.3

Robinhood Chain escrow

StonkHushEscrow.sol

  • E-1Admin, matcher and fee wallet are single walletsNo multisig and no timelock yet. The contract can't be upgraded and the admin can't move escrow, so the reach is the fee (capped at 1%), the fee wallet, the matcher and pausing.HighOpen
  • E-2setConfig accepts an empty matcherWith the matcher set to the zero address, a malformed approval would pass and anyone could fill. The matcher has never been zero; the contract can't be upgraded, so the next deployment rejects it and until then setting it to zero is ruled out.MediumOpen
  • E-3The matcher is trusted for liveness and sees sealed pricesEvery fill needs a fresh approval from the matcher, which knows the prices it matches. It still can't fill at any price other than the sealed one, or touch a cancel.MediumBy design
  • E-4Coins sent to the escrow's own address are strandedIf a buyer names the escrow contract as the recipient, the coins land in it with no owner. The site never does; the next deployment rejects it.LowOpen
  • E-5A payout contract that refuses ETH blocks its own orderProceeds and refunds are pushed in ETH. Use a wallet, not a contract that rejects ETH, as your payout address.LowBy design
  • E-6The fee is read at fill timeSame as on Solana: the fee in force when the order fills, never above the 1% cap.LowBy design
  • E-7Crosses settle at the midpointWhen two resting orders meet, they trade halfway between the two sealed prices: the seller gets at least their ask, the buyer pays at most their bid, and both prices become public.InfoBy design
  • E-8The signing domain is fixed at deploymentMatters only if Robinhood Chain ever split in two; approvals also name this contract and expire within two minutes.InfoAccepted
  • E-9One dust take fails the whole batchA fill too small to cover its fee reverts the transaction it is in. Nothing moves, and the fill can be sent again without it.InfoAccepted
  • E-10Rebasing coins aren't trackedA coin whose balances change without a transfer would drift from what escrow booked. Pons coins are standard ERC-20s; transfer-tax coins are supported.InfoAccepted

Your private trading desk.

This StonkHush preview is not connected to a deployed trading contract. Wallet connections and transactions are not enabled.