Security
The contracts were reviewed with V12, Zellic's automated AI auditor (run #8519), together with the Slither and Aderyn analysers. This is an automated review, not a manual audit.
V12 reported 110 findings and its own triage ruled out 82. Each of the other 28 was checked by hand against the code.
Download the report (PDF)18
Fixed
2
Fixed in code
8
Acknowledged
Fixed: the contracts that held no user money yet — FORGE staking, the stock-paired curve and the direct-launch tokens — were replaced on 29 Sep 2026 and verified. Fixed in code: the ETH curve holds FORGE's own launch and stays; both issues need unusual conditions and move no user balance. Acknowledged: the reason is given for each.
Found in our own review, October 2026
A graduating coin's pool could be opened first, at someone else's price
When a coin graduated, the contract that opens its Uniswap pool accepted a pool someone had already opened at a price of their own, and added the coin's liquidity there — which would let that person take part of the funds the curve raised. It was found in an internal review, not by V12. Robinhood Chain launches were paused the same day; the only coin on those contracts was the platform's own. The upgraded contracts will open the pool through a hook that only ForgePad's own contract can use, at the curve's final price.
The upgraded contracts — internal review, October 2026
The upgraded Robinhood Chain contracts fix the flaw above, move every fee to 85/7/8 and add the weekly jackpot. They were reviewed line by line, tested against the real Uniswap v4 on a copy of the chain — the attack replayed and refused — and deployed on Robinhood testnet, where their source is verified. This is an internal review, not an independent audit; one comes before mainnet.
- R1-C01CriticalFixedForgeV4LiquidityManager
Graduation pool could be created early by anyone, at any price
The flaw that paused launches. Every ForgePad pool is now keyed with ForgeInitGuardHook, which lets only the manager create it; a graduation requires a fresh pool at the curve's own price. Replayed against the real Uniswap v4 on a fork of the chain: refused.
- R1-H01HighFixedForgeV4LiquidityManager
A creator's own pool could be created first at someone else's price
The direct-launch path refuses any token a curve created, and joining an existing pool requires the deposit to match its price within 1%.
- R1-M01MediumFixedForgeJackpot
Jackpot could list only 16 tokens; other stocks' fees would be burned
Raised to 128 (the stock curve lists about 80); a claim walks only the tokens its round held.
- R1-M02MediumFixedForgeRevenue, ForgeLockedLiquidity
Gas-capped payouts were open to a return-data bomb
Payouts now copy no return data.
- R1-M03MediumFixedForgeJackpot
A misbehaving listed token could block a jackpot close or claim
Token calls run with bounded gas; a failure is skipped, or kept for the winner to withdraw.
- R1-L01LowFixedForgeTokenFactory
Direct-launch creation fee had no ceiling
Capped at 0.05 ETH, with an event on every change.
- R1-L02LowAcknowledgedForgeJackpot
The draw uses an L2 block hash, not a VRF
No VRF on Robinhood Chain. The hash is the sequencer's, and someone watching alone could decline to draw and let a block expire; drawing is open to anyone and pays a small reward, so a draw does not wait.
- R1-L03LowAcknowledgedForgeRevenue
Fee tickets go to the account that called the curve
A trade routed through another contract credits that contract; a prize it cannot claim returns to the pot after 8 weeks.
- R1-L04LowAcknowledgedForgeV4LiquidityManager
An allowed curve could block a graduation
Only the owner (the Safe) can allow a curve; it could make a coin's graduation revert, never take its funds.
On Robinhood testnet — mainnet will use the same addresses:
- ForgeJackpot0xb220…1111Source
- ForgeRevenue0x5c93…1111Source
- ForgeLockedLiquidity0x9B68…1111Source
- ForgeInitGuardHook0x2C00…6000Source
- ForgeV4LiquidityManager0x47c8…1111Source
- ForgeIgnition0xd81F…1111Source
- ForgeIgnitionQuoted0x0D93…1111Source
- ForgeTokenFactory0xf3f6…1111Source
Every open finding
- #294379CriticalFixedForgeHolderRewards
Owner can sweep all staked FORGE principal
Confirmed. sweepUnregistered now refuses FORGE. Nothing was staked when it was replaced.
- #294378CriticalFixed in codeIgnitionHoldBonus
Abandoned pot sweep leaves later graduation claims unfunded
Confirmed. The abandoned sweep now zeroes the pot. Needs a launch left open for 365 days; the live ETH curve (which holds FORGE) keeps the old code, the new stock curve has the fix.
- #294148CriticalFixedForgeIgnitionQuoted
Halt strands pot after all tokens are sold
Confirmed. With nothing sold the pot stays for the sweep instead of merging into an unredeemable reserve.
- #294249CriticalFixed in codeForgeIgnition
Untracked ETH can be permanently stranded
Confirmed, low impact: ETH sent to the contract by mistake, and rounding dust refunded at graduation, have no withdrawal path. No user balance is affected. Recovery path planned for the next curve version.
- #294085HighFixedForgeIgnitionQuoted
Quoted fee payouts can block trades
Confirmed. A payout the asset refuses (issuer blocklist, rejecting hook) is now kept as owed and withdrawable; it can no longer revert a trade.
- #294358HighFixedForgeIgnitionQuoted
Reverting quoted-fee recipients can halt curve trading
Same fix as #294085.
- #294401HighFixedForgeIgnitionQuoted, IgnitionHoldBonus
Unchecked uint128 casts corrupt curve and bonus accounting
Confirmed for tokens with more than 2^128 units (open pairs only). All narrowing now uses SafeCast. Not reachable on the ETH curve.
- #294146HighAcknowledgedForgeIgnitionQuoted
Graduation vulnerable to fee-on-transfer quote assets
Open pairs only (any token the creator chooses). Verified pairs are Robinhood stock tokens without transfer fees. Open pairs are marked unverified with an explicit risk warning.
- #294396HighAcknowledgedForgeIgnitionQuoted
Nominal outbound payouts underpay for lossy quote tokens
Same scope and mitigation as #294146.
- #294335HighFixedForgeDividendToken
Native deposits forge token claims
Confirmed and serious: 1 wei of ETH could make every reflection claim revert, or drain an ERC-20 reward pool. ETH is now refused unless holders are paid in ETH. 0 such tokens existed.
- #294336HighFixedForgeDividendToken
Threshold changes leave stale shares
Confirmed. Claiming syncs shares first; anyone can sync an account.
- #294339HighFixedForgeDividendToken
Unbounded shares break dividend arithmetic
Confirmed for extreme supplies. Supply is now capped at 2^112 units.
- #294340HighFixedForgeDividendToken
Eligibility deadlock permanently traps rewards
Mitigated: the minimum balance is capped against circulating supply (burned tokens excluded).
- #294351HighFixedseveral
Native payout failures can block or forfeit entitlements
Staking: claimTo lets a staker send rewards to another address. Curve sells and creator claims pay the caller's own address by design.
- #294356HighFixedForgeHolderRewards
Reward synchronization strands rounding residuals
Confirmed (dust). The remainder is now carried to the next sync.
- #294380HighFixedForgeHolderRewards
A failing reward asset blocks claims for all assets
Confirmed. claimTo(to, assets) claims asset by asset.
- #294357HighAcknowledgedForgeLockedLiquidity
Synchronous fee payouts can freeze locked-position collection
Confirmed for stock-paired pools whose creator is blocklisted by the stock's issuer: that one position's fees wait. Other positions are unaffected. The locker is bound to the manager and cannot be replaced; deferred payouts are planned for its next version.
- #294368HighAcknowledgedForgeV4LiquidityManager
Whole-balance refunds let callers sweep manager assets
Confirmed. Only affects assets left in the manager by mistake; it holds nothing between operations.
- #294388HighAcknowledgedForgeFlywheel
Spot-derived buyback floor permits sandwich attacks
Design limitation. Configured at 0.25 ETH per call, 1 hour apart; these are settings the owner can change, not hard limits. A round trip pays 0.8–1% twice in fees. The relaunch makes the limits constants and prices the buyback over two points 30 minutes apart.
- #294293MediumFixedForgeIgnitionQuoted
Blocked assets bypass curated admission
Confirmed. Every launch path now refuses a blocked asset.
- #294398MediumFixedForgeIgnitionQuoted
Owner can force healthy launches into redemption
Confirmed. halt() now requires the asset to be publicly blocked first.
- #294331MediumFixedForgeTokenBase
Pair label bypasses sell-tax ban
Confirmed. On Robinhood Chain no second pair can be added and a transfer into the pool is always a sell.
- #294332MediumFixedForgeTokenBase
Unbounded limits can freeze holders
Confirmed. Limits are capped at 100%.
- #294338MediumFixedForgeDividendToken
Payout callback bypasses token controls
Confirmed. ETH and ERC-20 payouts no longer run under the swap lock.
- #294341MediumFixedDividendPayingUpgradeable
Distribution remainders are permanently stranded
Confirmed (dust). The remainder stays queued for the next distribution.
- #294034LowAcknowledgedForgeIgnition, IgnitionCurve
View quotes can revert on zero-amount inputs
View functions only; trades are unaffected.
- #294361LowAcknowledgedForgeIgnitionQuoted
Trade quotes can report outcomes that execution rejects
Quotes are estimates; the app applies the caps before sending.
- #294362LowAcknowledgedForgeTokenBase
Wallet cap checks gross rather than net amount
Conservative: a cap can bind slightly early on a taxed buy.
The contracts, verified
The source code of each one matches what runs on chain exactly. Read it yourself.
- ForgeHolderRewards (new)0x162c…8DC2Source
- ForgeIgnitionQuoted (new)0xA069…3768Source
- ForgeToken implementation (new)0xD436…4719Source
- ForgeDividendToken implementation (new)0xF878…1445Source
- ForgeIgnition0x705c…7dEeSource
- ForgeRevenue0xA498…E9EESource
- ForgeV4LiquidityManager0xD52B…478aSource
- ForgeLockedLiquidity0x2465…6af9Source
- ForgeFlywheel0x8984…3433Source
- ForgeTokenFactory0x93C2…57B8Source
- Earlier FORGE coin on Robinhood Chain (retired)0xb9a4…a221Source