Bug bounty review log
Time-boxed static reviews of in-scope code, done only on local clones. No mainnet interaction, no testing against live contracts. Findings, if any, are handed to the user to submit through the program; the user needs an Immunefi account (some programs also require KYC).
How targets are picked
The unofficial Immunefi mirror publishes every program's scope with timestamps:
https://raw.githubusercontent.com/infosec-us-team/Immunefi-Bug-Bounty-Programs-Unofficial/main/projects.json.
Filtering on 3 Sep 2026 for programs with GitHub-hosted smart-contract scope
and assets added in the last 90 days gave the shortlist below. Newer code has
had less review time, which is the only edge a few hours of reading can have
against protocols that already pay for audits.
| Program | Launched | Max bounty | KYC | Notes |
|---|---|---|---|---|
| audit-comp-firelight-1 | 12 Aug 2026 | $20,000 pool | no | Audit competition, submissions closed 25 Aug; in evaluation until 30 Sep. Out. |
| enzyme-onyx | Sep 2025 | $200,000 | no | Scope expanded 30 Jul 2026 with Chainlink ACE compliance integration. Reviewed below. |
| gmtrade | Jul 2026 | $100,000 | no | Solana perps (Rust). Candidate for a later session. |
| 1inch-aqua | Jun 2026 | $100,000 | yes | New 1inch liquidity system + swap-vm. Also the subject of an ETHOnline bounty. Candidate for a later session. |
| sbtc | Jul 2026 | $250,000 | yes | Rust/Clarity. Candidate. |
| horizen | Jul 2026 | $10,000 | yes | Small. |
2026-09-03: Enzyme Onyx (commit 7b48d24, ACE integration scope)
Files read in full or in their money-moving paths: src/shares/Shares.sol,
deposit-handlers/ERC7540LikeDepositQueue.sol, redeem-handlers/ERC7540LikeRedeemQueue.sol,
deposit-handlers/SyncDepositHandler.sol (deposit path), fees/FeeHandler.sol
(entrance/exit settlement, claims, dynamic fees), shares-transfer-validators/*,
infra/chainlink-ace/ChainlinkAcePolicyProtectedBase.sol,
issuance/hooks/chainlink-ace/ChainlinkAceIssuanceValidatorBase.sol and one
concrete hook.
Checked for: access control on mint/burn/withdraw and on hook and validator configuration; request lifecycle (double execution, non-existent ids, cancel/execute races); fee accounting consistency between value-owed tracking and share burns/mints; rounding direction; reentrancy on mint-then-pull ordering; transfer-validator bypass paths; extractor/payload consistency for the ACE policy engine; handler binding on validators.
Result: no exploitable finding.
- Request ids are deleted before transfers; non-existent or already-processed ids revert on zero shares/assets, so batches cannot double-pay.
- Fees are tracked as value owed rather than shares, so burning gross shares on exit and minting net shares on entry are consistent.
authTransfer/authTransferFrom/mintFor/burnForbypass the transfer validator by documented design; ACE hooks on the handlers cover issuance.- ACE validators are thin wrappers over Chainlink's audited
PolicyProtectedBaseUpgradeable, bound to a single handler or to Shares. - One griefing angle: a controller can cancel a request between an admin's
executeDepositRequests/executeRedeemRequestssubmission and inclusion, reverting the whole batch. It is bounded byminRequestDurationand by batch sizing, and the program's rules put admin-side DoS avoidance and configuration out of scope. Not submitted. - Stale-NAV arbitrage on synchronous deposits is inherent to admin-reported pricing and documented (subscription rounds). Out of scope.
Time spent: roughly 90 minutes. Two ChainSecurity audits cover this scope, which matches the outcome.
2026-09-03: GMTrade builder-fee path (gmx-solana 50c4d8d)
Unofficial Immunefi mirror (3 Sep 2026): slug gmtrade, max $100,000 USDC,
kyc: false, isPaused: false, launched 6 Jul 2026. In-scope GitHub trees:
programs/store, programs/treasury, programs/liquidity-provider. Reviewed
only the newly activated builder-fee charge/settle/claim path in programs/store
(commit message: “activate builder fee charging in order execution”). No
mainnet interaction.
Files: instructions/builder_fee.rs, instructions/user.rs (set_builder_fee_factor),
ops/order.rs charge helpers, states/order.rs record/set, lib.rs error
variants for this feature.
Checked for: owner vs builder vs permissionless roles; fee factor checkpoint vs live advertisement; store cap after a later lower; settlement routing and double-pay; claim vault authority; increase underpayment vs decrease clamp; liquidation/ADL attaching a fee; swap types that empty the fee bucket.
Result: no exploitable finding.
set_builder_feeis owner-signed, pending-only, and requires the advertised factor to matchexpected_factorand the store cap (missing cap reads as 0).- Execution uses the checkpointed factor, not the builder’s current advertisement. Liquidation and ADL kinds cannot take a checkpoint.
- Increase underpayment cancels the order instead of taking a partial fee. Decrease clamps the fee to available output.
settle_builder_feeis permissionless but transfers only to the checkpointed builder’s ATA and zeroesbuilder_fee_amountafter the CPI. A shortfall clamps to escrow balance so the order can still close.claim_builder_feesis owner-signed via User Account PDA seeds and rejects destination == claim vault so a no-op SPL self-transfer cannot fake a claim event.
Time spent: roughly 40 minutes on this path only. Treasury and liquidity-provider programs were not reviewed. Not submitted.
2026-09-03: GMTrade treasury + LP (gmx-solana 50c4d8d)
Same program and commit as the builder-fee pass. Reviewed money-moving paths in
programs/treasury and the single-file programs/liquidity-provider. No
mainnet interaction.
Treasury files: lib.rs, instructions/{treasury,gt_bank,store,swap,config}.rs,
states/{gt_bank,treasury,config}.rs. LP file: programs/liquidity-provider/src/lib.rs.
Checked for: role gates vs permissionless completion; authorized vs leftover
vault configs; GT-factor split and receiver-vault accounting; buyback reserve
vs later sync_gt_bank; pro-rata complete_gt_exchange insolvency/rounding;
swap in/out token flags; LP claim/unstake reward double-mint; vault dust and
fee-on-transfer; two-step authority handover.
Result: no exploitable finding.
- Withdrawals, deposits, fee claims, buyback confirm, swaps, and GT-bank sync
are all role-gated (
TREASURY_WITHDRAWER/KEEPER/ADMIN/OWNER) via store CPI auth.withdraw_from_treasury_vaultmay target any vault config tied to the sameConfig(not only the currently authorized one); that is how leftover vaults are recovered and is still withdrawer-gated. deposit_to_treasury_vaultsplits the receiver ATA withapply_factorthenchecked_sub, so GT-bank + treasury equals the pulled amount. Recorded GT bank balances increase only after the GT-bank CPI succeeds.confirm_gt_buybackcan run once per bank. It reserves a recorded share (reserve_balances) without moving tokens;sync_gt_bank_v2then sends vault-minus-recorded excess to the treasury. Claimants later pull only the reserved recorded amounts.complete_gt_exchangeis owner-signed and permissionless. It closes the exchange via store CPI first (vault must already be confirmed; ownership checked there), then pro-rata transfers from recorded balances. Targets must be owned by the signer. Last claimer withremaining_confirmed_gt_amountequal to their GT gets the leftover recorded balances; rounding dust stays recorded and can be synced to treasury. Missing PDA seeds on the GT bank account are not exploitable: onlyprepare_gt_bankcan create that type.- Swaps require swap-in deposit disabled and swap-out deposit enabled, and pull only from the receiver ATA. Cancel returns to the same ATAs.
- LP
claim_gtis off by default. Unstake always mints then snapshotscum_inv_cost; when claims are disabled only a full unstake is allowed, so that path cannot be used as a partial-claim bypass. Full exit transfers the vault's actual balance (dust-safe) and closes the vault + position PDA. Position and vault are PDAs; destination LP ATA must be owner-owned. - Time-weighted APY uses
stake_start_timeeven after a mid-stake claim, so a later claim applies a life-of-position average APY to only the new inverse- cost integral. That can overpay if the admin lowers APY after a claim, and underpay if APY rises. Defaultclaim_enabledis false (single unstake window). Admin can set APY toAPY_MAXdirectly. Not submitted. - Fee-on-transfer LP mints would record requested amount/value but unstake the received vault balance. Controllers are admin-created. Not submitted.
Time spent: roughly 70 minutes. No Immunefi report.
2026-09-03: 1inch Aqua core, swap-vm entry, and Aqua opcodes (KYC, $100k)
Unofficial Immunefi program 1inch-aqua. Local clones: aqua 9c5c42e,
swap-vm 08089a1 under /tmp/1inch-aqua and /tmp/1inch-swap-vm. No
mainnet interaction.
Read: aqua/src/* (Aqua.sol, AquaApp.sol, AquaRouter.sol, Balance.sol,
IAqua.sol) and swap-vm SwapVM.sol, AquaSwapVMRouter, AquaOpcodes,
Balances, XYCSwap, XYCConcentrate, PeggedSwap, PeggedSwapMath,
FeeFlat, FeeProtocol, ProtocolFee helpers, Extruction, Decay,
Controls, MakerTraits, TakerTraits, plus TransientLock /
TransientLockUnsafe.
Checked for: virtual-balance accounting (ship/dock/pull/push), docked-strategy behaviour, uint248 packing, per-order transient reentrancy, Aqua vs signature hashing, msg.value/WETH, curve rounding, fee bps vs surplus pulls, taker threshold/partial-fill, maker-chosen Extruction.
Result: no exploitable finding on the Aqua opcode set, fee settlement, invalidators and controls. Still unread: TWAP and whitelist, which are outside this program's Aqua opcode dispatcher.
pullandpushupdate packed balances before token movement; checked arithmetic bounds pulls to what the maker shipped and blocks pushes to docked or missing strategies. Docking requires the full token list. Shipped strategies are immutable per (maker, app, hash).TransientLockUnsafeLibonly changes slot addressing;lock()still reverts when already held, so a taker callback cannot re-enter the same order.- Aqua-mode orders hash as
keccak256(abi.encode(order)), matchingAqua.ship. - Aqua opcode set does not include Static/DynamicBalances. Live Aqua orders
load reserves from
AQUA.safeBalances. - XYC / concentrate / pegged curves round amountOut down and amountIn up.
Concentrate caps output at
balanceOutand recomputes exact-in. FeeFlatIn/FeeProtocoladjust the taker amount aroundrunLoop. Total bps must stay below 1e7. Extruction is a maker-chosen external call and is documented as needing min-rate / Aqua guards.MakerTraitsrequirestokenA < tokenB. Decay offsets revert on underflow if they would exceedbalanceOut.PeggedSwapMath.solveuses the rationalized quadratic and floors √D sovis larger (maker-favorable).a == 0reduces tov = rightSide² / ONE.- Token-in fees take a pro-rata of
feeTotalplus optional surplus from the taker-paid gross; token-out fees pull the same from the maker, then the taker receives the already-netamountOut. Surplus is maker-parameterized. Floor splits can leave dust; they do not over-allocate the flat fee. TakerTraits.validaterequiresamountOut > 0, enforces exact vs partial fill against the taker-specified amount, and scales min-out / max-in thresholds on partial fills.Invalidators:InvalidateBitchecks the bit before and writes it after the inner program, gated on non-static context and covered by the per-order lock, so a bit shared across orders behaves as one-shot.InvalidateTokenIn/Outkeep cumulative fills per (maker, order, token) and scale the paired balance with floor / ceilDiv in the maker's favour; the external cancel functions set the fill to max, after which the order reverts on underflow.Controls:Deadlineboundsblock.timestamp;Stop,Revert,Saltbehave as named. No finding.
Do not submit. Payment requires user KYC. ETHOnline "Build an Aqua App"
($5,000) is a later path: inherit AquaApp, ship strategies, settle against
AQUA.safeBalances. Do not pre-build against Start Fresh before the user has
ETHGlobal + public GitHub.
2026-09-03: GMTrade store execute / liquidate / ADL (gmx-solana 50c4d8d)
Same Immunefi program as the earlier store builder-fee and treasury/LP
passes. Reviewed the keeper-gated execution and position-cut path, not the
full gmsol_model decrease math (that crate is not in the sparse clone).
No mainnet interaction.
Files: lib.rs (execute_increase_or_swap_order_v2, execute_decrease_order_v2,
liquidate, auto_deleverage), instructions/exchange/{execute_order,position_cut}.rs,
ops/order.rs (ExecuteOrderOperation, execute_swap, execute_increase_position,
execute_decrease_position, PositionCutOperation).
Checked for: who can execute; liquidation vs healthy positions at the store layer; claimable-account PDA + delegation; transfer-out destinations; swap/min-output; ADL pnl-factor bounds; builder-fee interaction on decrease.
Result: no exploitable finding at this depth.
- Execute, liquidate, and ADL are all
ORDER_KEEPER. A user cannot invoke them. Liquidation eligibility itself is insidegmsol_model::decrease(is_liquidation_order); the store only requires a full close (size_delta >= position.size_in_usd) andthrow_on_execution_error. - Position-cut
owneris unchecked but must match the position PDA seeds and the user account. Receiver of the synthetic order is that owner. Claimable ATAs are store-owned PDAs seeded with the owner (or holding address) plus the recent-time key, and must be delegated to that same address. - Increase/swap transfer-out goes only to the order's recorded escrows (no user claimable accounts on that path). Decrease/cut uses those escrows plus the claimable PDAs above.
- Swaps honor
validate_output_amount. Limit failures are hard errors; market failures can cancel. Empty market-decrease is allowed only to claim funding. - ADL requires
pnl_factor_exceededbefore and a lower-but-not-below-MinAfterAdlfactor after. Liquidation forbids a closed-index skip exceptallow_closedon liquidate (index can be closed; long/short vaults cannot).
Not a full store review: oracle price assembly, revertible swap internals,
and gmsol_model liquidation thresholds were not read. Not submitted.
2026-09-03: sBTC Clarity contracts (sbtc 18caa9d)
Unofficial Immunefi program sbtc ($250k, KYC). Reviewed only
contracts/contracts (in-scope Clarity). Did not review emily / signer /
sbtc / wsts Rust. Local clone /tmp/sbtc. No mainnet interaction.
Files: sbtc-deposit.clar, sbtc-withdrawal.clar, sbtc-token.clar,
sbtc-registry.clar, sbtc-bootstrap-signers.clar.
Checked for: user mint/burn; deposit replay; withdrawal lock vs unlock; fee refund; protocol-caller gating; signer rotation; protocol-contract update leaving stale roles.
Result: no exploitable finding.
complete-deposit-wrapperis signer-principal-only, rejects replay on(txid, vout-index), checks burn-header atburn-height, then mints and records. Batch deposits re-enter that wrapper.initiate-withdrawal-requestlocksamount + max-feefromtx-senderbefore the dust check (the failed assert reverts the lock). Accept burns the locked amount and mints backmax-fee - feewhen the signer fee is lower. Reject unlocks the full lock. Both are signer-only and require pending status.- Token protocol mint/burn/lock/unlock require
is-protocol-callerfor the matching role. SIP-010transferallowstx-senderorcontract-calleras sender (standard).get-balanceincludes locked tokens by design. - Registry
is-protocol-callerchecks both the flag→contract and contract→flag maps. Afterupdate-protocol-contractthe old contract fails the flag→contract check even if a stale role row remains. - Key rotation requires the current signer principal, >50% threshold, 33-byte keys, and a never-seen aggregate pubkey.
Bitcoin peg-in/out correctness is signer-trusted and was not verified against emily/signer. Not submitted. Payment requires user KYC.
2026-09-03: sBTC signer deposit / withdraw (sbtc 18caa9d)
Same Immunefi program. Reviewed the signer crate's deposit and withdrawal
validation, request voting, and complete/accept Stacks calls. Did not
review emily/handler, the sbtc deposit-script crate, or wsts (those
directories were not in the sparse clone). Local clone /tmp/sbtc. No
mainnet interaction.
Files: signer/src/stacks/contracts.rs (CompleteDepositV1,
AcceptWithdrawalV1), signer/src/bitcoin/validation.rs
(DepositRequestReport, WithdrawalRequestReport, pre-sign uniqueness /
fee-rate), signer/src/request_decider.rs, signer/src/block_observer.rs
(Emily load + UTXO validate), signer/src/transaction_coordinator.rs
(complete-deposit amount = request amount − assessed input fee),
signer/src/emily_client.rs (client surface only).
Checked for: user-driven over-mint or under-burn; coordinator proposing a mint that ignores the sweep fee; sweep-txid / outpoint replay; dust and max-fee bypass; unconfirmed or reorged sweeps; first-input not being the signer UTXO; deposit requests that never confirmed; voting without a request record; unverified DKG shares being used to sign.
Result: no user-exploitable finding.
CompleteDepositV1::validaterequires a live on-chain incomplete outpoint, a canonical sweep that spends that outpoint with the signers' UTXO as vin0, mint amount exactlyrequest.amount − assess_input_fee, mint ≥ dust, and assessed fee ≤max_fee. The coordinator constructs the same mint amount; other signers re-check it before signing.AcceptWithdrawalV1::validaterequires a Fulfilled report whose sweep txid matches, output script and sat amount match the request, assessed output fee equalstx_fee, fee ≤max_fee, vin0 is a signer script, and outputs 0/1 cannot be withdrawal outputs (assess_output_feereturnsNonethere).- Bitcoin pre-sign validation refuses empty packages, duplicate
deposits/withdrawals, and out-of-range fee rates. A deposit must be
confirmed and unspent, inside per-deposit min/cap, outside the reclaim
locktime buffer, voted
can_accept+can_sign, and locked to Verified DKG shares. Withdrawals need a local accept vote, cap/dust checks,WITHDRAWAL_MIN_CONFIRMATIONS, and not pastWITHDRAWAL_BLOCKS_EXPIRY. - Request-decider votes are only blocklist + “can this signer sign.” If
the blocklist client is unset,
can_acceptis true. That is operator policy, not a user mint path. Incoming deposit decisions are stored only after Emily fetch +load_requestsvalidation. Incoming withdrawal decisions can be stored before the request row exists (explicit TODO); votes are still keyed by signer pubkey and later counted only against the current aggregate key, so an outsider cannot inject a vote. CreateDepositRequest::validatein the observer requires a confirmed non-coinbase UTXO andvalidate_txon the bitcoin transaction. Script parsing lives in thesbtccrate, which was not in this clone.
Not submitted. Payment requires user KYC.
2026-09-03: sBTC emily deposit/withdraw API + deposit scripts (18caa9d)
Same Immunefi program. Expanded the sparse clone to emily/handler and
sbtc/src. Reviewed the public create/update surfaces and the taproot
deposit/reclaim parsers. No mainnet interaction.
Files: sbtc/src/deposits.rs; emily/handler/src/api/handlers/{deposit,withdrawal,new_block,limits}.rs;
emily/handler/src/api/models/deposit/requests.rs;
emily/handler/src/api/routes/{deposit,withdrawal}.rs;
emily/handler/src/database/accessors.rs (trusted vs untrusted updates).
Checked for: posting a crafted deposit that later mints; marking another user's request Confirmed/Failed; unauthenticated withdrawal rows that cause a BTC sweep; reclaim scripts that skip OP_CSV via OP_SUCCESS; deposit-script parse that accepts a mismatched ScriptPubKey or wrong-network recipient.
Result: no user-exploitable finding.
CreateDepositRequestBody::validatedeserializes the submitted transaction hex and runsCreateDepositRequest::validate_tx: txid match, vout exists, deposit/reclaim parse, reconstructed taproot ScriptPubKey equals the UTXO, recipient network matches. Emily does not check that the tx is in a bitcoin block; signers re-fetch the outpoint from bitcoin-core and drop missing/unconfirmed UTXOs.- Deposit script parse requires the standard
<max-fee><recipient> OP_DROP <xonly> OP_CHECKSIGlayout, rejects non-minimal PUSHDATA1, and rejects invalid x-only keys. Reclaim parse requires a block-height CSV prefix, rejects the disable-locktime bit and time-based units, caps user-script length, and rejects BIP-342 OP_SUCCESSx so the lock cannot be skipped. - Untrusted
PUT /deposit(and the matching withdrawal update) may only move Pending → Accepted. Confirmed/Failed/RBF need the trusted sidecar flag. Warp routes do not enforce the OpenAPIApiGatewayKeythemselves; production is expected to sit behind API Gateway. Even a public Accepted flip is Emily bookkeeping — signers vote and sweep from local bitcoin and Stacks state. POST /withdrawalandPOST /new_blockare likewise key-annotated but unauthenticated in warp.new_blockonly accepts committedsbtc-registryprint events for the configured deployer. Signers do not sweep from Emily rows; a fake withdrawal index entry cannot unlock BTC.
Not submitted. Payment requires user KYC.
2026-09-03: sBTC emily chainstate / reorg (18caa9d)
Same Immunefi program. Impacts list includes “Emily API crash preventing correct processing of sBTC deposits/withdrawals,” so this slice checked whether an unauthenticated chain-tip write can rewind statuses or crash the API. No live Emily calls. No mainnet interaction.
Files: emily/handler/src/api/handlers/{chainstate,internal}.rs,
emily/handler/src/api/routes/chainstate.rs,
emily/handler/src/database/accessors.rs (add_chainstate_entry),
emily/handler/src/database/entries/{chainstate,deposit,withdrawal}.rs
(reorganize_around), emily/handler/src/common/mod.rs (NO_REORG_DEPTH).
Checked for: posting a fake older tip; skipping the 6-block bitcoin guard; Confirmed deposits reminted after a rewind; panic/crash on a large reorg.
Result: no user-exploitable finding.
POST/PUT /chainstateare OpenAPI-key annotated but unauthenticated in warp. Production is expected to sit behind API Gateway. A reachable write would still only mutate Emily’s index; signers complete deposits and accept withdrawals from bitcoin-core and Stacks, with on-chain replay protection. A rewind to Pending cannot remint.NO_REORG_DEPTH(6 bitcoin blocks) is skipped whenbitcoin_block_heightis omitted. That is a defense-in-depth hole on the notice board, not a peg break. Do not probe the live Emily host.reorganize_arounddrops events at or after the new tip (unless the hash matches) and synthesizes Pending if history is empty.synchronize_with_historyclears fulfillment unless the latest event is still Confirmed.execute_reorg_handlerflips API status to Reorg, rewrites impacted rows, then Stable. Version conflicts retry four times and then continue; leftover stale rows are an index inconsistency, not a mint. No panic path on the happy or conflict routes.
Not submitted. Payment requires user KYC. Remaining sBTC slice: wsts.
2026-09-03: Origin CompoundingStakingStrategy (origin-dollar, no KYC)
Unofficial Immunefi program originprotocol ($1M, kyc: false). The 1 Sep
2026 asset adds were the existing OUSD / wOUSD / Vault / Curve AMO
proxies. Reviewed the newer native-staking strategy instead: view
0xb7992eFDa9aBBaC3522336A626191D198fa37145 and proxy
0x25e1d468B14005716111d5e8464573e5135275f4 were added 22 Jun 2026.
Local clone /tmp/origin-dollar. No mainnet interaction.
Files: contracts/strategies/NativeStaking/CompoundingStakingStrategy.sol
(storage + implementation), interfaces/strategies/CompoundingStakingTypes.sol.
Did not review BeaconProofsLib SSZ internals.
Checked for: user withdraw; share-price inflation via donated WETH/ETH; double-count of pending deposits vs validator balances; permissionless proofs rewriting NAV; registrator pulling to a non-vault recipient.
Result: no user-exploitable finding.
deposit/depositAllare vault-only.withdrawallows the registrator but_withdrawrequires the recipient to be the vault.validatorWithdrawalis registrator-only and only requests an EIP-7002 sweep back to this strategy’s 0x02 credentials.checkBalanceislastVerifiedEthBalance + WETH.balanceOf(this).stakeEthunwraps WETH and adds the same amount tolastVerifiedEthBalance. Wrapping ETH subtractsmin(lastVerified, amount)so swept ETH is not double-counted with WETH. PermissionlessverifyBalancessets lastVerified to pending deposits + proven validator balances + the snapped ETH balance, then clears the snap.verifyDepositrefuses a processed slot after an unverified snap so a deposit cannot leavedepositListbeforeverifyBalanceshas used that snap. First deposits to new pubkeys are capped and serialized (firstDeposit) to bound front-run loss; that loss is documented and deducted from lastVerified whenverifyValidatorsees wrong credentials.- Donated ETH sits in
receive()until the next snap/verify. Donated WETH raisescheckBalanceimmediately and gifts existing vault holders; it does not let a later minter extract others’ funds.
Not submitted. Vault rebase interaction was not fully read.
2026-09-03: Origin BeaconProofsLib (origin-dollar)
Same Immunefi program. Reviewed the SSZ/EIP-4788 proof library that
CompoundingStakingStrategy uses to set lastVerifiedEthBalance.
Local clone /tmp/origin-dollar. No mainnet interaction.
Files: contracts/beacon/{BeaconProofsLib,BeaconProofs,Merkle,Endian,BeaconRoots}.sol.
Checked for: forged validator-balance proofs; wrong-leaf extraction from
the packed 4-balance chunk; gindex overflow; short proofs treated as
roots; withdrawal-credential swap on verifyValidator; pending-deposit
list mixin-length bypass.
Result: no user-exploitable finding.
- Inclusion proofs are index-based SHA-256 (not sorted keccak). Each
verifier pins an exact proof length (9 / 28 / 37 / 39 / 40 / 53
witnesses) and a zero block-root reject.
concatGenIndicesplacesuint40validator indexes anduint32deposit indexes inside the reserved height so they cannot collide with the parent gindex bits. verifyValidatortakes the first sibling as withdrawal credentials and requires it to match the caller-supplied value; substituting a sibling breaks the beacon block root.balanceAtIndexleft-shifts the packed leaf by(index % 4) * 64then byte-swaps the top 64 bits, which is the SSZ little-endian layout for fouruint64balances.- Pending-deposit indexes are capped at
2^27to account for the SSZ list length mixin.merkleizePendingDepositis an 8-leaf tree (pubkey, credentials, amount, signature root, slot, three zeros) matching ElectraPendingDeposit. - Roots come from the EIP-4788 oracle (
BeaconRoots.parentBlockRoot); a missed slot reverts rather than returning a stale root.
Not submitted.
2026-09-03: Origin CrossChain CCTP (origin-dollar 4fa0602)
Same Immunefi program (originprotocol, $1M, kyc: false). In-scope
proxies include Morpho V2 CrossChain Master/Remote
0xB1d624fc40824683e2bFBEfd19eB208DbBE00866 (Ethereum + Base, added
23 Feb 2026 and again 1 Sep 2026) and HyperEVM twins
0xE0228DB13F8C4Eb00fD1e08e076b09eF5cD0EA1e. Local clone
/tmp/origin-dollar at 4fa0602. No mainnet interaction.
Files: contracts/strategies/crosschain/{CrossChainMasterStrategy,CrossChainRemoteStrategy,AbstractCCTPIntegrator,CrossChainStrategyHelper}.sol.
Checked for: user-callable mint/withdraw; forged CCTP or Origin
payloads; remoteStrategyBalance inflation; nonce replay / skip;
relay vs handleReceiveFinalizedMessage double-apply; pending
deposit/withdraw accounting; Morpho 4626 try/catch leaving funds
untracked.
Result: no user-exploitable finding.
- Master
deposit/withdraware vault-only. Remotedeposit/withdraw/sendBalanceUpdateare governor/strategist/operator.relayis operator-only. handleReceiveFinalizedMessage/handleReceiveUnfinalizedMessageareonlyCCTPMessageTransmitter, then requiresourceDomain == peerDomainIDandsender == peerStrategy. Unfinalized receives additionally requireminFinalityThreshold == 1000.- Burn messages are accepted only through
relay: header sender must be the TokenMessenger, burn token must bepeerUsdcToken, and the extracted mint sender/recipient must bepeerStrategy/address(this). CirclereceiveMessagethen the Origin hook. A user cannot inject a balance-check or deposit hook. - Nonces start at 1 with
nonceProcessed[0] = true._getNextNoncereverts while the last nonce is open, so only one in-flight transfer exists. Confirmations apply only whennonce == lastTransferNonce. Out-of-order non-confirmation checks are ignored; idle checks older than one day are ignored. - Master
checkBalanceis local USDC +pendingAmount+ cachedremoteStrategyBalance. Deposits setpendingAmountbefore the burn; confirmations clear it. Withdrawals do not reduce the cache until the remote confirmation, so TVL can stay high for one CCTP round-trip. That is an accounting window, not a path for a user to mint against unbacked value: the next Master withdraw reverts (Pending token transfer) and Origin’s rules exclude accounting discrepancies without extractable loss. - Remote Morpho
deposit/withdraware try/catch so a 4626 revert still sends a confirmation. Idle USDC is included incheckBalance. A failed withdraw sends a confirmation without tokens and the Master cache is corrected to the reported balance.
Not submitted. Circle CCTP attestation and Morpho share-price behavior
are third-party / documented. Ethena ARM source is not in this clone
(only ARMBuyback deployment JSON).
2026-09-03: Origin MorphoV2Strategy (origin-dollar 4fa0602)
Same program. In-scope proxy 0x3643cafA6eF3dd7Fcc2ADaD1cabf708075AFFf6e
(“OUSD Strategy - Morpho V2”, added 1 Sep 2026). Local clone
/tmp/origin-dollar. No mainnet interaction.
Files: contracts/strategies/{MorphoV2Strategy,Generalized4626Strategy,MorphoV2VaultUtils}.sol.
Checked for: non-vault withdraw; maxWithdraw over-pull; idle-asset
under/over-count; permissionless Merkl claim redirection.
Result: no user-exploitable finding.
deposit/withdrawstay vault-only.withdrawAllis vault-or-governor and sends assets tovaultAddress. Morpho V2’smaxRedeem/maxWithdrawreturn 0, so the override withdrawsmin(idle-on-V2 + V1-adapter maxWithdraw, checkBalance).MorphoV2VaultUtilsonly adds the V1 adapter’smaxWithdrawwhenmorphoVaultV1()succeeds; any other adapter revertsIncompatibleAdapter. That can blockwithdrawAll, not a user drain. Ordinarywithdrawstill uses ERC-4626withdraw.checkBalanceispreviewRedeem(shares)only. IdleassetTokenon the strategy is intentionally omitted. Donated vault shares raise TVL for existing holders; they do not let a later minter extract others’ funds.merkleClaimis permissionless but hardcodesusers[0] = address(this), so rewards can only land on the strategy. A valid proof cannot redirect to the caller.
Not submitted.
2026-09-03: sBTC wsts + signer signing gate (18caa9d)
Same Immunefi program (sbtc, $250k, KYC). Local clones /tmp/sbtc/wsts
and /tmp/sbtc/signer. No mainnet interaction.
Files: wsts/src/{v2,common,schnorr}.rs,
wsts/src/state_machine/signer/mod.rs (DKG end, nonce, sign-share,
private-share decrypt), signer/src/transaction_signer.rs
(NonceRequest / SignatureShareRequest and
validate_bitcoin_sign_request).
Checked for: unverified DKG shares becoming a signing key; nonce reuse; coordinator swapping the message after a nonce; a user forcing a signature on an unapproved bitcoin sighash.
Result: no user-exploitable finding.
check_public_sharesrequires polynomial degree== thresholdand a Schnorr ownership proof of the constant term (WSTS/polynomial-constant).compute_secretthen checks each private share againsts * G == poly(key_id)and refusesBadPrivateSharesbefore writingprivate_keys. Decrypt failures go intoinvalid_private_sharesand block a successfulDkgEnd.compute_secretsremapssrc_party → dest_keyintodest_key → src_partybefore that check.sign_with_tweaktake()s the private nonce. A second share request returnsMissingNonce. The library will sign whatever message the caller passes; that is expected for a FROST crate.- The sBTC signer is the policy layer. Both
NonceRequestandSignatureShareRequestrequire a canonical coordinator, thenvalidate_bitcoin_sign_request: the message must be a knownTapSighashwithwill_sign_bitcoin_tx_sighash == trueand a matching prevout signature type. Unknown or rejected sighashes do not enter WSTS. DKG-verification signs only the mock message for a non-failed pending key inside the verification window.
Not submitted. Payment requires user KYC. sBTC in-scope slices from this clone are now exhausted (Clarity, signer mint/burn, emily, chainstate, wsts).
2026-09-03: Horizen ZenStaker / RewardAccumulator (ab92502)
Immunefi program horizen ($10,000 USDC, kyc: true, live). Scope is
pinned to HorizenOfficial/staker commit ab92502. Upstream Tally /
ScopeLift Staker.sol paths already covered by published audits are
out of scope except where Horizen’s integration introduces a new
issue. Local clone /tmp/horizen-staker. No mainnet or testnet
broadcast.
Files: src/ZenStaker.sol, src/RewardAccumulator.sol,
src/DelegationSurrogate.sol, src/calculators/IdentityEarningPowerCalculator.sol.
Read Staker.notifyRewardAmount / _stake only for the integration
boundary (ZEN-on-ZEN, notifier, surrogate).
Checked for: RewardAccumulator over-count vs balance; permissionless
notifyRewardAmount; schedule skip stealing principal; surrogate
drain; view helpers changing stake/claim.
Result: no user-exploitable finding.
ZenStakeradds only view helpers and a non-votingZenDelegationSurrogate.MAX_CLAIM_FEEis 0. Stake still moves ZEN into the surrogate (max-approve back to the Staker); rewards sit on the Staker. Same token, separate balances.getVotesisdepositorTotalStakedand is not a governance hook in Phase 1.RewardAccumulator.transferAndNotifyRewardspulls then incrementsaccumulatedRewards.notifyAlreadyTransferredRewardsrequiresbalance - accumulated >= amount(0.8 underflow-safe). A second notify of the same surplus reverts.sendRewardsToStakeris permissionless aftertimeWindow, transfers exactlyaccumulatedRewards, thenstaker.notifyRewardAmount(notifier- gated on Staker) then zeros the counter. Empty flushes still snaplastRewardTimeto the latest grid; they do not move principal.- Admin whitelist / window changes are owner-gated. Donating ZEN when the whitelist is off gifts stakers; it does not extract stake. Fee-on-transfer inflation would be a ZEN-OFT property, not present in this integration.
permitAndStakeswallows a failedpermit(production ZEN has no EIP-2612) and falls through totransferFrom. Documented known behavior.MAX_CLAIM_FEE = 0andmaxBumpTip = 0; bumping with a positive tip reverts. Only a registered notifier (the accumulator after the deploy script) can callnotifyRewardAmount.
Not submitted. Payment requires user KYC.
2026-09-03: Origin BridgedWOETHStrategy (origin-dollar 4fa0602)
Same Immunefi program. In-scope Base proxy
0x80c864704DD06C3693ed5179190786EE38ACf835 and bridged wOETH
0xD8724322f44E5c58D7A815F542036fb17DbbF839 (added 1 Sep 2026).
Local clone /tmp/origin-dollar. No mainnet interaction.
Files: contracts/strategies/BridgedWOETHStrategy.sol,
contracts/token/BridgedWOETH.sol.
Checked for: user mint of OETHb against unbacked wOETH; permissionless oracle snapshot inflation; vault withdraw of strategy inventory; bridged-token mint/burn.
Result: no user-exploitable finding.
- Vault
deposit/withdraw/depositAllrevert.withdrawAllis a no-op. Inventory moves only throughdepositBridgedWOETH/withdrawBridgedWOETH, both governor-or-strategist. Mint happens before the wOETH pull and burn after the OETHb pull;nonReentrantplus a revert on a failed transfer keeps the two legs atomic. updateWOETHOraclePriceis permissionless but only storesoracle.price(bridgedWOETH). The stored price must stay> 1e18, never decrease, and not jump more thanmaxPriceDiffBps(≤ 100%) from the last snapshot. A user cannot invent a price. A manipulated oracle spike that gets snapshotted cannot be walked back; Origin’s rules treat third-party oracle behavior and accounting without an extractable path as out of scope.checkBalanceuses the stored price and is documented to underreport when stale.BridgedWOETHmint/burn areMINTER_ROLE/BURNER_ROLE.transferTokencannot rescue wOETH or WETH.
Not submitted.
2026-09-03: Origin WOETH CCIP zapper + Base bridge helper
Same Immunefi program. In-scope Ethereum zapper
0x438731b5Ee8fEcC02a28532713E237b93260C3F8 (added 1 Sep 2026).
Local clone /tmp/origin-dollar at 4fa0602. No mainnet interaction.
Files: contracts/zapper/WOETHCCIPZapper.sol,
contracts/automation/{AbstractCCIPBridgeHelperModule,BaseBridgeHelperModule,AbstractSafeModule}.sol.
Checked for: user stealing another zap; CCIP fee/token-amount mismatch draining the zapper or the Safe; unprivileged bridge of Safe inventory.
Result: no user-exploitable finding.
WOETHCCIPZapper.zap/receiveconvertmsg.value - feeto OETH, wrap to wOETH, andccipSendto the chosen receiver. There is no pending-zap storage. A revert ondeposit/ wrap /ccipSendreturns the ETH.getFeequotes CCIP with the full ETH amount as the token amount, then the send uses the smaller wOETH share count. That can overpay the fee; leftover ETH sits on the zapper with no rescue. That is stuck dust, not a path for a second user to extract.BaseBridgeHelperModuledeposit/withdraw/bridge functions areonlyOperatorand execute via the Safe. CCIP receiver is the Safe itself.transferTokenson the module isonlySafe. A user cannot move Safe wOETH or WETH.
Not submitted. Circle CCIP fee behavior is third-party.
2026-09-03: GMTrade gmsol_model liquidation thresholds (50c4d8d)
Same Immunefi program (gmtrade, $100k, no KYC). Fetched
crates/model into /tmp/gmx-solana (it was missing from the earlier
sparse clone). No mainnet interaction.
Files: crates/model/src/position.rs (check_liquidatable,
check_collateral), crates/model/src/action/decrease_position/mod.rs
(check_liquidation, remaining-size close-all),
crates/model/src/params/position.rs, crates/model/src/market/perp.rs
(liq-impact cap).
Checked for: liquidating a healthy position; fee-induced liquidation; partial liquidation leaving a dust position that steals; impact over-cap on a close.
Result: no user-exploitable finding.
DecreasePosition::executecallscheck_liquidation. A liquidation flag requirescheck_liquidatable(..., for_liquidation=true)to return a reason; a healthy position errorsNotLiquidatable. Users still cannot invokeliquidate(storeORDER_KEEPER).- Eligibility uses collateral + full-size PnL + capped negative impact
− position fees, and excludes liquidation fees so the fee itself
cannot push a solvent position under the line.
for_liquidationusesmin_collateral_factor_for_liquidation(falls back to the ordinary factor). Absolutemin_collateral_valueis also applied. - Negative impact is capped by
max_position_impact_factor_for_liquidations. Remaining size belowmin_position_size_usd(or tokens that would go to zero) forces a full close. The store already requiressize_delta >= size_in_usdon liquidate.
Not submitted.
2026-09-03: GMTrade swap + output/oracle checks (50c4d8d)
Same Immunefi program. Local clone /tmp/gmx-solana. No mainnet
interaction.
Files: crates/model/src/action/swap.rs, crates/model/src/price.rs,
programs/store/src/ops/order.rs (execute_swap),
programs/store/src/states/order.rs (validate_output_amount),
programs/store/src/states/oracle/validator.rs.
Checked for: empty/zero-price swap minting out; impact pool over-pay;
skipping min_output; user-set stale oracle prices.
Result: no user-exploitable finding.
Swap::try_newrejects a zerotoken_inandprices.validate(). Fees come out of token-in. Negative impact is taken from token-in (and reverts if it cannot be paid). Positive impact is capped by the impact pool; extra out ispool_amount_out + capped impact. Conversion usespick_price(false)on token-in andpick_price(true)on token-out. After the pool delta the action checks pool amount, reserve, and max PnL.- Store
execute_swapruns the revertible path thenvalidate_output_amountagainstmin_output. Limit-order misses setshould_throw_error; market misses cancel. Execute is stillORDER_KEEPER. PriceValidatorenforces max age, a future-timestamp bound, and optional max deviation from the reference mid. Users cannot assemble oracle prices.
Not submitted.
2026-09-03: TermMax V2 gearing token + vault (e314f3f)
Immunefi program termstructurelabs ($80,000, kyc: false). Primary
in-scope repo is term-structure/termmax-contract-v2. The 24 Aug 2026
adds were the TMX OFT token addresses; this pass reviewed the V2
money-movers instead. Local clone /tmp/termmax-v2. No mainnet
interaction.
Files: contracts/v2/tokens/{AbstractGearingTokenV2,GearingTokenWithERC20V2}.sol,
contracts/v2/vault/TermMaxVaultV2.sol (deposit/withdraw/dealBadDebt).
Checked for: minting an underwater GT; liquidating a healthy loan; taking more collateral than the repaid share; flash-repay stealing another user’s collateral; vault withdraw of someone else’s shares.
Result: no user-exploitable finding.
mintisonlyOwner(the market) and refuses LTV abovemaxLtv. Collateral is pulled from the provider. Capacity is checked against the token balance plus the encoded amount.liquidaterequiresliquidatable, a true_getLiquidationInfohit (LLTV before maturity, or the post-maturity window), and capsrepayAmtatmaxRepayAmt. After the window it reverts. Debt tokens go to the market first. Collateral to the liquidator is repay-equivalent plus the configured bonus, then min’d againstcollateral * repay / debt, so a partial close cannot drain the rest. Remainder returns to the owner on a full close.flashRepay/repayAndRemoveCollateralare owner-or-delegate. Collateral is sent, thenexecuteOperation, thensafeTransferFromof the repay.nonReentrant. A third party cannot flash someone else’s GT.- Vault
_deposit/_withdraware standard 4626 with allowance on a non-owner redeem.dealBadDebtburns the owner’s shares (or an approved spender’s) and cannot target the vault asset as “collateral”.
Not submitted. LayerZero internals of the flattened TMX.sol were
not reviewed.
2026-09-03: TermMax V2 market issue/redeem + order swap (e314f3f)
Same Immunefi program (termstructurelabs). Local clone /tmp/termmax-v2.
No mainnet interaction.
Files: contracts/v2/TermMaxMarketV2.sol (mint/burn/issueFt/
leverageByXt/redeem), contracts/v2/tokens/MintableERC20V2.sol,
contracts/v2/TermMaxOrderV2.sol (swapExactTokenToToken,
swapTokenToExactToken, _rebalance).
Checked for: burning someone else’s FT/XT without allowance; redeem
before the liquidation window; flash-leverage without returning
collateral; order swap without minOut or with a fake pair.
Result: no user-exploitable finding.
MintableERC20V2.burn(owner, spender, amount)spends allowance whenowner != spender. Marketburn/redeem/leverageByXtall go through that path. Pair mint pulls debt tokens from the caller 1:1 into FT+XT.issueFtmints a GT (LTV-checked, collateral pulled) then FT minus the mint fee.issueFtByExistedGtisaugmentDebtas the GT owner/delegate.leverageByXtflashes debt to the loan receiver, requires collateral in the callback, then burns XT.redeemis blocked until maturity (+ liquidation window if the GT is liquidatable). Market FT reserves from repay/liquidate are burned first so they do not inflate the redeemer’s share. Delivery and remaining debt tokens are pro-rata.- Order swaps allow only debt↔FT and debt↔XT. Deadline and
minTokenOut/maxTokenInare enforced. Input is pulled after the quote;nonReentrant.afterSwapis a maker-set hook, not a user entry.
Not submitted.
2026-09-03: TermMax V2 router + swap adapters (e314f3f)
Same Immunefi program (termstructurelabs). Local clone /tmp/termmax-v2.
No mainnet interaction.
Files: contracts/v2/router/TermMaxRouterV2.sol,
contracts/v2/access/WithWhitelistCheck.sol,
contracts/v2/lib/{OnlyProxyCall,TransferUtilsV2}.sol,
contracts/v2/router/swapAdapters/{ERC20SwapAdapterV2,TermMaxSwapAdapter,OneInchSwapAdapter,LifiSwapAdapter,OdosV2AdapterV2,UniswapV3AdapterV2,PendleSwapV3AdapterV2}.sol.
Checked for: leftover tokens after swap/leverage/flash-repay; leftover
approvals; per-order minTokenOut=0 vs aggregate netTokenAmt;
adapters callable without the router; whitelist bypass; LiFi
user-supplied calldata sending output elsewhere.
Result: no user-exploitable finding.
- Adapters are
onlyProxy(address(this)must differ from the deployed implementation), soswaponly runs via the router'sdelegatecall. Markets and adapters are checked againstWhitelistManager(MARKET/ADAPTER). Flash callbacks use a transient store that is cleared after one use. TermMaxSwapAdapterexact-in passesminTokenOut=0to each order and then reverts if the sum is belownetTokenAmt. A sandwich on one order can only fail the user's tx, not extract protocol funds. Exact-out refunds unused input to a user-setrefundAddress. Order callbacks and 4626 pools must be whitelisted.- Aggregator adapters scale
minOutwith input, require 1inchspentAmount == amountIn, and measure LiFi output on the router before forwarding. A LiFi payload that pays a third party yields zerotokenOutand reverts onnetAmount. TransferUtilsV2.safeApprovenever lowers a leftover allowance. Uniswap / 1inch / Odos still pull only the amount in the current swap params, so a stale allowance does not let a third party drain the router.useBalanceOnchainis the intentional leftover sweep inside a multi-path tx.leverage/flashRepayFromCollcan leave unused debt or collateral on the router if the caller underspends; that is the user's own leftover (or dust), not an attacker extract of protocol reserves.swapAndRepayreturns remaining repay token tomsg.sender.
Not submitted. Remaining TermMax adapters (Kyber, OKX, Pancake, Kodiak, vault helpers) are lower-priority copies of the same approve-and-call pattern.
2026-09-03: Strata CDO / Tranche / depositor / accounting (2be97f9)
Immunefi program strata ($250,000, kyc: true). In-scope tranche
tree added 17 Jun 2026. Local clone /tmp/strata-contracts on the
tranches branch. No mainnet interaction.
Files: contracts/tranches/{StrataCDO,Tranche,TrancheDepositor,Accounting,DiscreteAccounting}.sol,
contracts/tranches/base/cooldown/SharesCooldown.sol,
contracts/tranches/strategies/ethena/sUSDeStrategy.sol (withdraw
path only).
Checked for: first-depositor inflation; burning another user’s shares as fee; cooldown finalize stealing locked shares; meta-token Ceil redeem pulling more than accounting deducts; leftover tokens on the depositor; DiscreteAccounting projected-NAV insolvency beyond the published known issue.
Result: no new user-exploitable finding.
deposit/withdraw/cooldownSharesareonlyTranche.burnSharesAsFeespends allowance whencaller != owner. SharesCooldownrequestRedeemisCOOLDOWN_WORKER_ROLE;finalizeredeems to the request owner;cancel/finalizeWithFeeareonlyUser.- Tranche uses OZ
decimalsOffsetplusMIN_SHARES = 0.1 ether. Meta deposit converts Floor and pulls the quoted token amount. Redeem passes a CeiltokenAmountinto the strategy, but Ethena / Saturn / NeutrlwithdrawInnerignore it and size the transfer frombaseAssets(previewWithdraw). - Depositor swaps are router-and-minOut gated; leftover output is
deposited in the same tx.
depositis notnonReentrant; a reenter would need an admin-listed malicious token or 4626. - Continuous
Accounting.calculateNAVSplitcaps Senior’s target gain by real Junior (jrtNavT1 - ONE_ASSET) and revertsInvalidNavSplitif the pieces do not sum tonavT1. DiscreteAccounting.calculateNAVSplitProjectedstill caps by projected Junior and debits real Junior (known issue 1373). The publictranchestip does not contain the cited6aee201real-Junior cap. Not re-reported.
Not submitted.
2026-09-03: Strata two-step config + cooldown silos (2be97f9)
Same Immunefi program (strata). Local clone /tmp/strata-contracts.
No mainnet interaction.
Files: contracts/tranches/TwoStepConfigManager.sol,
contracts/tranches/base/cooldown/{ERC20Cooldown,UnstakeCooldown}.sol,
contracts/tranches/strategies/saturn/SaturnStrategy.sol (deposit /
withdraw).
Checked for: instant fee hike; stealing another user’s cooldown
balance; unstake proxy reuse paying the wrong owner; Saturn
withdraw using a Ceil tokenAmount instead of baseAssets.
Result: no user-exploitable finding.
- Exit-fee increases need
MIN_DELAY(1 day) and a second role to execute. Decreases apply immediately (user-friendly). Exit-mode bounds are always delayed. Caps: fee ≤ 5% ppm, lock ≤ 30 days. ERC20Cooldown.transferisCOOLDOWN_WORKER_ROLEand pulls from the worker (the strategy).finalizepays the request owner. Instant (cooldownSeconds == 0) sends straight toto.UnstakeCooldownclones a per-user handler, pulls tokens into that proxy, thenrequest(). Reuse is same-block or slot-cap on the same recipient.finalizereturns the proxy to that user’s pool. A failedfinalize()leaves the request in place.- Saturn
withdrawInnersizes shares withpreviewWithdraw(baseAssets)and ignorestokenAmount. USDat deposits return post-feeconvertToAssets(sharesReceived).
Not submitted.
2026-09-03: OpenZeppelin LimitOrderHook (2ae32be)
Immunefi program openzeppelin ($25,000, kyc: true). Asset
OpenZeppelin/uniswap-hooks added 9 Oct 2025; tip commit is the
zero-amount claim-redemption guard. Local clone /tmp/oz-uniswap-hooks.
No mainnet interaction.
Files: src/general/LimitOrderHook.sol, src/utils/CurrencySettler.sol.
Checked for: withdrawing another user’s filled order; cancelling after fill to remove already-gone liquidity and desync claims; placing into a filled order id; fee-checkpoint dilution when adding liquidity; native-token zero-value revert (the just-fixed path); principal pro-rata over-pay.
Result: no new user-exploitable finding.
placeOrder/cancelOrder/withdrawall key offuserInfo[msg.sender].liquidity. A filled order’s map id is reset to default so a new place at the same tick gets a new id; the old filled order remains withdrawable.- Fees accrue per liquidity unit with a re-checkpoint that keeps already-owed fees when the same owner adds more. Principal is split pro-rata and subtracted; floor dust stays in the hook (documented).
_sendFromClaimsandCurrencySettlerskipamount == 0, which is the tip fix for tokens / native recipients that revert on zero-value transfers. Cancel after fill tries tomodifyLiquidityon an empty position and reverts; the owner still useswithdraw.
Not submitted.
2026-09-03: OpenZeppelin ReHypothecationHook (2ae32be)
Same Immunefi program (openzeppelin). Local clone
/tmp/oz-uniswap-hooks. No mainnet interaction.
Files: src/general/ReHypothecationHook.sol (seedLiquidity,
addReHypothecatedLiquidity, removeReHypothecatedLiquidity,
_beforeSwap / _afterSwap JIT).
Checked for: first-depositor share inflation; seeding a skewed
ratio that steals later deposits; overlapping JIT + liquidity
ops; third-party modifyLiquidity on the hook pool.
Result: no new user-exploitable finding.
- Seed requires
totalSupply() == 0and mintssqrt(amount0 * amount1)with a floor of100 * 10 ** decimalsOffset(), so the virtual-share offset cannot inflate the price. Later adds price from yield-source balances (previewMint). Burns happen before withdraw. _beforeSwapsets a transient JIT lock and snapshots ticks;_afterSwapremoves the same range. Liquidity ops revertJITLockedwhile that flag is set. Direct pool LP isLiquidityNotAllowed.- Permissionless
_beforeInitializeand a front-run skewed seed are documented warnings (grief / idle liquidity, assets stay redeemable). Not submitted.
2026-09-03: TruFin Solana staker deposit + whitelist (ce5d88b)
Immunefi program trufin ($20,000, kyc: true). In-scope repo
TruFin-io/smart-contracts-solana-public added 25 Jun 2026.
Local clone /tmp/trufin-solana. No mainnet interaction.
Files: programs/staker/src/{lib.rs,instructions/staking.rs,instructions/whitelist.rs,state/types.rs}.
Checked for: depositing without a whitelist; minting pool tokens
against a fake stake pool; init_if_needed creating a
self-whitelisted user PDA.
Result: no user-exploitable finding.
WhitelistUserStatusdefaults toNone. Deposit’sinit_if_neededstill requiresWhitelisted, so a fresh PDA cannot self-approve. Only an existingagentPDA can whitelist.- Deposit CPI targets the hardcoded SPL Stake Pool program id.
That program checks the pool, mint, and authorities. This
wrapper has no withdraw path; redemptions go through the
stake pool. Validator add/remove is
access.owner. - Permissionless
deposit_to_specific_validatordelaying a rebalance is documented in-source as an accepted whitelist trade-off.
Not submitted.
2026-09-03: OpenZeppelin fee + sandwich/JIT hooks (2ae32be)
Same Immunefi program (openzeppelin). Local clone
/tmp/oz-uniswap-hooks. No mainnet interaction.
Files: src/fee/{BaseDynamicAfterFee,BaseHookFee}.sol,
src/general/{AntiSandwichHook,LiquidityPenaltyHook}.sol.
Checked for: taking more than the unspecified surplus; leftover transient target across swaps; sandwich hook applying a target on the unprotected direction; JIT penalty taking fees from the wrong position or donating to the attacker.
Result: no new user-exploitable finding.
BaseDynamicAfterFeestores the target in transient storage and clears it inafterSwap. Surplus vs target is taken as 6909 claims on the unspecified currency only. Exact-in fees reduce output; exact-out fees increase input.BaseHookFeecharges a subclass percent of the unspecified amount, capped at 100%, and skips a zero unspecified delta.AntiSandwichHookapplies the beginning-of-block target only on!zeroForOne(documented).zeroForOnereturnsapplyTarget=false. Tick walks can OOG on large moves (documented).LiquidityPenaltyHookkeys withheld fees by(poolId, positionKey)includingsender. Penalty is linear in blocks since last add and is donated to in-range LPs. Multi-account redirect is documented and rarely profitable.CurrencySettlerskips zero takes.
Not submitted.
2026-09-03: TruFin validator add/remove and rebalance (ce5d88b)
Same Immunefi program (trufin). Local clone /tmp/trufin-solana.
No mainnet interaction.
Files: programs/staker/src/instructions/{validators.rs,initialize.rs}.
Checked for: a random signer increasing/decreasing validator stake; adding a validator without paying the reserve; init front-run after deploy.
Result: no user-exploitable finding.
AddValidator/RemoveValidatorrequireaccess.owner. Add transfers rent + min stake from the owner into the reserve, then CPIAddValidatorToPoolon the official stake-pool program, signed by thestakerPDA.- Increase/decrease require a
stake_managerPDA seeded withsigner. CPI uses instruction indexes 19/20 on the official program. The live program’s one-time init front-run is documented as already closed.
Not submitted.
2026-09-03: OpenZeppelin BaseCustomCurve / BaseAsyncSwap (2ae32be)
Same Immunefi program (openzeppelin). Local clone
/tmp/oz-uniswap-hooks. No mainnet interaction.
Files: src/base/{BaseCustomAccounting,BaseCustomCurve,BaseAsyncSwap}.sol.
Checked for: hook-owned 6909 claims paying a swapper more than
the hook holds; exact-out async skip leaking the other pool;
native msg.value refund under/over-pay; LP add/remove via the
PoolManager bypassing the hook.
Result: no user-exploitable finding.
BaseCustomAccountingblocks direct pool LP (LiquidityOnlyViaHook), checks deadline and principal slippage, and refunds unused nativemsg.valueafter verifying it coveredamount0.BaseCustomCurveswaps take/settle 6909 claims the hook minted on add. Output size is_getUnspecifiedAmount(subclass). A bad curve can lose the hook’s own LP, not another pool’s reserves. One_poolKeyper instance.BaseAsyncSwaponly intercepts exact-in: it takes the specified amount as claims and returns a delta that nets that amount to 0. Exact-out is left to the PoolManager. Multi-pool 6909 mixing is a documented implementer warning.
Not submitted.
2026-09-03: 1inch Fusion SimpleSettlement (b68b27b)
Immunefi program 1inch-SmartContracts ($500,000, kyc: true).
In-scope repo 1inch/fusion-protocol added 10 Jun 2026. Local
clone /tmp/1inch-fusion. No mainnet interaction.
Files: contracts/{Settlement,SimpleSettlement}.sol.
Checked for: surplus fee exceeding remaining taking amount; whitelist matching a colliding 10-byte suffix; Dutch-auction rate bump going negative and under-charging the taker.
Result: no user-exploitable finding.
- Surplus share is only the excess of net taking over a
Ceil-scaled estimate, times
protocolSurplusFee(capped at 100). That extra is added to the protocol fee so the maker still receives at least the estimate. - Whitelist compares
uint80(uint160(taker))(lowest 10 bytes) plus a time-gated list. A 2^80 collision is not a practical extract. Fills beforeallowedTimerevert. - Rate bump is interpolated and then reduced by a gas bump;
making amount is divided by
1 + bump, taking amount is Ceil-multiplied. After the auction it is 0. - Mainnet
Settlementadditionally capstx.priorityFeevsbasefee(governance spec). That can fail a fill; it does not move extra tokens.
FeeTaker itself lives in the limit-order-protocol dependency
and was not re-reviewed here.
Not submitted.
2026-09-03: 1inch Fusion whitelist / PowerPod / KycNFT (b68b27b)
Same Immunefi program (1inch-SmartContracts, $500,000, kyc: true).
Local clone /tmp/1inch-fusion. Delegation parents from
1inch/delegating tag 1.1.0 (ebd1a17). No mainnet interaction.
Files: contracts/{WhitelistRegistry,CrosschainWhitelistRegistry,PowerPod,KycNFT}.sol;
1inch/delegating contracts/{FarmingDelegationPlugin,TokenizedDelegationPlugin,DelegationPlugin,DelegatedShare}.sol.
Checked for: on-chain registry gating Fusion fills; flash-loan
register then settle; _clean skipping a swapped-in address;
permissionless promote impersonating a resolver; PowerPod
balanceOf inflation; KycNFT mint/transfer without an owner
signature.
Result: no user-exploitable finding.
- Fusion fills do not read
WhitelistRegistry.SimpleSettlementgates on the order-packed 10-byte list plusKycNFT/ access-token balance (already reviewed). Register / clean / promote only change an off-chain resolver roster and per-chain worker hints. registerrequiresbalance * 10000 >= totalSupply * thresholdandbalance > 0.registerthen_cleans anyone now under the threshold.cleanis permissionless. Threshold changes are owner-only and do not evict untilclean._cleanuses AddressSet swap-remove: on eviction it decrements length and re-checks the same index. Tests cover mixed burns.promotedoes not require whitelist membership.getPromoteesonly maps current whitelist members, so a stale mapping is invisible after eviction.- PowerPod itself disables
transfer/transferFrom/approve.balanceOfis minted to the delegatee from st1INCH plugin balances. DelegatedShare mint/burn isonlyOwnerPlugin. A flash-loan of PowerPod is not possible; staking 1INCH has a lock. Even a temporary register would not open a Fusion fill. KycNFTmint andtransferFromare owner-only or EIP-712-signed by the owner._updatebumpsnonces[tokenId]and enforces one token per address.safeTransferFromgoes through the overriddentransferFrom. Burn: owner any id, holder their own. No public mint path.
Not submitted.
2026-09-03: 1inch FeeTaker / AmountGetterWithFee (4.3.2 / 67c56ae)
Same program. In-scope repo 1inch/limit-order-protocol.
Fusion depends on npm 4.3.3; git’s latest 4.3.x tag is
4.3.2 (67c56ae). Local clone /tmp/1inch-lop. No mainnet
interaction.
Files: contracts/extensions/{FeeTaker,AmountGetterWithFee,AmountGetterBase}.sol
and the taker→maker / unwrap path in OrderMixin.sol.
Checked for: fees exceeding takingAmount under unchecked;
getter vs postInteraction fee mismatch draining the maker;
whitelist-discount applied only on one side; ETH unwrap
leaving WETH stranded or sending unbacked ETH; extra
postInteraction pulling leftover taking tokens; integrator
fallback reentering a fill to steal FeeTaker inventory.
Result: no user-exploitable finding.
_parseFeeDatacapsintegratorShareand the whitelist discount at 100. Combined integrator + resolver fee istakingAmount * (integratorFee + resolverFee) / (1e5 + fees), which is strictly belowtakingAmount. Fusion’s surplus add-on is capped at 100% of the leftover, so the maker still receives at least the Ceil-scaled estimate (already reviewed).- Getter extraData and postInteraction extraData are different
extension fields. Getter whitelist is
size + 10*N; Fusion postInteraction whitelist isallowedTime + size + 12*N. A builder can encode different lists; the maker signed both. InconsistentFeereverts if fees are non-zero butorder.receiveris not FeeTaker, so tokens cannot be taken from a maker who never sent them here.- LOP unwraps WETH to
getReceiver()(FeeTaker) beforepostInteraction. FeeTaker then_sendEths integrator / protocol / maker. Direct WETH fillssafeTransfer. - Remaining-amount invalidation is written before transfers.
Same-order reentrancy hits a reduced remaining (or
ReentrancyDetectedon a still-new remaining order). A different order filled from an integrator fallback cannot callrescueFundsorpostInteraction(owner / LOP only) and FeeTaker never approves a spender, so leftover inventory from the outer fill is not extractable.
1inch Fusion settlement + registry + access-token + FeeTaker money path is exhausted at this commit. Remaining 1inch in-scope trees (token-plugins, farming, cross-chain-swap, Solana) are separate slices.
Not submitted.
2026-09-03: Intuition MultiVault deposit/redeem (94bddae)
Immunefi program intuition ($100,000, kyc: true, launched
8 Jul 2026). In-scope assets are live proxies (MultiVault,
curves, emissions, atom wallets) plus primacy of impact.
Local clone /tmp/intuition-v2. No mainnet interaction.
Files: src/protocol/{MultiVault,MultiVaultCore}.sol,
src/protocol/curves/LinearCurve.sol.
Checked for: vault assets vs contract ETH insolvency after
create/deposit/redeem; ghost min-share backing on atom,
triple, and counter vaults; protocol/entry/exit/atom-wallet
fees reserved twice or not at all; redeeming someone else's
shares to a third party; batch msg.value mismatch;
empty-supply inflation on LinearCurve; fee flow from a
non-default curve emptying the source vault for remaining LPs.
Result: no new user-exploitable finding.
createAtoms/createTriplesrequiremsg.value == sum(assets). Atom cost isatomCreationProtocolFee + minShare; triple cost istripleCreationProtocolFee + 2 * minShare. Those minShare units back ghost shares on the default Linear curve (1:1previewMint). Counter triple gets the second minShare.- Subsequent deposits add
assetsAfterFeesto the chosen curve. Protocol and atom-wallet fees stay as contract ETH for sweep/claim. Entry fee and triple atom-fraction go to the default curve via_increaseProRataVaultAssets, and only once default shares are abovefeeThreshold. - Redeem subtracts
convertToAssets(shares)from the source vault, pays the user net of protocol+exit, and (if above threshold) adds the exit fee to the default curve. Remaining source LPs keep the pre-redeem price; the fee ETH is re-attributed, not double-spent. - Ghost
minSharecannot be burned (remainingShares < minSharereverts). LinearCurve empty-supply deposit isshares = assets; create/init never leavetotalShares = 0with leftover assets. - Redeem always burns
receiver's shares and sends ETH toreceiver. A third party needs redemption approval and cannot redirect the payout. nonReentranton create/deposit/redeem/claim. Admin fee setters are role-gated. Default-curve-must-be-created-via create paths blocks a first-depositor inflation on the pro-rata vault.- Repo
POST-MORTEM.mddocuments a Nov 2025 TrustBonding / VotingEscrow_supply_atunderflow (PR #126). Not re-reported. Progressive / Offset curves and emissions were not reviewed in this slice.
C4 2026-03 + mitigation 2026-04 and two Diligence reports already cover this tree.
Not submitted.
2026-09-03: Sky PAS + SBEBeam (commit 947e71c / beam)
Immunefi program sky ($10,000,000, kyc: false). Newest GitHub
scope added 1 Sep 2026 at
sky-ecosystem/pas@947e71cd5dbaaf9c5b3840dd1b23e8e99d9a564d
(BeamState, Configurator, PASMom, timelock/Timelock,
timelock/Bytes32LinkedList) plus dss-flappers beam
SBEBeam.sol (in-scope 17 Aug). Local clones /tmp/reviews/pas
and /tmp/reviews/dss-flappers. No mainnet interaction.
Files read in full.
Checked for: an unauthorized party collapsing an unlimited rate-limit key; hop / maxChange overflow wrapping a cap increase; timelock self-call or executor bypass; linked-list pointer corruption on add/remove; SBEBeam bounds that let a facilitator halt or under/over-burn surplus.
Result: no user-exploitable finding.
Configurator.setRateLimitlocks a key as unlimited only when BeamState default is(max, 0)or the live key is already(max, 0)and default is(0, 0). If the live key is unlimited and a finite default exists, themaxAmount <= current.maxAmountclause is always true, so an authorized cBeam can drop unlimited → a tiny finite cap in one call with no hop. BeamState already documents that once cBeams are paired they can interfere and that this is assumed monitored. Trusted-role / known assumption.- Hop applies only to increases. Decreases are always
allowed.
maxChangemust be 0 or ≥ WAD. Multiplicationcurrent.maxAmount * maxChange / WADis skipped when current istype(uint256).maxby the unlimited-lock branch or by the<= current.maxAmountalternative. - Timelock:
schedule/executesingles revert; batch rejectstargets[i] == address(this);DEFAULT_ADMIN_ROLEis revoked from the timelock itself;EXECUTOR_ROLEisaddress(0)(anyone after delay); pause/cancel/admin-immediate-delay match the in-file notes.Bytes32LinkedListrejectsbytes32(0)and duplicates; remove updates first/last and both neighbors. PASMom.setOwner(0)permanently bricksonlyOwner.authstill works through a leftoverauthority. Admin footgun, not a user extract.SBEBeam.setmatches its notes:kbump ≤ maxKbumpand% RAY == 0,burn ≤ WAD,minHop ≤ hop ≤ 5 years,kbump / hop ≤ maxRate,taucooldown. A facilitator (buds) can stall the burn stream by lowering throughput; governance can revive. Documented.
Not submitted.
2026-09-03: Intuition AtomWallet + OffsetProgressive + utilization (94bddae)
Same program and commit as the MultiVault deposit/redeem
slice. Local clone /tmp/reviews/intuition-v2. No mainnet
interaction. Covers the slices that slice left open.
Files: src/protocol/wallet/AtomWallet.sol,
src/protocol/curves/OffsetProgressiveCurve.sol,
src/protocol/emissions/TrustBonding.sol (ratio math only).
Checked for: 77-byte validity-window replay; unclaimed wallet
owner spoof; remaining square underflow on the offset
curve; utilization delta that inflates veTRUST rewards;
create-cost vs progressive mint if default curve is switched.
Result: no user-exploitable finding.
- AtomWallet 77-byte signatures hash
userOpHash ‖ validUntil ‖ validAfter(the v1.0.2 bind). Other lengths are malformed (fail, zero window) or plain 65-byte ECDSA (no expiry). Unclaimedowner()is alwaysmultiVault.getAtomWarden(). OffsetProgressiveCurve._convertToAssetsusesPCMath.square(notsquareUp) on both edges, matching the hardening note. Slope must be even and non-zero.- Utilization is
int256. A negative epoch delta returns the configured lower bound (min 25% personal / 40% system). It does not mint extra rewards. Skip the known VotingEscrow_supply_atunderflow (PR #126). - If an admin later pointed
defaultCurveIdatOffsetProgressiveCurve, create cost would still chargeminSharewei while vault totals credited the largerpreviewMint.onlyRole(DEFAULT_ADMIN_ROLE)footgun, not a user path.
Not submitted.
2026-09-03: Intuition ProgressiveCurve + emissions mint/bridge (94bddae)
Same program and commit. Local clone /tmp/reviews/intuition-v2.
No mainnet interaction.
Files: src/protocol/curves/ProgressiveCurve.sol,
src/libraries/ProgressiveCurveMathLib.sol,
src/protocol/emissions/{BaseEmissionsController,SatelliteEmissionsController}.sol,
claim budget in TrustBonding.claimRewards.
Checked for: deposit/redeem rounding that pays a later LP
more than the curve holds; mint quoting cheaper than
deposit; double-mint of an epoch; satellite transfer
draining user TRUST; unclaimed-epoch withdraw racing a late
claim.
Result: no user-exploitable finding.
- Deposit:
shares = sqrt(s² + assets/½m) − s(squaredown,divdown). Redeem:(s² − sNext²) × ½m(both squares down). Rounding leans against the taker, not toward extra assets out. previewMintusessquareUp(sNext) − square(s)andmulUp, so an exact-share mint quotes ≥ the deposit inverse. Slope must be even and non-zero.mintAndBridgeisCONTROLLER_ROLE, one mint per epoch (_epochToMintedAmount[epoch] > 0reverts), refunds excess gas. Adminwithdraw/burnareDEFAULT_ADMIN_ROLE.- Satellite
transferisCONTROLLER_ROLE(TrustBonding claim path).withdrawUnclaimedEmissions/bridgeUnclaimedEmissionsrequire the epoch to be ≥2 epochs old (getUnclaimedRewardsForEpochis 0 otherwise) and mark_reclaimedEmissions[epoch]. A late claim is also capped by_emissionsForEpochremaining budget.
Intuition core + periphery money paths reviewed in this
session are exhausted at 94bddae.
2026-09-03: Intuition BondingCurveRegistry + totalAssets solvency (94bddae)
Complementary pass on the same clone after the
Progressive/Offset convert reviews above. Files:
BondingCurveRegistry.sol, BaseCurve.sol.
Checked for: registry argument-order swap between deposit
and redeem; curve ID 0; convert ignoring totalAssets so
redeem pays another vault’s ETH.
Result: no user-exploitable finding.
- IDs start at 1.
previewDeposit(assets, totalAssets, totalShares)vspreviewRedeem(shares, totalShares, totalAssets)matchesIBaseCurve. Add is owner-only. - Progressive convert prices from share supply only.
Fee ETH is routed to the default Linear vault, so a
progressive vault’s
totalAssetsaccumulates rounding dust (≥theoretical area). Redeem subtracts the theoretical amount first; a 0.8 underflow would revert rather than spend another vault’s ETH.
Not submitted.
2026-09-03: Sky diamond-pau core + CCTP / 4626 / 7540 / OTC (1b6743a)
Immunefi program sky ($10,000,000, kyc: false). In-scope
sky-ecosystem/diamond-pau dev files added 6 Jul 2026.
Local clone /tmp/reviews/diamond-pau at 1b6743a. No
mainnet interaction.
Files: Controller.sol, ALMProxy.sol, ALMProxyFreezable.sol,
RateLimits.sol, AccessControls.sol, Beacon.sol,
facets/Facet.sol, libraries/ApproveLib.sol,
facets/transfer-asset/TransferAssetFacet.sol,
facets/cctp/CCTPFacet.sol, facets/erc4626/ERC4626Facet.sol,
facets/erc7540/ERC7540Facet.sol, facets/otc/OTCFacet.sol,
facets/ethena/EthenaFacet.sol.
Checked for: fallback dispatch without a role check; allocator transferring to an arbitrary destination without a rate-limit key; CCTP mintRecipient swap; 4626 first-depositor inflation past the max exchange-rate cap; 7540 claim without a pending request; OTC claim draining the buffer without a prior send; leftover ERC20 approvals on the proxy.
Result: no user-exploitable finding.
- Controller
fallbackremapsmsg.sig→delegateSelectoranddelegatecalls the wired facet. There is no ACL on the fallback; every money-moving facet function isonlyRole(ALLOCATOR_ROLE)orDEFAULT_ADMIN_ROLE.msg.senderis preserved. Beacon /updateIntegrationsare admin-only. A selector can be wired only once. ALMProxy.doCallisCONTROLLERonly. Rate-limit decrease/increase isCONTROLLERonly. Unlimited keys (maxAmount == max) skip accounting.TransferAssetFacet.transferburnsLIMIT_ASSET_TRANSFER(asset, destination)before the proxytransfer. An unset key reverts (zero-maxAmount).- CCTP mint recipient and fee-cap band are admin-set per
domain. Allocator cannot change destination. Dual rate
limits (global + domain). Approval is cleared after the
burn loop.
DESTINATION_CALLER == 0is the standard permissionless-relay CCTP setting. - 4626 deposit requires
(1e36 * assets) / shares <= maxExchangeRate(admin-set) andminSharesOut. An inflated vault that mints too few shares fails the cap. Withdraw/redeem restore the deposit limit via_tryIncreaseRateLimitusing assets received. - 7540
claimDeposit/claimRedeemonly require that a claim rate-limit key exists (maxAmount > 0), then mint/withdrawmaxMint/maxWithdrawto the proxy. The request already consumed the request-side limit. Trusted allocator. - OTC
sendpays the exchange;claimpulls the buffer balance. Next send is blocked untilclaimed + recharge >= sent * maxSlippage / 1e18. Counterparty, buffer, slippage, and recharge are admin parameters. First send is allowed (sentTimestamp == 0). ApproveLibforce-approves (zero then retry). Facets reset allowance to 0 after use.ALMProxyFreezableis a separate proxy:ALLOCATOR_ROLEmaydoCall,FREEZER_ROLEmay revoke. Not the Controller-owned ALMProxy used by these facets.- Ethena mint/burn only
approvethe official minter (allowance is left for the off-chain mint, unlike other facets). Cooldown/unstake are allocator-gated and rate-limited.setDelegatedSignerrequires the key to exist. Trusted Ethena minter + allocator.
Remaining diamond-pau facets (Aave, LayerZero, Pendle, Maple, farms, wraps, etc.) were not read.
2026-09-03: Sky emergency spells hub + stUSDS (45651a4)
Immunefi program sky ($10,000,000, kyc: false). In-scope
dss-emergency-spells added 3 Jun 2025; stUSDS spells added
21 Jul 2026. Local clone /tmp/dss-emergency-spells. No
mainnet interaction.
Files: src/{DssEmergencySpell,DssGroupedEmergencySpell}.sol,
src/stusds/{StUsdsRateSetterHaltSpell,StUsdsWipeParamSpell,StUsdsRateSetterDissBudSpell}.sol,
src/lite-psm-halt/SingleLitePsmHaltSpell.sol,
src/line-wipe/SingleLineWipeSpell.sol.
Checked for: permissionless schedule halting stUSDS / wiping
a line without being the governance hat; factory-deployed
spells that MOM would honor; done() lying so an operator
skips a still-live setter; grouped batch walking off the
ilk list; cast/execute no-ops that still mutate.
Result: no user-exploitable finding.
schedule()has no modifier. The MOM / LineMom / LitePsmMom call revertsnot-authorizedunless the spell is the currentMCD_ADMhat (integration tests writehat()to the spell, thenhat() = 0reverts). A factorydeploy()creates a new unhatted spell; poking it does nothing to production.- Once lifted as hat, anyone may poke
schedule(). That is the documented emergency-spell model, not an extract. cast/execute/actionsare no-ops. GSM delay (eta = 0) is unused because actions run inschedule.done()returns true when wards are missing or atrycall reverts, so the UI treats an unwired MOM as finished. It does not change parameters.- Grouped
emergencyActionsInBatchcapsendand requiresstart <= end. Same hat check on each ilk.
Not submitted.
2026-09-03: Sky emergency clip / OSM / DDM / splitter / SPBEAM (45651a4)
Same Immunefi program (sky) and clone /tmp/dss-emergency-spells.
No mainnet interaction. Completes the in-scope emergency-spell
tree after the hub + stUSDS / lite-psm / line-wipe pass.
Files: src/clip-breaker/{Single,Grouped,Multi}ClipBreakerSpell.sol,
src/osm-stop/{Single,Multi}OsmStopSpell.sol,
src/ddm-disable/SingleDdmDisableSpell.sol,
src/splitter-stop/SplitterStopSpell.sol,
src/spbeam-halt/SPBEAMHaltSpell.sol,
src/line-wipe/MultiLineWipeSpell.sol.
Checked for: a multi-ilk batch that skips the hat check;
setBreaker / stop on address(0) moving funds; swallowing
not-authorized so an unhatted poke still halts some ilks;
empty-registry count() - 1 underflow used as a range.
Result: no user-exploitable finding.
- Single / grouped clip, OSM, DDM, splitter, and SPBEAM all
call the matching MOM. Integration tests for the hub
already show MOM reverts
not-authorizedunless the spell is theMCD_ADMhat. Factories deploy unhatted copies that cannot mutate production. - Multi clip / OSM catch per-ilk failures and
requireif the reason isClipperMom/not-authorizedorosm-mom/not-authorized, so an unhatted poke cannot silently skip the auth check. Other reasons emitFailand continue (gas-limit escape hatch). - Multi line wipe does not swallow:
lineMom.wipereverts the wholescheduleif the hat is missing. Ilks withlineMom.ilks(ilk) == 0are skipped. xlip/osms/planofaddress(0)makesdone()true and the MOM call would revert, not move tokens.- Batch helpers use
maxEnd = count() - 1. An empty registry underflowsmaxEnd;list(start, end)then depends on the registry and is a poke DoS, not an extract. Live MCD ilk count is not zero.
dss-emergency-spells at 45651a4 is exhausted.
Not submitted.
2026-09-03: Sky diamond-pau Aave / LayerZero / Pendle / UniV3 (1b6743a)
Same Immunefi program and clone as the earlier diamond-pau core slice. No mainnet interaction.
Files: facets/aave/AaveFacet.sol,
facets/aave-v4/AaveV4Facet.sol,
facets/layer-zero/LayerZeroFacet.sol,
facets/pendle/PendleFacet.sol,
facets/uniswap-v3/UniswapV3Facet.sol.
Checked for: a malicious aToken/spoke that redirects the approve; LayerZero send to an unset or attacker recipient; Pendle redeem through an aggregator swap; UniV3 swap without a TWAP bound; first-depositor / deficit purchase on Aave v4.
Result: no user-exploitable finding.
- Aave v3 deposit requires admin
maxSlippageand burnsLIMIT_AAVE_DEPOSIT(underlying, pool, aToken). Pool and underlying come from the aToken. Withdraw measures underlying received and restores the deposit limit. Allocator-only. - Aave v4 additionally requires
hub.getAssetDeficitRay(assetId) <= maxDeficits(default 0, so any deficit blocks until governance opts in). Position change is read fromgetUserSuppliedAssets, not the return tuple. Withdraw rate-limit key omits hub/asset so a remapped reserve can still exit. - LayerZero recipient is admin-set per
dstEid. In-file note: keep the rate limit at zero until OFT integration tests land.minAmountLDfloors todecimalConversionRate. Quote is a proxystaticcall.sendrefunds fees to the proxy; leftover controller ETH is swept. Approval cleared whenapprovalRequired. - Pendle redeem only on
isExpiredmarkets, withSwapTypenone (no ext router).minTokenOutispyAmountIn * 1e18 / pyIndexCurrent - 5, plus the allocator'sminAmountOut. In-file: do not use non-standard SYs without extra tests. - UniV3 swap requires TWAP seconds, a tick-delta cap, and
minAmountOut. Liquidity mint/increase goes to the proxy NFT; remove checks ownership and slippage vs adminmaxSlippage. Aggregate rate limits assume pegged stables (documented).
Not submitted.
2026-09-03: Sky diamond-pau Maple / farms / wraps / Curve / PSM (1b6743a)
Same Immunefi program (sky) and clone /tmp/diamond-pau
at 1b6743a. No mainnet interaction. Aave / LayerZero /
Pendle / UniV3 / Aave V4 were logged in the prior entry.
Files: src/facets/maple/MapleFacet.sol,
src/facets/farm/FarmFacet.sol,
src/facets/wsteth/WSTETHFacet.sol,
src/facets/weeth/WEETHFacet.sol,
src/facets/wrap-proxy-eth/WrapProxyETHFacet.sol,
src/facets/curve/CurveFacet.sol,
src/facets/psm/PSMFacet.sol.
Checked for: Maple cancel restoring request capacity so a
second redemption could exceed the request limit; farm
getReward sending rewards off-proxy; wstETH/weETH claim
paying a caller-chosen owner; Curve slippage mins that do
not bind the pool call; leftover approvals; PSM fill
loop that credits a partial swap.
Result: no user-exploitable finding.
- Maple
requestRedemptionburnsLIMIT_MAPLE_REQUEST_REDEEMbyconvertToAssets(shares)beforerequestRedeem(shares, proxy). Cancel only requires that a cancel key exists (same pattern as 7540 claim) and does not restore the request limit. - Farm deposit/withdraw burn their keys;
claimRewardonly requires the claim key exists.getRewardis called on the farm; the delta is measured onrewardsTokenat the proxy. - WSTETH unwraps WETH then
doCallWithValue(wsteth, "", amount)(expects a payable submit/wrap). Request burns the stETH-equivalent; claim requires the claim key and wraps received ETH to WETH on the proxy. WEETH deposit checksminSharesOut. WithdrawrequestWithdrawpays the eETH to aweethModuleauthorized by the rate-limit key, then claim is module-gated the same way.WrapProxyETHFacet.wrapAllwraps the proxy's full ETH balance if the wrap key exists. - Curve swap/add/remove require admin
maxSlippageand compare mins tostored_rates/get_virtual_price. Unseeded pools (virtualPrice == 0) cannot be deposited into. Rate limits run after the pool call (swap vs deposit split on add). PSM USDS↔USDC is 1:1 through immutabledaiUSDS+ lite PSM; the fill loop reverts ifrush()is 0 before the full amount is swapped. DAI/USDC/USDS approvals are reset.
Not submitted.
2026-09-03: Sky diamond-pau UniV4 / DualPool / PSM3 / remaining facets (1b6743a)
Same Immunefi program (sky) and clone /tmp/diamond-pau
at 1b6743a. No mainnet interaction. Completes the
in-scope facet tree after the Aave/LZ/Pendle and
Maple/farms/wraps/Curve/PSM passes.
Files: src/facets/uniswap-v4/UniswapV4Facet.sol,
src/facets/dual-pool/DualPoolFacet.sol,
src/facets/psm3/PSM3Facet.sol,
src/facets/dai-usds/DAIUSDSFacet.sol,
src/facets/usds/USDSFacet.sol,
src/facets/basin/BasinFacet.sol,
src/facets/centrifuge/CentrifugeFacet.sol,
src/facets/spark-vault/SparkVaultFacet.sol,
src/facets/superstate/SuperstateFacet.sol,
src/facets/merkl/MerklFacet.sol,
src/facets/nfat-halo/NFATHaloFacet.sol,
src/facets/nfat-prime/NFATPrimeFacet.sol,
src/facets/weeth/WEETHModule.sol.
Checked for: a fabricated UniV4 PoolKey that bypasses
slippage/rate limits; DualPool hook return values that
under-report spend; PSM3/Basin receiver other than the
proxy; Centrifuge transfer to a caller-chosen recipient;
Merkl toggleOperator for an unlisted operator; NFAT
Halo issue that credits gem off-proxy; leftover
Permit2 allowances; WEETH claim sweeping the wrong
recipient.
Result: no user-exploitable finding.
- UniV4 mint/increase require admin tick limits and
hooks == 0. NFT recipient is the proxy. Increase checksownerOf == proxy. Decrease sendsTAKE_PAIRto the proxy; PositionManager still gates who can modify a tokenId. Swap hashes the callerPoolKeytopoolId; a fabricated key has nomaxSlippageand reverts. Permit2 allowances are set toblock.timestampthen cleared. - DualPool measures spend/receipt by proxy balance
diffs, not hook return values. Deposit requires
previewWithdraw(shares)value ≥ paid ×maxSlippage. Withdraw requires allocator mins ≥ preview × slippage (governance floor if the allocator is compromised). Unset poolId reverts. - PSM3 deposit/withdraw receiver is the proxy.
Immutable
psm. Rate limits per asset. Basin is the same shape plusminSharesOut/minConversionRate. DAIUSDS is 1:1 through immutabledaiUSDS. USDSmintdraws to the admin-set vault buffer thentransferFroms to the proxy;burnis the reverse and restores the mint key. - Centrifuge cancel/claim only require that the
matching key exists.
transferSharespays the adminrecipients[centrifugeId]via the vault's spoke. Request id is always 0 (documented). - SparkVault
takeburnsLIMIT_SPARK_VAULT_TAKEthentakes into the proxy. Superstatesubscribeis USDC→USTB on immutable addresses and clears the USDC allowance. MerkltoggleOperatorrequires a(distributor, operator)key; user is the proxy. - NFAT Halo
issuemeasuresgemreceived on the proxy;tois the facility NFT recipient and is part of the issue rate-limit key. One tokenId per facility. Interest is capped by adminmaxAnnualGrowthRate. Repay spends from the proxy and clears allowance. Prime subscribe/withdraw/ collect rate-limit actualgemdeltas;datais allocator-chosen on a key-gated facility. WEETHModule.claimWithdrawalis proxy-only, requires a valid finalized request, wraps ETH, and transfers WETH to the proxy.
diamond-pau facet sources at 1b6743a are exhausted.
Not submitted.
2026-09-03: Intuition TrustSwapAndBridgeRouter (bb34cc2)
Immunefi program intuition (in-scope Base asset
0xE485D9a5Dc39774b7A80864B625969Cf9d93E5D7). Source is
not in intuition-contracts-v2; local clone
/tmp/intuition-periphery (0xIntuition/intuition-contracts-v2-periphery
bb34cc2). Repo README lists Base
0xA1EC6f95A88Bfc7A8Fd35f1296b64ebaf91C93fb. Reviewed
this tree only. No mainnet interaction.
Files: contracts/TrustSwapAndBridgeRouter.sol.
Checked for: a path that does not end in TRUST but still
bridges; swap output sent to the caller; bridge fee quoted
on minTrustOut while a larger amountOut is sent;
ETH-path refund of another user's leftover; missing
receive so Slipstream refundETH DoS (known S-324);
leftover allowance used against a later user.
Result: no user-exploitable finding.
- ETH and ERC20 swaps require the packed path to start
with WETH/
tokenInand end with TRUST. Each hop must exist in the Slipstream CL factory.tokenIncannot be TRUST. Swaprecipientis this router; Metalayer recipient is the caller-chosen dest.nonReentrant. exactInputenforcesamountOutMinimum: minTrustOut. Bridge fee is quoted onminTrustOut(ETH/ERC20) or the exacttrustAmount(direct bridge). If the hub fee scales with amount andamountOut > minTrustOut,transferRemotereverts. Successful txs send the received TRUST.- ERC20/direct-bridge refund
msg.value - feetomsg.sender. ETH swap spendsmsg.value - feeas WETH in; SlipstreamrefundETHdust stays on this router (receive()). Tests document that leftover (S-324 was a SwapRouter contamination DoS, now accepted viareceive). No sweep; dust is not an extract. - Allowances use
safeIncreaseAllowanceto the immutable official router/hub. No third-party spender.
Not submitted.
2026-09-03: Origin OUSD vault + Curve AMO (4fa0602)
Immunefi program originprotocol ($1,000,000, kyc: false).
OUSD Token / Vault / Curve AMO were added to scope on
1 Sep 2026 (etherscan assets; source in Origin Dollar).
Local clone /tmp/origin-dollar at 4fa0602. No mainnet
interaction. Continues the earlier Origin strategy /
bridge slices.
Files: contracts/contracts/vault/VaultCore.sol,
contracts/contracts/vault/OUSDVault.sol,
contracts/contracts/strategies/CurveAMOStrategy.sol.
Checked for: a user mint that credits more OUSD than
assets pulled; claiming another account's withdrawal;
mintForStrategy from a non-whitelisted caller;
Curve AMO withdraw that transfers more hard asset than
removed; strategist rebalance that worsens the peg
without the solvency floor.
Result: no user-exploitable finding.
mintscales the asset to 18 decimals, mints that many OTokens, thensafeTransferFroms the asset.whenNotCapitalPaused+nonReentrant. Auto-allocate only aboveautoAllocateThreshold, after the withdrawal queue is filled.mintForStrategy/burnForStrategyrequire bothstrategies[msg.sender].isSupportedandisMintWhitelistedStrategy. Curve AMO is the intended caller. NononReentrant(documented AMO reentry during allocate); user mint/redeem cannot be wired to those strategies in production.- Async withdraw burns OUSD on request (1:1, asset
decimals in
queued). Claim requires the requester, the delay,queued <= claimable, and not already claimed._postRedeemrejects if|supply/value - 1| > maxSupplyDiff. Rebase is operator/strategist/governor and only increases supply up to vault value, with a trustee fee on yield. - Curve AMO
deposit/withdrawareonlyVault. Deposit mints OUSD between 1× and 2× the hard asset to rebalance, thenadd_liquiditywithmaxSlippage. Withdraw computes LP from the pool hard-asset share, requiresmin[hardAsset] = amount, burns all OUSD left on the strategy, transfers exactly_amount. Strategist one-sided adds/removes useimprovePoolBalance(must move the hardAsset−OUSD diff toward zero without overshoot) and_solvencyAssert(≥ 99.8% backed).
Leather was not started: the program requires a working PoC against the current published extension/app build and forbids theoretical reports.
Not submitted.
2026-09-03: Origin WOETH / WOUSD + Ethena ARM (4fa0602 / 2322537)
Immunefi program originprotocol ($1,000,000, kyc: false).
Wrapped Super OETH (Base wsuperOETHb) and Ethena ARM /
Aave market / Unstaker were added Jul–Aug 2026. Local
clones /tmp/origin-dollar 4fa0602 and /tmp/arm-oeth
2322537. No mainnet interaction.
Files: contracts/contracts/token/{WOETH,WOETHBase,WrappedOusd}.sol,
src/contracts/{AbstractARM,EthenaARM,EthenaUnstaker}.sol,
src/contracts/adapters/EthenaAssetAdapter.sol,
src/contracts/markets/Abstract4626MarketWrapper.sol.
Checked for: a WOETH donation that inflates
convertToAssets; wrapping that ignores the rebase
adjuster; an ARM swap of an unlisted pair; claiming
another LP's redeem; adapter redeem that sends USDe
off-ARM; a non-ARM deposit into the Aave 4626 wrapper.
Result: no user-exploitable finding.
- WOETH is ERC-4626 over rebasing OETH.
totalAssets/convertToShares/convertToAssetsuseadjusterandrebasingCreditsPerTokenHighres(), not the live OETH balance, so later donations are ignored.initialize2snapshotsadjusteronce (1e27if supply is 0). GovernortransferTokencannot collect the core asset.WOETHBase/WrappedOusdonly change name/symbol. - ARM swaps are USDe ↔ a configured base (sUSDe) with
operator prices and remaining-liquidity caps.
nonReentrant+whenNotPaused. Output is paid aftertransferFrom. Buy-side fees accrue from realized gain ×fee. Two-token Uniswap-v2 path only. - LP
depositpulls USDe then mintsassets * supply / netAssets. Floor + live LPs revertsInsolvent. Redeem escrows shares, FIFOqueued <= claimable(), delay, min(request-time, claim-time) assets. Operator may claim for the requester. Dead shares +MIN_LIQUIDITYblock empty-supply donation. EthenaAssetAdapter.requestRedeem/redeemareonlyARM. Cooldowns rotate across 42 unstakers;claimUnstakesends USDe to the ARM. The 4626 market wrapperdeposit/withdrawrequiremsg.sender == receiver == arm.allocate()is permissionless but only moves USDe between the ARM and that wrapper.
Not submitted.
2026-09-03: Lombard SVM asset_router / bridge / bascule / mailbox (09d5e76)
Immunefi program Lombard Finance ($250,000, kyc: true).
Solana trees added 25 Jun 2026. Local clone
/tmp/reviews/lombard-svm at 09d5e76. No mainnet
interaction. Reviewed only the money-moving mint/burn/GMP
paths in the in-scope programs.
Files: programs/asset_router/src/instructions/{deposit,redeem,redeem_for_btc,mint_from_payload,mint_with_fee,gmp_receive}.rs,
programs/asset_router/src/utils/{mod,fee,consortium_payloads,ed25519}.rs,
programs/bridge/src/instructions/{deposit,gmp_receive}.rs,
programs/bascule/src/instructions/validator.rs,
programs/bascule_gmp/src/instructions/validate_mint.rs,
programs/mailbox/src/instructions/{deliver_message,handle_message,send_message}.rs,
programs/consortium/src/instructions/finalize_session.rs.
Checked for: a replayed consortium payload that mints twice; GMP mint of a caller-chosen mint; mailbox deliver without a validated payload; bascule below-threshold bypass of consortium; fee signature that is not the recipient owner; bridge inbound without a remote-bridge sender match.
Result: no user-exploitable finding.
mint_from_payload/mint_with_feerequire a consortiumValidatedPayloadPDA forsha256(payload), destinationCHAIN_ID, native mint, and recipient-account match. Replay is aninitPDA (DEPOSIT_PAYLOAD_SPENT). Bascule is extra: above threshold the deposit must already beReported; below threshold it is markedWithdrawnwithout a report (documented). Consortium attestation is the mint gate.mint_with_feeisClaimer-gated. The fee payload is Ed25519-checked against the token-account owner via the previous native ed25519 ix (offsets must live in that ix). Fee ismin(signed, max_mint_commission)and minted to the treasury; remainder to the recipient.- Asset-router
deposit/redeem/redeem_for_btcburn (and optionally fee-transfer) the payer’s own tokens, then mailbox-send. Routes are PDA-bound. - Asset-router
gmp_receiverequires the mailboxMessageV1InfoPDA as signer, senderBTC_STAKING_MODULE_ADDRESS, recipient match, and aMESSAGE_HANDLEDinit PDA. Optional bascule_gmpvalidate_mintsame threshold pattern. - Bridge
depositis sender-whitelist + outbound direction.gmp_receiverequires mailbox signer,remote_bridge_config.bridge == message.sender, inbound direction, and consumes the inbound rate limit. Recipient may be the message pubkey or its ATA. - Mailbox
deliver_messageinits the message PDA only when consortium has both the session payload andValidatedPayloadfor that hash.handle_messageflips Delivered→Handled then CPI-signs as the message PDA.inbound_message_pathon deliver is program-owned (admin-created), matched by identifier. - Consortium
finalize_sessionrequiressession.weight >= current_weight_thresholdtheninit_if_neededthe hash PDA. Trusted notary set.
Remaining in-scope SVM (not read this pass):
lombard_token_pool, ratio_oracle, mailbox admin /
path enable, consortium valset update.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Leather wallet provider + extension RPC (eca229c)
Immunefi program leather ($5,000, kyc: true,
immunefiStandard: false, safeHarbor unset / false).
Web/app only. Assets: leather-io/mono (added 13 Jul
2026), leather.io (primacy of impact), Chrome
extension, iOS, Android, app.leather.io,
api.leather.io. Local clone /tmp/leather-mono on
dev at eca229c (2026-09-02). No live wallet,
extension, or API testing. No exploit or reproduction
steps written.
Program rules that bound this pass: reports need a working PoC against the current published Chrome / App Store build; theoretical or AI-only reports are closed; pre-release / unreleased code is out of scope; third-party dApps and protocol-level Bitcoin/Stacks bugs are out of scope; on-chain metadata spoofing is out of scope unless it becomes code execution or a signing bypass.
Files: apps/extension/src/content-scripts/content-script.ts,
apps/extension/src/background/background.ts,
apps/extension/src/background/messaging/{rpc-message-handler,rpc-request-utils,methods-requiring-connected-wallet}.ts,
apps/extension/src/background/messaging/internal-methods/message-handler.ts,
apps/extension/src/background/messaging/rpc-methods/{get-addresses,sign-psbt}.ts,
apps/extension/src/shared/{messages,permissions/permission.helpers,crypto/mnemonic-encryption,messaging/send-message-to-originating-frame,utils/urls}.ts,
apps/extension/src/app/common/psbt/use-psbt-request-params.ts,
apps/extension/src/app/features/psbt-signer/hooks/use-psbt-details.tsx,
apps/extension/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx,
packages/provider/src/{injected-provider,mobile}.ts,
apps/web/tests/xss-protection.spec.ts,
apps/extension/tests/specs/rpc-get-addresses/rpc-cross-origin-frame.spec.ts.
Checked for: a page that can drive another origin’s granted permissions; a sign/broadcast path that skips the approval popup; approval UI that is not derived from the same PSBT hex that is signed; mnemonic plaintext leaving the encrypt/decrypt helpers; internal background methods callable from a content script; HTML injection from CMS/metadata.
Result: no submittable finding.
- Content-script → background uses
chrome.runtime.connectnamedCONTENT_SCRIPT_PORT. Origin isport.sender.url/port.sender.origin(Chromium/Firefox), not a page-supplied string. Responses go to{tabId, frameId}viachrome.tabs.sendMessage. - Signing methods sit in
methodsRequiringConnectedWalletand open a popup.getAddresses/stx_getAddressesalso open a popup and do not auto-return addresses. - Internal background handler requires
sender.urlto start withchrome.runtime.getURL(''). - Permissions are keyed by hostname (
localhostkeeps the port). That is weaker than a full origin key, but without a working PoC against the published build it is theoretical and the program closes those. - PSBT approval reads
hexfrom the popup search params that the background copied from the validated request, then signs that same hex. Inputs/outputs come from@scure/btc-signerparse of that hex. Cross-origin iframes get an explicit callout (rpc-cross-origin-frame.spec.ts). - Mnemonic encrypt/decrypt uses Stacks encryption +
Argon2 salt; no extra log of the secret in those
helpers. Background
logger.infoof the RPC envelope is verbose, not a key leak. - v0.5.2-style XSS coverage on the marketing web app is a Playwright sanitizer check, not a wallet signing surface.
Not submitted. A valid Leather report would still need the participant to reproduce against the live store build; this agent will not write that PoC.
2026-09-03: OpenZeppelin Confidential Contracts v0.5.3 (4a4f6c7)
Immunefi program openzeppelin ($25,000, kyc: true).
Confidential-contracts asset added 18 Aug 2026: only
release v0.5.3
(4a4f6c71f58b75e391899b57e42e3b73d288dfe3). Local
clone /tmp/oz-confidential at that tag. Library
scope: loss of funds, permanent DoS, access-control
bypass, unintended behavior. Best-practice critiques
out of scope. No mainnet interaction.
v0.5.3 itself only extracts BatcherConfidential.quit
into _quit(batchId, account) so a derived contract
can quit on behalf of a depositor. Public quit still
uses msg.sender.
Files: contracts/finance/BatcherConfidential.sol,
contracts/token/ERC7984/ERC7984.sol,
contracts/token/ERC7984/extensions/{ERC7984ERC20Wrapper,ERC7984Rwa,ERC7984Freezable}.sol,
contracts/token/ERC7984/utils/ERC7984Utils.sol,
contracts/finance/VestingWalletConfidential.sol,
contracts/utils/{FHESafeMath,HandleAccessManager}.sol.
Checked for: unwrap/finalize that pays a different
account or amount than the burned ciphertext; join
that credits without a matching confidential transfer;
claim/quit that drains another depositor; RWA recovery
or force-transfer callable without AGENT_ROLE;
receiver hook that forges an ebool the recipient
does not own; vesting release of unvested handles.
Result: no user-exploitable finding.
onConfidentialTransferReceivedrequiresmsg.sender == fromToken. Join amount is the encrypted transfer; overflow usestryIncreaseand joins 0.dispatchBatchCallbackfinalizes the stored unwrap request or, if already finalized, re-checks the decryption proof against that request’s handle. Cancel rewrapsunwrapAmountCleartext * rateoffromToken. Partial forbids a change in underlyingtoTokenbalance. Exchange rate uses this batch’stoTokenunderlying balance; leftover wrap dust is documented to roll into the next batch.- Public
claim/quitarenonReentrant._claim/_quitare documented as needing that guard. Permissionless claim-for is documented and sends to the depositor. - Wrapper
wrappullsamount - amount % ratethen mintsamount / rate. Unwrap burns first, request id is the ciphertext (assertunique),finalizeUnwrapdeletes the request then transferscleartext * rateafterFHE.checkSignatures. Fee-on-transfer underlying is documented unsupported. Donating underlying can inflateinferredTotalSupplyand grief wraps — known, documented. - ERC7984 transfers require ACL on ciphertext amounts;
operators are time-bounded. Transfer-and-call refund
is documented best-effort if the receiver drains
itself in the hook. Receiver
eboolmust be uninitialized or ACL-owned byto(v0.5.2). - RWA mint/burn/freeze/force/recover are
onlyAgent. Force/recover bypass pause and restriction via selector allowlist, not frozen amounts (ERC7984Freezablestill clamps). - Vesting
releasetransfersreleasablethen addsamountSentto released. Handle ACL on the token is checked (v0.5.2).HandleAccessManagerdefaults_validateHandleAllowanceto false. FHESafeMathtreats uninitialized as 0; add/sub detect wrap via comparison.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Money on Chain V2 core + queue + V4 swapper (d770477)
Immunefi program moneyonchain ($10,000, kyc: true).
GitHub asset money-on-chain/stable-protocol-core-v2
added 8 Jul 2026; many Rootstock addresses added 20 Aug
2026. Local clone /tmp/moneyonchain at d770477.
Known-issues gist
nubis/9c24c0e2792e4dbb25db74f8f478756f already lists
SP-01–SP-24 on this tree (stale-price queue, liquidation
AMM bounds, reverse-auction oracle flag, flux-capacitor
TP/TP, RC20 callback refresh, locked-fund refunds,
etc.). This pass looked only for a new extract
path. No mainnet interaction.
Files: contracts/core/MocOperations.sol,
contracts/core/MocBaseBucket.sol (checkRecipient,
unlock accounting),
contracts/queue/MocQueue.sol (execute + failed-op
unlock),
contracts/multiCollateral/swapper/MocSwapperV4.sol.
Checked for: queue execute callable by a non-queue
caller; mint that credits without locking AC/TC/TP;
recipient override when _allowDifferentRecipient is
false; unlock that returns more than qACmax; V4
swapper that sends the contract’s leftover balance or
skips amountOutMin.
Result: no new user-exploitable finding.
- Enqueue mint/redeem is
notLiquidated notPaused checkRecipient._checkRecipientrevertsRecipientMustBeSenderunless the bucket allows a different recipient. TP lock calls_tpiso only registered pegged tokens enter the queue. execMintTC/ redeem / swap areonlyMocQueue. Failed mint unlocksparams.qACmaxviaunlockACInPending(onlyMocQueue); a failing AC refund is recorded insenderLockedFunds(known SP-18, no self-serve recover).MocSwapperV4is a permissionless exact-in/exact-out Uniswap v4 wrapper. It spends the caller’s tokens, checksbalanceInAfter == before - amountIn(exact in) orbalanceOutAfter == before + amountOut(exact out), and transfers only the swap delta (exact in) or the requested out plus surplus in (exact out). Pool fee/hook/tick maps are governor-set. Matches the documented V3 “no leftover sweep of whole balance” pattern; not a new extract.
Duplicates of SP-01–SP-24 were not re-filed.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Origin Aerodrome / Base Curve / Hydrex AMOs + OETH zapper + Safe modules (4fa0602)
Immunefi program originprotocol ($1,000,000, kyc: false).
superOETHb Sep-1 assets continue from the OUSD vault /
Curve AMO and WOETH slices. Local clone /tmp/origin-dollar
at 4fa0602. No mainnet interaction.
Files: contracts/contracts/strategies/aerodrome/AerodromeAMOStrategy.sol,
contracts/contracts/strategies/BaseCurveAMOStrategy.sol,
contracts/contracts/strategies/hydrex/OETHbHydrexAMOStrategy.sol,
contracts/contracts/strategies/algebra/StableSwapAMMStrategy.sol,
contracts/contracts/zapper/{AbstractOTokenZapper,OETHZapper,OETHBaseZapper}.sol,
contracts/contracts/automation/{AbstractSafeModule,CollectXOGNRewardsModule,ClaimStrategyRewardsSafeModule,ClaimBribesSafeModule}.sol.
Checked for: a user deposit that mints unbounded OETHb; withdraw that sends WETH off-vault; CL decrease with zero mins that a non-strategist can sandwich; zapper mint that credits more than ETH/WETH pulled; Safe module that moves tokens to a non-Safe address.
Result: no user-exploitable finding.
- Aerodrome AMO
deposit/withdraw/withdrawAllareonlyVault+nonReentrant. Withdraw recipient must be the vault.rebalanceisonlyGovernorOrStrategist._addLiquiditymints OETHb viamintForStrategyto match the Sugar estimate, then burns leftovers. Position is valued at the 1:1 tick (_wethAmount == 0); leftover WETH/OETHb on the strategy still count in vaulttotalValue. DecreaseLiquidity usesamount0Min/amount1Min = 0(trusted strategist);_checkForExpectedPoolPricegates ticks and the configured WETH-share interval;_solvencyAssertrequires vault value / supply ≥ 99.8%. - Base Curve AMO is the WETH/OETH twin of
CurveAMOStrategy: vault-only deposit mints between 1× and 2× OETH,add_liquiditywithmaxSlippage, then gauge-stakes. Withdraw computes LP from the pool WETH share, requiresmin[WETH] = amount, burns leftover OETH, transfers exactly_amount. Strategist one-sidedmintAndAddOTokens/removeAndBurnOTokens/removeOnlyAssetsuseimprovePoolBalance+_solvencyAssert. - Hydrex AMO is a thin GaugeV2
stakeToken()wrapper overStableSwapAMMStrategy. Vault-only deposit mints OToken in pool-reserve proportion (nearBalancedPool+skimPool), withdraw burns leftover OToken and requires enough asset removed. Same 99.8% solvency floor.withdrawAllskips solvency for emergency gauge exit. OETHZapper/OETHBaseZapperwrap ETH or pull WETH,vault.mintthe zapper’s full WETH balance, require minted ≥ ETH/WETH in, then optionally ERC-4626 wrap withminReceived. Leftover donated WETH/ETH goes to the next caller, not an extract.- Safe modules:
DEFAULT_ADMIN_ROLEis the Safe.transferTokensisonlySafeand only pays the Safe.CollectXOGNRewardsModuleoperator can onlycollectRewardsand send the OGN delta to a hardcoded rewards source. Strategy/bribe claimers onlyexecTransactionFromModulecollect selectors on a Safe-owned veNFT / whitelisted strategy list.
Remaining Origin after the AMO pass was WETH/USDC/Lido ARM (logged next) and CrossChain master/remote (also logged this turn). xOGN remains.
Not submitted.
2026-09-03: Origin WETH / USDC / Lido ARM adapters (2322537)
Immunefi program originprotocol ($1,000,000, kyc: false).
WETH ARM stETH/wstETH/eETH/weETH adapters, USDC ARM
PYUSD/USDG (Paxos) adapters, Lido ARM, and ARM zappers
were listed separately from Ethena ARM. Local clone
/tmp/arm-oeth at 2322537. No mainnet interaction.
AbstractARM swap / LP deposit / FIFO redeem was
already reviewed with Ethena ARM; this pass is the
adapter + zapper delta. HyperEVM CrossChain
Master/Remote is the same CCTP tree already logged.
Files: src/contracts/{LidoARM,MultiAssetARM,ZapperARM,ZapperLidoARM}.sol,
src/contracts/adapters/{AbstractLidoAssetAdapter,StETHAssetAdapter,WstETHAssetAdapter,EtherFiAssetAdapter,WeETHAssetAdapter,PaxosAssetAdapter}.sol.
Checked for: a non-ARM caller that opens or claims a withdrawal; redeem that sends WETH/USDC off-ARM; Ether.fi permissionless claim that burns the NFT and leaves ETH elsewhere; Paxos submit that pays a caller-chosen recipient; zapper mint of more shares than ETH wrapped.
Result: no user-exploitable finding.
- Lido / Ether.fi / Paxos
requestRedeem/redeemareonlyARM. Lido FIFO-claims only a finalized prefix owned by the adapter, wraps all ETH, and transfers all WETH to the ARM (donations included). stETH is 1:1; wstETH unwraps then usesgetStETHByWstETH. Chunks are ≤ 1000 ETH. - Ether.fi adapters pull eETH/weETH, open a queue
request to
address(this), and claim viabatchClaimWithdraw.receive()reverts unlessclaimingEtherFiis set, so a permissionless Ether.fi claim cannot burn the NFT and strand ETH.onERC721Receivedis present. - Paxos queues
pendingSharesthen the operator submits to an owner-setpaxosRecipient.redeemrequiressettlingSharesand enough settled liquidity, then sends exactlysharesUSDC to the ARM. Excess recovery is owner-only and also pays the ARM. LidoARM/MultiAssetARMonly initializeAbstractARM. Zappers wrap the contract’s ETH balance anddepositshares tomsg.sender. Lido zapper is pinned to one ARM; genericZapperARMtakes a caller-chosen ARM (user error if they pass a fake).rescueERC20is owner-only.
Remaining Origin in-scope: xOGN token (not in origin-dollar / arm-oeth; rewards module already reviewed). CapManager / Morpho market wrappers if they differ from the Ethena 4626 wrapper.
2026-09-03: OZ Confidential leftover ERC7984 modules (4a4f6c7)
Continues the v0.5.3 pass. Same Immunefi program
(openzeppelin, $25,000, kyc: true). Same clone
/tmp/oz-confidential at 4a4f6c7. No mainnet
interaction.
Files: contracts/token/ERC7984/extensions/{ERC7984Hooked,ERC7984Votes,ERC7984Omnibus,ERC7984ObserverAccess}.sol,
contracts/token/ERC7984/utils/{ERC7984HookModule,ERC7984BalanceCapHookModule,ERC7984HolderCapHookModule}.sol.
Checked for: an unprivileged install that can zero transfers; a hook that forges compliance; holder-count accounting that lets a transfer past the cap; omnibus transfer that moves tokens of an account the caller does not operate; observer that can be set on someone else’s account.
Result: no user-exploitable finding.
installModule/uninstallModulerequire_authorizeModuleChange(concrete token). Modules are trusted and keep ACL after uninstall (documented). Pre-hooks AND into oneebool; false zeroes the amount. Transient ACL on the amount is granted only to installed modules. ModulepreTransferrequires the token already allowed the ciphertext.- Balance-cap compare uses
tryIncreasethenle(future, max).setMaxBalanceisIERC7984Rwa.isAgent. Sender-visible compliance is a documented leak, not an extract. - Holder-cap must be installed before total supply is
initialized. Pre-check uses encrypted from/to
balances; post-transfer increments when
tobalance equals the transferred amount and decrements whenfromgoes to zero. Self-transfers are skipped. Mint-from-zero edge is documented and dropped when the amount is zero. - Votes just
_transferVotingUnitsof the actually transferred amount. Omnibus wrappers callconfidentialTransferFrom(operator + ACL) and only emit extra encrypted sub-account labels; no on-chain sub-account ledger. Observer can be set by the account or cleared by the current observer.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Lombard SVM token pool + ratio oracle (09d5e76)
Immunefi program Lombard Finance ($250,000, kyc: true).
Solana trees added 25 Jun 2026. Same local clone
/tmp/reviews/lombard-svm at 09d5e76. Completes the
SVM money path after asset_router / bridge / mailbox.
Files: programs/lombard_token_pool/src/instructions/{lock_or_burn_tokens,release_or_mint_tokens}.rs,
programs/lombard_token_pool/src/{lib,state}.rs,
programs/ratio_oracle/src/instructions/{publish_ratio,initialize_oracle}.rs,
programs/ratio_oracle/src/{lib,state}.rs,
programs/ratio_oracle/src/utils/consortium_payloads.rs,
programs/bridge/src/instructions/gmp_receive.rs (mint
target already reviewed; re-read for the pool CPI).
Checked for: CCIP lock that burns without the onramp
signer; offramp mint to a caller-chosen token account;
CCIP amount that does not match the GMP mint; ratio
publish without a consortium ValidatedPayload;
replay of a used ratio payload; a second oracle for
the same denom.
Result: no user-exploitable finding.
lock_or_burn_tokensrequiresauthority == router_onramp_authority, RMN + allow-list + outbound rate limit (validate_lock_or_burn). It CPI-signsbridge.depositas the pool signer. Receiver must be 32 bytes.dest_pool_datais the 32-byte payload hash.release_or_mint_tokensrequires the routerALLOWED_OFFRAMPPDA for this offramp + remote selector, thenvalidate_release_or_mint(remote pool list, inbound rate limit, RMN). It CPImailbox.handle_message(payload_hash)with the pool signer. Bridgegmp_receivemints the payload amount to the payload recipient (or that wallet’s ATA) andinitsMESSAGE_HANDLED. If the mailbox returnsInboundResponse, the pool requiresres.amount == parsed_amount. If return data is missing it skips that check — the mint already happened at the payload amount; CCIP’sdestination_amountis then informational. No extra tokens are minted. Not submitted.publish_ratiorequires a consortium-ownedValidatedPayloadPDA forsha256(payload). Decoder checks selector0x6c722c2cand word widths. Denom hash must matchoracle.denom. Timestamp must be strictly afterswitch_timeand not beyondnow + max_ahead_interval. Ratio step is bounded bycurrent * interval * threshold / (MAX * DEFAULT_INTERVAL). Replay failsOutdatedRatioUpdate. Oracle accounts areinited at[ORACLE_SEED, sha256(denom)], so one PDA per denom. Threshold/consortium updates are admin.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Origin CrossChain master/remote (4fa0602)
Immunefi program originprotocol ($1,000,000,
kyc: false). Remaining Sep-1 OETH/OUSD cross-chain
slice. Same clone /tmp/origin-dollar at 4fa0602.
Base CCTP integrator already reviewed. No mainnet
interaction.
Files: contracts/contracts/strategies/crosschain/{CrossChainMasterStrategy,CrossChainRemoteStrategy,CrossChainStrategyHelper}.sol.
Checked for: a user deposit that credits remote
balance without bridging; withdraw to a non-vault
recipient; a replayed CCTP nonce that double-counts;
a stale balance-check that inflates checkBalance
enough to mint unbacked OUSD.
Result: no user-exploitable finding.
- Master
deposit/withdrawareonlyVault+nonReentrant. Withdraw recipient must be the vault. One in-flight transfer (pendingAmount/_getNextNoncereverts if pending). Incoming CCTP tokens are swept entirely to the vault. Balance is local USDC +pendingAmount+ cachedremoteStrategyBalance. - Balance-check messages must match
lastTransferNonce. Confirmations clearpendingAmountonly whentransferConfirmationis set. Out-of-order or older-than-1-day checks are ignored. Stale cache is documented; it is not a user mint path (vaultmintstill pulls assets). - Remote local
deposit/withdrawareonlyGovernorOrStrategist. CCTP deposit marks the nonce, then tries 4626depositin a try/catch so a failed Morpho deposit still sends the confirmation (USDC stays on the remote strategy). Withdraw sends only if idle USDC covers the request; otherwise it tries 4626 withdraw first.
2026-09-03: Lombard mailbox admin + consortium valset (09d5e76)
Same Lombard Finance program and clone as the token_pool / ratio_oracle pass above. This pass only covers leftover admin paths that that write-up did not list.
Files: programs/mailbox/src/instructions/{enable_inbound_message_path,admin}.rs,
programs/consortium/src/instructions/update_valset.rs,
utils/session_payloads.rs (UpdateValSetPayload +
validate_valset).
Result: no user-exploitable finding.
- Inbound-path enable and treasury / fee / pause-unpause
are admin-only
init/ config writes. update_valsetrequires a current-epochValidatedPayload, hash-matching session payload,epoch == current+1, incrementing height, unique non-zero weights, andsum(weights) >= threshold. Trusted notary set.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Sky FarmOwner (dss-flappers 6f3c910 / beam)
Immunefi Sky ($10,000,000, no KYC). In-scope 17 Aug add
FarmOwner.sol (paired with already-reviewed SBEBeam).
Local clone /tmp/reviews/dss-flappers at 6f3c910.
No mainnet interaction.
File: src/FarmOwner.sol.
Checked for: a non-ward calling farm admin; recovered tokens stranded or sent to the caller; ownership escape without a ward.
Result: no user-exploitable finding.
- Every forwarded farm method is
auth(wards==1). Constructor relies the deployer.rely/denyare ward-gated. recoverERC20pulls to this contract (the farm owner) thentransferstokenAmountto ward-chosento. Comment documents no fee-on-transfer. Pre-existing dust of the same token would ride along or cause the transfer to fail — trusted ward, not an external drain.nominateNewOwner/acceptOwnershipcan move farm ownership off this adapter. Trusted wards (Pause Proxy / SBEBeam).
Not submitted.
2026-09-03: Alchemix V3 core money paths (ea6f58b)
Immunefi program alchemix-1 ($150,000 USDC, kyc: false, live). Scope is
github.com/alchemix-finance/v3/tree/master/src
(added 6 Apr 2026). The 2025 audit competition is
closed; this is the standing bounty. Local clone
/tmp/reviews/alchemix-v3 at ea6f58b. No mainnet
interaction.
Files: AlchemistV3.sol (deposit, withdraw,
mint / mintFrom, burn, repay, liquidate /
batchLiquidate / _doLiquidation /
calculateLiquidation, redeem, selfLiquidate,
_earmark, _sync, _computeUnrealizedAccount,
_addDebt / _subDebt / _subCollateralBalance,
converters), Transmuter.sol (create / claim /
pokeMatured), AlTokenV3.sol (burn / burnFrom),
AlchemistTokenVault.sol.
Checked for: a deposit that credits without a transfer;
withdraw past the min-collateral lock; mint without an
NFT owner / allowance; same-block mint-repay; burn of
earmarked debt that starves the transmuter; repay that
fees a third party into insolvency; liquidation of a
healthy account or seizure above realized collateral;
permissionless redeem; transmuter claim that over-
redeems the alchemist; alUSD burnFrom without allowance.
Result: no exploitable finding on this pass.
depositwrites collateral thentransferFrom. Cap is_mytSharesDeposited + amount.tokenId == 0mints an NFT torecipient; a non-zero id accepts donated MYT (no owner check). Donation cannot mint debt.withdrawis NFT-owner only, earmarks + syncs, locksmulDivUp(debtShares, minimumCollateralization, 1e18), then_validate. ThecollateralBalance > _mytSharesDepositedclamp only fires when one account already exceeds global tracked shares (prior insolvency / drift).mint/mintFromowner-or-allowance;_addDebtrequirescollateralValue >= mulDivUp(newDebt, minCR, 1e18). Same-block mint↔repay/burn is blocked both ways.burnonly hits unearmarked debt and caps attotalSyntheticsIssued - transmuter.totalLocked().repaycan target any position. Protocol fee is taken from the position’s collateral on the earmarked slice only (fee < earmarkedYieldwhile debt drops by the full credit), so a grief-repay cannot push a min-CR position under the lock by fee alone. Pulled MYT goes to the transmuter; fee MYT from the position goes toprotocolFeeReceiver.liquidateno-ops on a healthy account (CR > collateralizationLowerBound) or a zero-price MYT share. Earmarked debt is force-repaid from the account first._doLiquidationclamps seize / debt burn to realized shares andaccount.debt. Residual unhealthy + zero collateral uses_clearableDebt. Liquidator fee is taken from seized MYT or the fee vault, never minted.redeemisonlyTransmuter. Survival / earmark weights are Q128 packed;amountis capped to live earmarked. Fee is skipped if tracked MYT cannot cover it.- Transmuter
createRedemptionlocks synthetics under bothdepositCapandalchemist.totalSyntheticsIssued.claimRedemptionis owner-only, not same-block, burns the NFT, scales by an up-rounded bad-debt ratio, redeems only the shortfall vs already-held MYT, and returns leftover synthetics on shortfall.pokeMaturedonly frees the active cap. AlTokenV3.burnFromdeducts allowance unlessmsg.sender == account, then optional xERC20 burner limits. Token vault: anyone deposits, only authorized withdraws.
Remaining Alchemix src/ after the core pass: concrete
protocol strategies, Euler adapter, StakingGraph.
Not submitted.
2026-09-03: Alchemix V3 MYT adapter, allocator, router, fee vaults (ea6f58b)
Same Immunefi program (alchemix-1, $150,000, no KYC).
Same clone /tmp/reviews/alchemix-v3 at ea6f58b. No
mainnet interaction. Continues the alchemist/transmuter
pass with the Morpho-V2 adapter layer and the EOA
router.
Files: MYTStrategy.sol, strategies/ERC4626Strategy.sol,
AlchemistAllocator.sol, AlchemistGate.sol,
AlchemistETHVault.sol, adapters/AbstractFeeVault.sol,
router/AlchemistRouter.sol.
Checked for: a non-vault allocate/deallocate; a 0x swap that drains a protected token; allocator cap bypass; router depositing into someone else’s NFT or keeping the position; repay leftover MYT stuck on the router; ETH receive that steals a WETH unwrap; unauthorized fee-vault withdraw.
Result: no user-exploitable finding.
MYTStrategy.allocate/deallocateareonlyVault. Kill-switch reverts allocate (it does not silently skip). Force-deallocate is limited toActionType.directon strategies that opt in.dexSwappays the owner- set 0x allowance holder and enforcesminAmountOut.rescueTokenscannot move the MYT asset (or, in ERC4626Strategy, the receipt shares). Deallocate requires_totalValue() >= assetsafter the pull.AlchemistAllocatoris admin/operator. Caps combine vault absolute/relative caps with classifier global and (for operators) local risk caps. Swap calldata is operator-chosen;minIntermediateOutis 0 on the swap helpers (trusted operator slippage).AlchemistGateis an owner-only auth map. Fee vaults authorize the alchemist + owner at construct;withdrawisonlyAuthorized. ETH vault unwraps WETH, records deposits only as events, and sends ETH under a reentrancy guard.receive()donations add tototalDepositswithout a depositor credit.- Router holds no funds between txs. Existing-position
deposit/withdraw/self-liquidate require
ownerOf == msg.sender. New positions mint to the router then transfer the NFT to the caller. Borrow on an existing id usesmintFrom(needsapproveMint). NFT custody is documented to reset mint allowances. Repay refunds unused MYT via a pre/post balance delta.receiveonly accepts ETH while_ethExpectedis set around WETH unwrap.
Remaining Alchemix after the adapter pass: none of the previously listed leftover files (see the strategies pass below). Not submitted.
2026-09-03: Alchemix V3 concrete strategies + Euler + StakingGraph (ea6f58b)
Same Immunefi program (alchemix-1, $150,000, no KYC).
Same clone /tmp/reviews/alchemix-v3 at ea6f58b. No
mainnet interaction.
Files: strategies/{Aave,Moonwell,EtherfiEETH,SFraxETH,SiUSD,StakeDAOWETH,TokeAuto,WstETHEthereum,WstETHL2,OraclePricedSwap}Strategy.sol,
adapters/EulerUSDCAdapter.sol,
libraries/StakingGraph.sol.
Checked for: a non-vault pull of aTokens / mTokens / weETH / vault shares; an oracle-priced swap that accepts a stale or zero answer; deallocate that approves more than the vault requested; Enso / 0x calldata that a user can inject; Fenwick overflow that inflates transmuter earmarks; Euler adapter minting or moving USDC.
Result: no user-exploitable finding.
- All
_allocate/_deallocateoverrides still run only throughMYTStrategyonlyVault. Idle-balance checks and a final approve-to-msg.sender(the MYT) are the common exit. Force-deallocate stays opt-in (canForceDeallocate) and direct-only. OraclePricedSwapStrategyrequiresraw > 0,updatedAt != 0, andblock.timestamp - updatedAt <= MAX_ORACLE_STALENESS. Swap min-out is oracle * (1 - slippageBPS). Owner can retarget the feed. Child wstETH / sfrxETH / weETH / siUSD paths convert wrapped balances into oracle units before the swap cap. L2 has no sequencer-uptime check (owner staleness).- Aave supplies/withdraws via the provider pool;
aToken is protected.
adminDexSwapis owner-only. Moonwell mints/redeems with error-code checks,ceilDivon redeem, and optional ETH→WETH wrap. - Ether.fi instant redeem sizes weETH from the
liquidity-pool share math plus exit fee and a
bounded
grossRedeemAmountBuffer; it reverts whencanRedeemis false. sFRAX deposit is unwrap-WETH→minter; swap-deallocate unwraps sfrxETH to frxETH first. siUSD uses InfiniFimintAndStake/unstake+redeem(..., shortfall). - StakeDAO: Curve add/remove with virtual-price and
absolute LP floors; Enso routes are operator
calldata with a min-out and a post-hoc LP-spent
ceiling. Tokemak: deposit NAV floor, direct redeem
through Autopilot with
execToleranceBps(cap 650) and a NAV-anchored min-out; route calldata requiresminAmountOut >= shortfall. EulerUSDCAdapteris aconvertToAssetsprice view only.StakingGraphpacks a 112/144 Fenwick tree, reverts on delta/product overflow, andqueryStakeclamps tog.size. Transmuter never queries start block 0 (would underflowstart--).
Alchemix V3 src/ money-moving trees treated as
exhausted. Not submitted.
2026-09-03: Origin ARM CapManager + Morpho/Silo 4626 wrappers (2322537)
Immunefi program originprotocol ($1,000,000, kyc: false).
USDC ARM CapManager, WETH/Lido ARM Morpho markets, and
USDC ARM Aave market (same 4626 wrapper) continue the
ARM adapter slice. Local clone /tmp/arm-oeth at
2322537. No mainnet interaction.
Files: src/contracts/CapManager.sol,
src/contracts/markets/{Abstract4626MarketWrapper,MorphoMarket,SiloMarket}.sol.
Checked for: a non-ARM deposit/withdraw that mints
market shares to a third party; CapManager hook that
a user can skip or raise their own cap; reward collect
that sends MORPHO/Silo incentives off-harvester;
transferTokens of the market share token.
Result: no user-exploitable finding.
CapManager.postDepositHookis ARM-only. It checkstotalAssetsCap >= arm.totalAssets()after the deposit and, when account caps are on, decrements the LP’s remaining cap (oldCap >= assets). Caps and the total cap are operator/owner. Setting the total cap to 0 only blocks further deposits.Abstract4626MarketWrapper.deposit/withdraw/redeemrequiremsg.sender == receiver == owner == arm. Shares are minted to the wrapper, assets return to the ARM.balanceOf/maxWithdraw/maxRedeemreport 0 for any other owner.collectRewardsis harvester-only.merkleClaimis permissionless but always claims foraddress(this).transferTokensis owner-only, cannot move the market share token, and can only pay owner or harvester.MorphoMarketonly forwards MORPHO balance to the harvester.SiloMarketclaims gauge rewards to the harvester. USDC ARM “AAVE Market” is this same wrapper over a 4626 Aave market.
Remaining Origin in-scope: xOGN token
(0x63898b3b6Ef3d39332082178656E9862bee45C57) is not
in origin-dollar or arm-oeth.
Not submitted.
2026-09-03: Origin xOGN ExponentialStaking (eff0d3d)
Immunefi program originprotocol ($1,000,000, kyc: false).
xOGN (0x63898b3b6Ef3d39332082178656E9862bee45C57) is
Staked OGN. Source is OriginProtocol/ousd-governance,
not origin-dollar. Local clone /tmp/ousd-governance
at eff0d3d. No mainnet interaction.
Files: contracts/ExponentialStaking.sol,
contracts/RewardsSource.sol.
Checked for: unstaking another account’s lockup; gifting a stake that also restakes the recipient’s rewards; collecting rewards for a third party; transferring xOGN voting points; RewardsSource mint to a non-target.
Result: no user-exploitable finding.
transfer/transferFromrevert. Points are soulbound.stakealwaystransferFromsmsg.sender. Gifting (to != msg.sender) forbidsstakeRewardsand lockup extension._collectRewardsfor the recipient pays that user’s pending OGN to them, then mints only the new points.unstakereadslockups[msg.sender]. Early-exit penalty goes torewardsSource; remainder to the staker. Lockup slots are deleted, indexes stay stable.collectRewardsismsg.senderonly. GlobalaccRewardPerShareis updated from therewardsSourcedelta before the user’s debt is settled.rewardsSource.collectRewardsis try/catch so a rewards failure does not brick staking.RewardsSource.collectRewardsrequiresmsg.sender == rewardsTarget(the xOGN contract). Inflation slopes and the target are governor-only. Rate is capped at 5M OGN/day.
Origin Sep-1 / ARM / xOGN smart-contract trees that were listed as remaining are now exhausted.
Not submitted.
2026-09-03: Horizen ZenStaker + RewardAccumulator (ab92502)
Immunefi program Horizen ($10,000, kyc: true). GitHub
assets added 20 Jul 2026 at the testnet merge commit.
Local clone /tmp/horizen-staker at ab92502. No
mainnet or testnet interaction.
Files: src/{ZenStaker,Staker,RewardAccumulator,DelegationSurrogate}.sol,
src/extensions/StakerPermitAndStake.sol.
Checked for: withdrawing another account’s deposit;
claiming another deposit’s rewards; notifyRewardAmount
from a non-notifier; RewardAccumulator notify that
credits more than transferred; stake/reward token
commingling (ZEN-on-ZEN).
Result: no user-exploitable finding.
ZenStakerinherits TallyStakerunchanged for writes. Stake pulls ZEN from the caller into a per-delegateeZenDelegationSurrogate(max-approve back to the staker). Withdraw/claim require owner (and claimer for rewards). Payouts go to owner / caller. Claim fee is hardcoded 0;maxBumpTipis constructor-set (Phase 1: 0).notifyRewardAmountis notifier-only. It checkpoints, stretches the remaining stream overREWARD_DURATION, and reverts ifrate * duration > this.balance. Staked ZEN lives on surrogates, so the balance check sees only reward inventory on the staker.RewardAccumulator.transferAndNotifyRewards/notifyAlreadyTransferredRewardsare whitelist- gated (or open if whitelist is off). Notify of already-transferred tokens requiresbalance - accumulated >= amount.sendRewardsToStakeris permissionless after the window, transfersaccumulatedRewards, thennotifyRewardAmount. Un-notified donations stay stuck; they are not an extract.permitAndStakeswallows a failed permit thentransferFrom(standard). Surrogate holds tokens with no extra functions.
Not submitted. Payouts need Immunefi KYC.
2026-09-03: Origin CoW harvester + live xOGN rewards + Governor (4fa0602 / eff0d3d)
Immunefi program originprotocol ($1,000,000, kyc: false).
The Sep-1 list still had “OUSD CoW Harvester”
0xD400341aEfED0BC75176714cFdE82e8BDAA2D3b8,
Origin Governance, and Origin Timelock after the ARM /
xOGN pass. The live xOGN rewards proxy is
FixedRateRewardsSource, not the inflation
RewardsSource file in the earlier xOGN note. Local
clones /tmp/origin-dollar 4fa0602 and
/tmp/ousd-governance eff0d3d. No mainnet
interaction.
Files: contracts/harvest/HarvestingEIP1271.sol,
contracts/harvest/{AbstractHarvester,SimpleHarvester}.sol
(read to confirm the CoW address is not that path),
contracts/ExponentialStaking.sol (already logged;
rewards target only), contracts/FixedRateRewardsSource.sol,
contracts/Governance.sol.
Checked for: an EIP-1271 magic-value on an order the bot
did not sign; a reconstructed digest that is not the CoW
EIP-712 hash; a permissionless harvest that pays the
caller more than harvestRewardBps; FixedRate rewards
mint or a non-target collect; Governor threshold /
timelock bypass.
Result: no user-exploitable finding.
HarvestingEIP1271is the CoW harvester at0xD400….isValidSignaturedecodes(Order, r, s, v), requires_hashOrder(order, COW_DOMAIN_SEPARATOR) == hash, thenecrecoverof"\x19COWSWAP order digest:\n32" || hashequalsbot._isOrderValidrequires an enabled sell token, allow-listed buy token and receiver, fill-or-kill,feeAmount == 0,validTo >= now, andsellAmount >= minSellAmount. There is no minbuyAmount/ price bound — the bot is trusted.kind/ balance enums are unchecked; CoW settlement still pulls only the approvedsellTokenviaVAULT_RELAYER.setTokenConfigmax-approves the relayer;disableTokenzeros it.transferTokenscannot move an enabled sell token. Ownership cannot be renounced. Domain separator is snapshotted at deploy from ComposableCoW.AbstractHarvester.harvestAndSwapis permissionless but the implementation now calls_swap(..., IOracle(address(0x1)))and comments that this harvester is unused. The in-scope CoW address isHarvestingEIP1271, not this path.SimpleHarvesteris strategist/governor for support flags; harvest itself is open but only forwards collected rewards to dripper (wrapped native) or strategist.- Live xOGN rewards (
010_xOGNSetupScript) initializeFixedRateRewardsSourcewithrewardsTarget = xOGN.collectRewardsis target-only, paysmin(elapsed * rewardsPerSecond, balance), and does not mint. Rate / target / strategist are governor-or-strategist. Changing a non-zero rate accrues past time at the new rate (documented). The unusedRewardsSourceinflation minter is not the proxy implementation. Governanceis an OZ GovernorSettings + Bravo + quorum-fraction + timelock + late-quorum wrapper (1-day voting delay, ~2-day period, 100k xOGN threshold, 20% quorum). No custom execute path.
Origin Sep-1 Solidity named on Immunefi, including the CoW harvester and governance/timelock wrappers, is exhausted. Not submitted.
2026-09-03: 1inch Aqua solidity-utils mixins + libraries (5b597e4)
Same Immunefi program 1inch-aqua ($100k, KYC). Local clone
/tmp/reviews/1inch-solidity-utils at 5b597e4. No
mainnet interaction. Aqua opcodes / core already logged.
Files: contracts/mixins/{Simulator,Multicall,Rescuable, EthReceiver,OnlyWethReceiver}.sol,
contracts/libraries/{SafeERC20,ECDSA,UniERC20, TransientLock,Transient,Calldata,CalldataPtr, RevertReasonForwarder,StringUtil}.sol.
Composition on this program: AquaRouter is
Aqua + Simulator + Multicall + Rescuable.
AquaSwapVMRouter is Simulator + SwapVM + AquaOpcodes
(SwapVM is OnlyWethReceiver + Rescuable).
Checked for: simulate that persists a drain if a
later revert is swallowed; multicall msg.value
reuse against a payable Aqua path; rescueFunds that
pulls a maker’s shipped allowance; permit assembly
that approves a third-party spender; ECDSA recover
that accepts a high-s malleable signature;
transient lock that unlocks a different slot.
Result: no user-exploitable finding.
Simulator.simulatealwaysrevert Simulated(...)after the delegatecall. A parenttry/catchstill reverts that frame, so token/ETH moves inside the simulation unwind. Empty storage on the mixin; no collision with Aqua_balancesor Ownable.Multicalldelegatecallsaddress(this)and bubbles the first revert. Aquaship/dock/pull/pushare not payable. Sending ETH withmulticallcan only donate to the router; the owner canrescueFundsit. Not an extract.Rescuable.rescueFundsisonlyOwneranduniTransfers the router’s own balance. Aqua accounting is virtual; makers keep tokens and grant allowance. Owner cannot pull a shipped maker inventory.SafeERC20.tryPermitdispatches by length (compact/full ERC-2612, DAI, Permit2, ERC-7597 default). Owner/spender are taken from the Solidity arguments, not from attacker-controlled permit body on the compact paths. Compact deadline/expiry are documented asstored - 1.ECDSA.recoverrejectss >= n/2 + 1and leavessigner == 0.recoverOrIsValidSignaturerefusesaddress(0)before EIP-1271. Compact vs 65-byte malleability is documented; Aqua order hashes are not invalidated by raw signature bytes (Aqua mode hashes the order; signed mode uses EIP-712).TransientLibtstore/tload atslot + OFFSET.TransientLock.lockrequiresinc() == 1.Calldata.sliceunchecked variants are caller-gated; the bounds-checked overloads revert onend > length.EthReceiverrejects EOAtx.origindeposits.OnlyWethReceiveraccepts only the constructor WETH.UniERC20treatsaddress(0)and0xEeee…as native;uniTransferFromrefunds excessmsg.valuetofromand forbidsfrom != msg.sender.
Aqua-listed solidity-utils files treated as exhausted. Do not submit. Payment requires user KYC.
2026-09-03: 1inch-aqua-improvement is a different program (no proposal)
Unofficial mirror slug 1inch-aqua-improvement ($25k, KYC, not
paused, last updated 18 Aug 2026). Same GitHub blobs as
1inch-aqua, but the published rules are an improvement
proposal bounty, not a second vuln book: OOS includes new
protocol mechanics / feature requests, micro gas (< 1k), pure
refactors, and proposals without the required demonstration.
ReserveFloor / AquaFloor is therefore an ETHOnline app
(aqua-app/DESIGN.md), not an Immunefi submission. No
improvement proposal from this pass.
2026-09-03: Alchemix V3 leftover curator / gauge / 0x / NFT (ea6f58b)
Same Immunefi program (alchemix-1, $150,000, no KYC).
Same clone /tmp/reviews/alchemix-v3 at ea6f58b. No
mainnet interaction. Closes the leftover src/ files
after the strategies pass.
Files: AlchemistCurator.sol,
AlchemistStrategyClassifier.sol,
AlchemistV3Position.sol,
AlchemistV3PositionRenderer.sol, PerpetualGauge.sol,
FrxEthEthDualOracleAggregatorAdapter.sol,
utils/{PermissionedProxy,Whitelist,ZeroXSwapVerifier}.sol,
libraries/{FixedPointMath,TokenUtils,SafeERC20,Sets,SafeCast,NFTMetadataGenerator}.sol,
external/AlEth.sol.
Checked for: a non-operator addAdapter / cap raise; NFT mint or burn outside the alchemist; a user-callable gauge allocate that ignores risk caps; 0x calldata that swaps a protected token; an oracle adapter that a user can point at a stale feed; permissionless alETH mint.
Result: no user-exploitable finding.
- Curator add/remove/cap paths are
onlyOperator/onlyAdmin. ImmediatesetStrategywritesadapterToMYTthenaddAdapter; submit helpers onlyvault.submit.removeStrategyuses the mapped MYT, not themytargument.PermissionedProxy.proxyis operator-only and selector-gated. - Classifier defaults unassigned ids to risk 0 (100% / 100% caps). Admin-only writes. Trusted omission, not a user extract.
- Position NFT mint/burn is alchemist-only.
_updateresets mint allowances before transfer (already noted on the router). Renderer is metadata. PerpetualGaugeis unfinished:strategyListis never pushed (registerNewStrategyonly stampslastStrategyAddedAtand is permissionless), soexecuteAllocationalways revertsNo allocations. Vote power is livebalanceOfwith no checkpoint (transfer-then-revote would leave stale weight if the list were ever wired). Caps divide WAD by1e4instead of1e18. Tests comment the TODO. Not submitted: no live allocate path.ZeroXSwapVerifieris not imported by any production strategy. Fill parsers are marked TODO;buyTokenis unchecked. Dead code until an allocator uses it.- Frax dual-oracle adapter synthesizes
updatedAt = block.timestamp(documented). Combined with the already-logged owner staleness on oracle-priced strategies. Not a user-set feed. AlEth.solcomments say it is modified for V3 invariant testing;setWhitelist/pauseAlchemist/setCeilinghave no access control. Production token isAlTokenV3(already reviewed).- Libraries are standard mulDiv / safe ERC20 / 1-based address set / NFT SVG.
Alchemix V3 src/ treated as exhausted. Not submitted.
2026-09-03: Enzyme Blue gated redemption wrapper + share-price throttle (da3b870)
Immunefi program enzymefinance ($200,000, kyc: false).
Newest GitHub-adjacent add is
GatedRedemptionQueueSharesWrapperFactory
(etherscan, 17 Aug 2026). Local clone
/tmp/reviews/enzyme-protocol at da3b870. No mainnet
interaction. Distinct from the already-logged
enzyme-onyx ACE tree.
Files:
contracts/persistent/shares-wrappers/gated-redemption-queue/{GatedRedemptionQueueSharesWrapperFactory,GatedRedemptionQueueSharesWrapperLib,IGatedRedemptionQueueSharesWrapper,bases/GatedRedemptionQueueSharesWrapperLibBase1}.sol,
contracts/persistent/smart-accounts/share-price-throttled-asset-manager/{SharePriceThrottledAssetManagerFactory,SharePriceThrottledAssetManagerLib}.sol.
Checked for: a deposit that mints wrapped shares without
pulling assets; queue cancel after the manager has
already tallied the request; redeem outside the window
or above the relative cap; kick / force-transfer by a
non-owner; throttle that lets a signer exceed
lossTolerance in one multicall.
Result: no user-exploitable finding.
- Factory
deployrequires a dispatcher-known vault and inits the beacon proxy in the constructor.setImplementationis dispatcher-owner only. - Direct
depositpulls (or wraps native), deposits viaGlobalConfig.formatDepositCall, and mints the vault-share delta. Request mode escrows the asset; cancel refunds the queued amount. Manager__depositFromQueueremoves requests before the vault call (cancel then revertsNo request) and pro-rata mints (floored dust stays as unwrapped vault shares, documented). requestRedeem/cancelRequestRedeemrevert in the latest window. Transfers cannot move shares that are queued.redeemFromQueueis manager/owner, window-gated, checkpointsrelativeSharesAllowedfrom wrapped supply × cap, burns, then redeems and disperses by redeemed shares. Native payouts usesendValue(a rejecting recipient reverts the slice).kick/forceTransfer/ manager approvals are privileged. The lib header states holders must trust the vault owner, who can appropriate value.- Throttled smart account
executeCallssnapshots gross share value, runs the owner multicall, then adds replenished cumulative relative loss. A 0lossTolerancePeriodDurationwould revert on replenish (owner config). Shutdowner zeros the owner.
Not submitted.
2026-09-03: Charm Alpha Pro Vault (0174095)
Immunefi program charm ($10,000, kyc: false).
In-scope files are the three GitHub blobs below.
Local clone /tmp/reviews/charm-vaults at 0174095.
No mainnet interaction.
Files: contracts/AlphaProVault.sol,
contracts/AlphaProVaultFactory.sol,
contracts/CloneFactory.sol.
Checked for: first-deposit share inflation; withdraw
that pulls more than the share of idle + three UniV3
positions; a non-pool mint/swap callback; rebalance
that a user can run inside the TWAP / period guards;
sweep of token0/token1; protocol+manager fee
overflow.
Result: no user-exploitable finding.
depositpokes all three ranges, sizes fromgetTotalAmounts(), pulls, then mints. First depositor locksMINIMUM_LIQUIDITY(1e3) on the factory and needsmax(amount0, amount1) > 1e3.amount0Min/amount1Minare the sandwich defense the comment describes.withdrawburns first, then idle × shares / supply plus_burnLiquidityShareon full/base/ limit. Collect takes the whole position’s owed fees; the withdrawer only receivesfees * shares / totalSupplyafter protocol and manager cuts. Leftover fees stay idle for other LPs.- Mint/swap callbacks require
msg.sender == pool. The vault never starts a swap; the swap callback is unused. rebalanceis permissionless whenrebalanceDelegate == 0, else manager/delegate, and still needscheckCanRebalance(period, min tick move, TWAP deviation, tick bounds). ManageremergencyBurnreturns tokens to the vault, not the manager.sweepcannot move token0/token1.- Factory and vault cap protocol and manager fees at
20% each (
20e4 / 1e6). Combined 40% cannot underflow1e6 - protocol - manager.
Not submitted.
2026-09-03: DeFi Saver V3 executor + FL + auth (e623f20)
Immunefi program defisaver ($350,000, kyc: false).
GitHub asset defisaver-v3-contracts/tree/main/contracts
(excluding mocks and views), added 24 Sep 2025.
Local clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction. First slice: the wallet
execution spine, not protocol-specific actions.
Files: contracts/core/RecipeExecutor.sol,
contracts/core/strategy/{StrategyExecutor,StrategyExecutorCommon,ProxyAuth,SafeModuleAuth,BotAuth,WalletAuth,SubStorage,SubProxy}.sol,
contracts/auth/{Permission,DSProxyPermission,AdminAuth}.sol,
contracts/actions/flashloan/{FLAction.sol,helpers/FLHelper.sol}.
Checked for: a bot executing a sub it does not own;
a strategy hash mismatch that still runs; FL callback
from a non-lender or a swapped recipe; leftover
execute-permission on the wallet after FL; Aave
modes / onBehalfOf that opens debt on a third
party; executeActionsFromFL callable without a
live FL.
Result: no user-exploitable finding on this slice.
executeRecipeis meant to be delegatecalled from the user’s wallet. Direct calls run actions in the RecipeExecutor’s own context (no user inventory).- Strategy path:
BotAuthowner-approved callers, storedstrategySubHashmust match, sub must be enabled.ProxyAuth/SafeModuleAuthareonlyExecutor. Triggers run before actions; one-shot strategiesdeactivateSubas the wallet (owner). Changeable triggers update via the same owner check. - FL: RecipeExecutor grants the FL action execute /
module rights, calls
executeActionon FLAction (not a delegatecall), then revokes. Callbacks require the matching lender and, where the interface has an initiator,address(this). Funds go to the encoded wallet; payback is an exact balance check (stETH 2-wei faucet exception)._executeRecipere-enters the wallet →executeActionsFromFL(skips index 0). UniV3 verifiesgetPool(token0, token1, fee). - Aave/Spark
modes/onBehalfOfare user-chosen. Debt mode still has to satisfy the payback balance check, so a third-party credit-delegate cannot be left with unpaid FL debt through a successful callback. SubProxy.subscribeToStrategy(wallet context) enables ProxyAuth / SafeModuleAuth. Sub ids are wallet-owned.
Remaining DFS: exchangeV3, protocol actions/*
(Aave/Morpho/Compound/Liquity/…), tx-saver,
triggers. Not submitted.
2026-09-03: Jito stake-deposit-interceptor (dbd8ce4)
Immunefi program jito ($250,000, KYC). In-scope tree
jito-foundation/stake-deposit-interceptor. Local clone
/tmp/jito-interceptor at dbd8ce4. No mainnet
interaction. Three published audits (Offside 2024-11,
Certora 2024-12, Certora Coinbase integration 2026-03).
Files: stake_deposit_interceptor/src/{processor,state,state/hopper,instruction,error,entrypoint}.rs.
API / cranker / CLI not reviewed (off-chain).
Checked for: init that binds the wrong pool mint or a
writable vault an attacker owns; update that a
non-authority can flip fee_wallet / whitelist program;
deposit that credits a receipt to a third party without
the staker’s authorize; claim that drains the vault past
lst_amount; permissionless post-cooldown claim to a
non-owner ATA; whitelist deposit that skips the list;
hopper rebate or WithdrawFromHopper that a user can
point at themselves.
Result: no user-exploitable finding.
- Init caps
initial_fee_bpsat 10_000, derives the authority PDA fromstake_pool + base, and forcesvaultto the ATA of that PDA. Stake-pool program and mint owners are checked. Theauthorityaccount does not sign (the pool manager later pointsstake_deposit_authorityat the PDA). - Update is current-authority signer only. Existing
receipts snapshot
cool_down_seconds/initial_fee_bpsat deposit, so a later admin raise does not reprice them. DepositStakeCPIs SPLDepositStakesigned by the interceptor PDA and recordsvault.amountdelta.owneris an instruction arg because the stake account’s withdrawer is already the PDA (same as vanilla SPL stake-pool afterAuthorize). Receipt PDA isdeposit_receipt + pool + base.- Claim: during cooldown the owner must sign; after
cooldown the path is permissionless but destination
ATA owner must equal
receipt.ownerand fee ATA owner must equalfee_wallet. Transfers usetransfer_checkedwith the authority PDA. Receipt closes toowner. Linear fee usesdiv_ceil(rounds against the depositor; 1-lamport dust case is tested). - Whitelisted deposit / withdraw require the signer
in
jito_whitelist_managementand CPI through the stored stake-pool program. Destination of minted LST is caller-chosen by design (Coinbase path). Hopper rebate ismin(fee_lamports, hopper - rent); empty hopper does not fail the withdraw. Hopper drain is authority-only.
Jito interceptor on-chain program treated as exhausted.
Restaking restaking_* / vault_* and jito-solana /
mev-programs remain. Do not submit. Payment requires
user KYC.
2026-09-03: Money on Chain V2 governance machines (d770477)
Same Immunefi program moneyonchain ($10,000, kyc: true).
Local clone /tmp/reviews/moneyonchain at d770477.
Core / queue / V4 swapper already logged. No mainnet
interaction.
Files: contracts/governance/{InterimGovernor,Governed, Stoppable,MocUpgradable}.sol,
contracts/governance/changerTemplates/{Governance, AddBucket,EditBucket,AddPeggedToken,EditPeggedToken, UpgraderUUPS}ChangerTemplate.sol.
Checked for: a permissionless execute() that changes
governor, upgrades a UUPS proxy, or grants TP minter
roles; changeGovernor callable by a non-changer;
pauser that can unpause without being pauser or
authorized; UUPS _authorizeUpgrade open.
Result: no user-exploitable finding.
- Changer
execute()is intentionally ungated. The productive calls (changeGovernor,addBucket,editBucket,addPeggedToken,editPeggedToken,upgradeTo) sit behindonlyAuthorizedChangeron the target. Areopagus (andInterimGovernor) only treat the current change contract / owner as authorized. A directexecute()from a random caller reverts on that check. InterimGovernor.executeChange/isAuthorizedChangerare owner-only. Production governor is Areopagus, not this file.Governed.changeGovernorisonlyAuthorizedChanger.Stoppable.pauseis pauser-only;unpauseis pauser or authorized changer.makeUnstoppable/setPauserare changer-only.MocUpgradable._authorizeUpgradeisonlyAuthorizedChanger.- Add-bucket / add-TP templates also
grantRole(MINTER/BURNER)on the TP; that needs admin on the token, which the changer does not have unless governance already arranged it.
V2 governance tree treated as exhausted. Remaining MoC: live Rootstock v1 proxy implementations (not this repo). Not submitted. Payouts need Immunefi KYC.
2026-09-03: DeFi Saver exchangeV3 + sell actions (e623f20)
Same Immunefi program (defisaver, $350,000, kyc: false).
Same clone /tmp/defisaver-v3 at e623f20. No mainnet
interaction. Follows the already-logged executor / FL /
auth spine.
Files: contracts/exchangeV3/DFSExchange{Core,Helper,Data,WithTxSaver}.sol,
registries/{WrapperExchangeRegistry,ExchangeAggregatorRegistry,TokenGroupRegistry}.sol,
offchainWrappersV3/{OneInch,Zerox,Paraswap,Odos,KyberAggregator,Bebop,Pendle}Wrapper.sol,
onchainWrappersV3/{Uniswap,UniV3,Kyber,Curve}WrapperV3.sol,
contracts/actions/exchange/{DFSSell,DFSSellNoFee,LSVSell,LimitSell,LimitSellL2,LimitOrderSubProxy}.sol.
Checked for: an unregistered wrapper or aggregator
call; off-chain takeOrder that keeps src and still
returns false so _executeSwap double-spends; dest
amount taken from a lying wrapper return; minPrice
checked against pre-fee src; recipe fee divider of 1;
Pendle calldata that spends more than the post-fee
src; LimitSell gas fee above the fill; TxSaver
injection of an unregistered wrapper.
Result: no user-exploitable finding.
- Off-chain path requires both
ExchangeAggregatorRegistryandWrapperExchangeRegistry. On-chainsellrequires the wrapper registry. Owner-only add/remove. takeOrderon the 1inch-style wrappers alwayssendLeftoversrc+dest+ETH tomsg.sender(the wallet) before returning. A failed aggregator call refunds src, then the on-chain fallback spends the wallet’s refunded balance — not a second pull of already-consumed tokens. Zero dest on success revertsZeroTokensSwapped._sellrecords dest by wallet balance delta, not the wrapper return. Slippage iswmul(minPrice, srcAmount)after the DFS fee is subtracted (user-favorable vs the pre-fee amount).minPriceis caller-chosen except LimitSell, which requires it equal the triggerCURR_PRICE.- Recipe
DFSSellreplaces anydfsFeeDividerother than 400 withTokenGroupRegistry.getFeeForTokens(standard 400, same-group 1000, banned src 0). Direct sells andDFSSellNoFeetake no DFS fee.getFeeis skipped whenDiscount.serviceFeesDisabled. - Pendle does not patch calldata with the post-fee
amount (documented: use
DFSSellNoFee). A mismatch fails the call or refunds leftover; it does not spend more than the transferred src. - LimitSell gas fee is capped at 20% of dest. TxSaver injects wrapper/off-chain data from transient storage set by the already-reviewed executor; injected addresses still hit the registries.
exchangeV3 + sell actions treated as exhausted.
Remaining DFS: protocol actions/* (Aave / Morpho /
Liquity / CurveUsd swappers / …) and tx-saver
beyond the gas-cost hook already read here. Not
submitted.
2026-09-03: DeFi Saver Morpho Blue actions (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/morpho-blue/{MorphoBlueBorrow, MorphoBlueSupply,MorphoBlueWithdraw,MorphoBluePayback, MorphoBlueSupplyCollateral,MorphoBlueWithdrawCollateral, MorphoBlueSetAuth,MorphoBlueSetAuthWithSig, MorphoBlueReallocateLiquidity,MorphoBlueClaim, MorphoTokenWrap}.sol,
helpers/MorphoBlueHelper.sol.
Checked for: borrow/withdraw onBehalf of a third
party without Morpho authorization; SetAuth that a
bot can flip on a wallet the user did not sign;
claim that pulls another account’s merkle rewards;
reallocate that drains a user’s Morpho position.
Result: no user-exploitable finding.
- Actions run via wallet delegatecall, so Morpho
sees
msg.senderas the wallet.onBehalf == 0defaults to the wallet. Borrow / withdraw / withdrawCollateral against anotheronBehalfrequire MorphoisAuthorized. Tokens go to the recipe’sto. SetAuthcallssetAuthorizationas the wallet (user-signed recipe or official strategy).SetAuthWithSigonly relays a valid Morpho authorization signature.Paybackaccrues, caps at current debt, and repays shares on max so leftover loan tokens are not over-pulled past debt (pull is the capped amount).ReallocateLiquidityis a thinPublicAllocator.reallocateToloop. That path is permissionless on Morpho vaults; it does not touch the wallet’s position.Claimclaimsaddress(this)thenwithdrawTokenstoto. Wrap deposits legacy MORPHO into the hardcoded wrapper forto.
Remaining DFS protocol actions: Aave / Liquity / CurveUsd / Fluid / Euler / … Not submitted.
2026-09-03: DeFi Saver Liquity V2 trove + SP (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/liquityV2/trove/{LiquityV2Open, LiquityV2Borrow,LiquityV2Withdraw,LiquityV2Close, LiquityV2Adjust,LiquityV2AdjustZombieTrove, LiquityV2Payback,LiquityV2Supply,LiquityV2Claim}.sol,
stabilityPool/{LiquityV2SPDeposit,LiquityV2SPWithdraw, LiquityV2SPClaimColl}.sol,
helpers/LiquityV2Helper.sol.
Checked for: open/borrow on a trove the wallet does
not own; close that sends more coll than the trove
returned; payback past MIN_DEBT that bricks the
trove; SP withdraw of another depositor; WETH max
open that spends the gas-compensation lock as coll.
Result: no user-exploitable finding.
- Open always sets Liquity
ownertoaddress(this)(the wallet).troveId = keccak256(wallet, ownerIndex). 0.0375 WETH gas lock is pulled in addition to coll; WETH-max open subtracts that lock beforeopenTrove. BOLD minted is sent toto. - Borrow / withdraw / adjust / close / addColl call
BorrowerOperationsas the wallet. Liquity requires the caller to be owner or manager. A third-partytroveIdreverts. - Close pulls
entireDebtBOLD, then sendsentireColl(+ gas lock if WETH market) toto. Payback / adjust-payback cap atentireDebt - MIN_DEBT. - SP deposit/withdraw/claim use
address(this)as the depositor. Gains are snapshotted, then claimed in the same call, then sent to the recipe recipients.
Remaining DFS protocol actions: Aave / CurveUsd / Fluid / Euler / Liquity V1. Not submitted.
2026-09-03: DeFi Saver Fluid T1 + liquidity logic (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/fluid/vaultT1/{FluidVaultT1Open, FluidVaultT1Borrow,FluidVaultT1Withdraw}.sol,
logic/liquidity/{FluidSupply,FluidBorrow,FluidWithdraw, FluidPayback}LiquidityLogic.sol,
helpers/FluidVaultTypes.sol.
Checked for: operate on an NFT the wallet does not own; ETH wrap that deposits the wrong amount; max payback that keeps leftover borrow tokens; T1 helpers that accept a T2/T3 vault type.
Result: no user-exploitable finding.
- T1 actions hardcode
T1_VAULT_TYPE. Liquidity librariesrequireLiquidityCollateral/requireLiquidityDebt.operateis called as the wallet; Fluid requires the NFT owner. Open usesnftId == 0so the vault mints to the wallet. - ETH coll is unwrapped WETH then sent as
msg.value. Borrow/withdraw can wrap ETH to WETH on the wallet thenwithdrawTokenstoto. Wrap amount is the requested borrow or the vault-returned withdraw. - Max payback pulls
borrow * 10001/10000 + 5, usestype(int256).min, refunds dust tofrom, and clears leftover approval.signed256reverts aboveint256.max.
Remaining Fluid: Dex T2/T3/T4 operate paths. Aave V3 / Comp / Spark / Liquity V1 follow. Not submitted.
2026-09-03: DeFi Saver Aave V3 money actions (e623f20)
Same Immunefi program (defisaver, $350,000, no KYC).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction. Exchange/sell already logged;
this slice is Aave V3 supply / withdraw / borrow /
payback.
Files: contracts/actions/aaveV3/{AaveV3Supply,AaveV3Withdraw,AaveV3Borrow,AaveV3Payback}.sol.
Checked for: a fake AddressProvider that drains an
approved pull; withdraw/borrow of another wallet’s
position; onBehalf without Aave credit delegation.
Result: no user-exploitable finding.
- Token is
getReserveAddressByIdon the pool returned by the caller-chosen market (oruseDefaultMarket). Supply/payback pull fromfrom(needs allowance if not the wallet). - Borrow/withdraw move the wallet’s own position.
onBehalfneeds Aave credit delegation. - A fake AddressProvider would need the wallet
owner or a
BotAuthbot to pass it in. Bots are owner-approved (already logged).
2026-09-03: DeFi Saver Comp V2/V3 + Spark + Liquity V1 (e623f20)
Same program and clone. Liquity V2 trove/SP already logged; this slice adds Comp, Spark, and Liquity V1, plus a V2 fake-registry note.
Files: contracts/actions/compoundV3/{CompV3Supply,CompV3Withdraw,CompV3Borrow,CompV3Payback,CompV3Transfer,CompV3Allow,CompV3Claim}.sol,
contracts/actions/compound/{CompSupply,CompWithdraw,CompBorrow,CompPayback}.sol,
contracts/actions/spark/{SparkSupply,SparkWithdraw,SparkBorrow,SparkPayback,SparkSpTokenPayback,SparkDelegateCredit}.sol,
contracts/actions/spark/helpers/SparkHelper.sol,
contracts/actions/liquity/trove/{LiquityOpen,LiquityClose}.sol,
contracts/actions/liquity/stabilityPool/LiquitySPWithdraw.sol,
contracts/utils/token/TokenUtils.sol.
Checked for: CompV3 withdraw/borrow/transfer of
another account without allow; a fake Comet /
Spark AddressProvider that makes withdrawTokens
send the wallet’s existing balance; Spark delegate
that a stranger can set; Liquity V1 close that
over-pulls LUSD.
Result: no user-exploitable finding.
- CompV3
onBehalf == 0defaults to the wallet.withdrawFrom/transferAssetFromagainst another account need Cometallow.CompV3Allowcallsallowas the wallet. Claim uses hardcodedCOMET_REWARDS_ADDRand a receiver balance delta. A fake Comet cannot move a real position. - Comp V2
getUnderlyingAddriscToken.underlying()(cETH hardcoded). Withdraw uses a wallet balance delta. Borrow / supply to a fake cToken that returnsNO_ERRORthenwithdrawTokensof the requested amount would drain existing wallet tokens of that underlying — owner-or-bot fake-target, same as Aavemarket. Payback caps atborrowBalanceCurrent. - Spark resolves the pool via
ISparkPoolAddressesProvider(_market).getPool()unlessuseDefaultMarket. Withdraw sends from the pool toto. Borrow thenwithdrawTokens(_to, amount)is the same fake-pool drain if the owner/bot passes a hostile AddressProvider. Delegate credit isapproveDelegationas the wallet. - Liquity V2 (already logged): money actions take
IAddressesRegistry(market)as given.getDebtInFrontwhitelists WETH/wstETH/rETH, but open/adjust/close/SP do not. A fake registry that reports a hugeentireColl/ SP gain would makewithdrawTokenssend the wallet’s existing coll/BOLD; owner/bot only. - Liquity V1 addresses are hardcoded in
LiquityHelper. Close reads the wallet’s own trove debt/coll, pulls that LUSD, then wraps and sends coll toto. SP withdraw caps at the wallet’s compounded deposit.
Remaining DFS: curveusd, Fluid Dex T2/T3/T4,
eulerV2, aaveV4 / leftover Aave, llamalend,
mcd, tx-saver, triggers. Not submitted.
2026-09-03: DeFi Saver CurveUsd core money actions (e623f20)
Same Immunefi program (defisaver, $350,000, no KYC).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/curveusd/{CurveUsdCreate,CurveUsdBorrow,CurveUsdWithdraw,CurveUsdSupply,CurveUsdAdjust,CurveUsdPayback,CurveUsdSelfLiquidate}.sol,
helpers/CurveUsdHelper.sol,
advanced/CurveUsdSwapper.sol (callback gate only).
Checked for: a fake controller that
withdrawTokens of minted crvUSD from the wallet;
borrow/withdraw of another user’s llamma
position; payback onBehalfOf that closes and
sends someone else’s coll to to; self-liquidate
that pulls more crvUSD than needed and keeps it;
swapper callback from a non-controller.
Result: no user-exploitable finding.
- Every money action checks
isControllerValid: factorydebt_ceiling!= 0. A random AddressProvider-style fake cannot pass. Positions are the wallet’screate_loan/borrow_more/remove_collateralon that controller. - Create / adjust / borrow then
withdrawTokensof the requested crvUSD amount. If the controller minted less, the transfer reverts. Supply can creditonBehalfOf(donation). Payback caps atdebt(onBehalfOf)and, on close, sends only the wallet’s balance deltas. - Self-liquidate is
liquidate(address(this)). Extra crvUSD pull isdebt - collInCrvUsd + 1000wei and leftover is returned tofrom. Outgoing amounts are post-liq deltas. - Swapper callbacks require
msg.senderto be a valid controller.setAdditionalRoutesis permissionless storage, but the action writes it in the same tx before the callback and_curveSwapdeletes it.withdrawAlllets anyone sweep leftover swapper balances (no user position).
Remaining CurveUsd: lev-create / repay /
self-liquidate-with-coll + transient variants.
Remaining DFS: those, Fluid Dex T2–T4,
eulerV2, aaveV4 / leftover Aave,
llamalend, mcd, tx-saver, triggers.
Not submitted.
2026-09-03: Jito restaking vault money path + NCN tickets (db90840)
Immunefi program jito ($250,000, KYC). In-scope trees
jito-foundation/restaking/{vault_core,vault_program, restaking_core,restaking_program}. Sparse clone
/tmp/jito-restaking at db90840. No mainnet
interaction. Interceptor already logged (dbd8ce4).
The restaking audit-competition page states slashing
was not enabled at launch; this tree has no slash
instruction (only DelegationState::slash math).
Files: vault_program/src/{mint_to,enqueue_withdrawal, burn_withdrawal_ticket,change_withdrawal_ticket_owner, update_vault_balance,initialize_vault_update_state_tracker, crank_vault_update_state_tracker,close_update_state_tracker, add_delegation,cooldown_delegation,initialize_vault, initialize_vault_with_mint,set_fees,delegate_token_account}.rs,
vault_core/src/{vault,vault_staker_withdrawal_ticket, delegation_state}.rs,
restaking_program/src/{initialize_ncn_vault_ticket, warmup_ncn_vault_ticket,initialize_ncn_vault_slasher_ticket, ncn_delegate_token_account,operator_delegate_token_account}.rs.
Checked for: empty-vault share inflation or a
donate-then-update brick; mint that credits VRT
without transferring ST; enqueue that locks another
staker’s VRT; permissionless burn that pays a
non-owner; reserved-VRT accounting that under-reserves
ST so a later depositor funds an earlier withdrawal;
update_vault_balance that mints unbounded fee VRT;
crank that force-cools another operator’s stake for
an attacker; ticket owner change without the old
owner; restaking ticket warmup that a non-admin can
flip; a user slash path.
Result: no user-exploitable finding.
InitializeVaultrequires `initialize_token_amount0
, temporarily zeros the deposit fee, mints 1:1 VRT to a burn-vault ATA, then restores the fee.vrt_supplyis never zero on a live vault, so the donate-then-update_vault_balancebrick (tokens>0, vrt=0, later mints return 0) is not reachable.InitializeVaultWithMint` is a no-op stub.mint_torequires the depositor signer, classic SPL token only, rejects depositor==vault and depositor ATA==vault ATA,mint_with_fee+min_amount_out, andvrt_to_depositor == 0. Deposit fee isdiv_ceilagainst the depositor.- Enqueue: staker+base sign; ticket PDA
(program, vault, base); VRT moves to the ticket ATA;increment_vrt_enqueued_for_cooldown_amount. Burn is permissionless aftercurrent_epoch > unstake_epoch+1butcheck_stakerpins payout to the ticket’s staker ATA. Extra VRT sent to the ticket after enqueue is swept to the program fee wallet. Owner change needs the old staker. - Reserved ST is
calculate_burn_summaryon the sum of enqueued + cooling + ready VRT. Individual ticket burns apply fees per ticket (div_ceil), so they take slightly more fee / less ST than the aggregate reserve. Conservative, not an extract.delegatesubtracts that reserve plus already-delegated security fromtokens_deposited. update_vault_balancetreats ATA growth as rewards, takesreward_fee_bpsin ST, mints the matching VRT to the fee wallet, then stores the full ATA astokens_deposited.check_reward_fee_effective_rateaborts a zero fee mint whenreward_fee_bps > 0.- Epoch crank: only
Greedyallocation; force cooldown is capped at that operator’s staked amount andadditional_assets_need_unstaking. Close of the current epoch requires every operator updated andadditional_assets_need_unstaking == 0, then copies tracker delegation and shifts VRT buckets at most two epochs. Old-epoch close is rent-only. - Restaking tickets are NCN/operator-admin PDAs.
Warmup/cooldown need the matching admin. Delegate
token is admin
approve(u64::MAX)of an NCN- or operator-owned ATA (not the vault ST). Slasher tickets storemax_slashable_per_epochbut no instruction spends them. Vaultdelegate_token_accountrefuses the supported mint.
Jito restaking vault_* / restaking_* treated as
exhausted at db90840. jito-solana and
mev-programs remain. Not submitted. Payouts need
Immunefi KYC.
2026-09-03: DeFi Saver CurveUsd advanced + transient (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/defisaver-v3 at e623f20. Core
CurveUsd money actions already logged; this slice is
the leftover extended/transient path.
Files: contracts/actions/curveusd/advanced/{CurveUsdRepay, CurveUsdLevCreate,CurveUsdSelfLiquidateWithColl}.sol,
advanced/transient/{CurveUsdRepayTransient, CurveUsdLevCreateTransient,CurveUsdSelfLiquidateWithCollTransient, CurveUsdSwapperTransient}.sol.
Checked for: lev-create that borrows for a third
party; repay_extended callback that a non-controller
can fire with leftover routes; transient
ExchangeData that another recipe can overwrite
in the same tx; leftover funds left on the swapper.
Result: no user-exploitable finding.
- Advanced actions write routes via
_setupCurvePaththen callrepay_extended/create_loan_extended/liquidate_extendedas the wallet. After the callback theywithdrawAllon the swapper and_sendLeftoverFundstoto. Liquidate target isaddress(this). - Transient actions write
exDatatoBYTES_TRANSIENT_STORAGEin the same tx, then pass the registry swapper. The swapper decodes that blob and requires a valid controllermsg.sender. Leftovers use a starting-balance snapshot so only the delta is sent toto.srcAmount == 0reverts.
CurveUsd treated as exhausted. Remaining DFS:
Fluid Dex T2–T4, eulerV2, aaveV4 / leftover
Aave, llamalend, mcd, tx-saver, triggers.
Not submitted.
Note on the non-transient leftover (same files):
LevCreate / Repay / SelfLiquidateWithColl
do not call isControllerValid (transient
paths do). After repay_extended /
liquidate_extended they
_sendLeftoverFunds, which
withdrawTokens(..., type(uint256).max) of
crvUSD and collateral_token(). A fake
controller whose collateral_token() is WETH
would sweep the wallet’s WETH + crvUSD to
to — owner-or-bot, same fake-target pattern
already logged. Transient leftovers use a
starting-balance snapshot.
2026-09-03: DeFi Saver Euler V2 actions (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/defisaver-v3 at e623f20. No mainnet
interaction.
Files: contracts/actions/eulerV2/{EulerV2Supply, EulerV2Withdraw,EulerV2Borrow,EulerV2Payback, EulerV2PaybackWithShares,EulerV2PullDebt, EulerV2CollateralSwitch,EulerV2ReorderCollaterals}.sol,
helpers/{EulerV2Helper,MainnetEulerV2Addresses}.sol.
Checked for: borrow/withdraw of an account the
wallet does not own; enableController on a
stranger; pullDebt that loads a victim with
debt; repayWithShares that burns another
account’s eTokens; a fake vault that
withdrawTokens of a requested amount.
Result: no user-exploitable finding.
- EVC is hardcoded
0x0C9a3dd6b8F28529d72d7f9cE918D493519EE383. Borrow / withdraw / repayWithShares / disableController go throughIEVC.call(vault, account, …). EVC only accepts the account owner or an operator.account == 0defaults to the wallet. Sub-accounts share the wallet’s 19-byte prefix. - Supply deposits to
account(donation if it is not the wallet) after a pull/approve. Payback caps atdebtOf(account)and, on a full repay, disables the controller via EVC. pullDebttakesfrom’s debt ontoaccount(the wallet / its sub-account). That is debt-relief forfrom, not an extract.repayWithSharesburns shares offromvia EVC (frommust be wallet-owned).- A hostile
vaultaddress is owner-or-bot fake-target (same class as Comp cToken / Spark AddressProvider). It cannot pass EVC as a real Euler account.
2026-09-03: DeFi Saver LlamaLend core money actions (e623f20)
Same program and clone. LlamaLend is the crvUSD-style controller fork; CurveUsd already logged.
Files: contracts/actions/llamalend/{LlamaLendCreate, LlamaLendBorrow,LlamaLendWithdraw,LlamaLendPayback}.sol,
helpers/LlamaLendHelper.sol.
Checked for: a fake controller that
withdrawTokens of minted debt from the wallet;
borrow/withdraw of another user’s llamma
position; payback onBehalfOf that closes and
sends someone else’s coll to to.
Result: no user-exploitable finding.
- Create / borrow / withdraw do not call
isControllerValid(unlike CurveUsd).isControllerValidexists (factory.controllers(id) == addr) but is unused here. A hostile controller pluswithdrawTokensof the requested amount would drain the wallet’s existing debt/coll tokens — owner-or-bot fake-target, same class already logged for Comp / Spark. Positions on a real controller are the wallet’s (create_loan/borrow_more/remove_collateral). - Payback caps at
debt(onBehalfOf)and on close sends only wallet balance deltas.onBehalfOfrepay is a donation.
Remaining LlamaLend: supply / self-liquidate /
advanced swapper paths. Remaining DFS: those,
aaveV4 / leftover Aave, mcd, tx-saver,
triggers. Not submitted.
2026-09-03: DeFi Saver Fluid Dex T2/T3/T4 (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/fluid/dex/{FluidDexOpen, FluidDexBorrow,FluidDexSupply,FluidDexWithdraw, FluidDexPayback}.sol,
logic/dex/{FluidSupply,FluidBorrow,FluidWithdraw, FluidPayback}DexLogic.sol,
helpers/{FluidDexTokensUtils,FluidDexModel, FluidVaultTypes}.sol.
Checked for: operate on an NFT the wallet does not own; Open that leaves a minted NFT if borrow fails; wrap that deposits the wrong ETH amount; max payback that keeps leftover debt tokens; T2/T3/T4 helpers that accept the wrong vault type.
Result: no user-exploitable finding.
operate/operatePerfectrun as the wallet. Fluid requires the NFT owner. Open is two-step in one tx: supply withnftId == 0(vault mints to the wallet) then borrow. A failed borrow reverts the mint.- T3 supply/withdraw use liquidity libraries
(
requireLiquidityCollateral). T2/T4 supply and T3/T4 borrow use DEX libraries (requireSmartCollateral/requireSmartDebt). Actions callrequireDexVaultfirst. shouldSendTokensAsWrappedonly wraps whenwrapEthis set and that side is native. If wrap is false,sendTokensis a no-op (vault already sent toto). Max withdraw wraps the vault-returned amount. Max payback pullsmaxAmountToPull, usestype(int256).min, refunds dust as WETH if native, and clears leftover approval.signed256reverts aboveint256.max.
Remaining DFS: LlamaLend leftover, aaveV4 /
leftover Aave, mcd, tx-saver, triggers.
Not submitted.
2026-09-03: DeFi Saver Aave V3 + GHO/Umbrella (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/aaveV3/{AaveV3Supply, AaveV3Borrow,AaveV3Withdraw,AaveV3Payback, AaveV3ATokenPayback,AaveV3ClaimRewards, AaveV3CollateralSwitch,AaveV3SetEMode, AaveV3DelegateCredit,AaveV3DelegateWithSig, GhoStake,GhoUnstake}.sol,
umbrella/{UmbrellaStake,UmbrellaUnstake, UmbrellaClaimRewards}.sol,
helpers/AaveV3Helper.sol.
Checked for: borrow/withdraw onBehalf of a third
party without Aave credit delegation; payback that
over-pulls past debt; aToken repay of someone else’s
debt from pulled tokens; claim that drains another
account’s rewards; Umbrella stake without slippage
or unwrap to the wrong asset.
Result: no user-exploitable finding.
- Actions run via wallet delegatecall, so Aave sees
msg.senderas the wallet.onBehalf == 0defaults to the wallet. Borrow against anotheronBehalfneeds AaveapproveDelegation. Supply / payback on behalf are Aave’s intended donate / repay paths. Withdraw always burns the wallet’s aTokens. - Payback and aToken payback cap at
getWholeDebt. aToken repay usesrepayWithATokensforaddress(this)after pulling aTokens fromfrom. DelegateCreditcallsapproveDelegationas the wallet.DelegateWithSigonly relays a valid Aave debt-token signature.- Claim rewards / Umbrella claim are
msg.sender= wallet. GHO stake/unstake and Umbrella stake/unstake pull fromfromor burn the wallet’s shares, then send toto. Umbrella stake/unstake enforceminSharesOut/minAmountOut. Amount0only starts cooldown.
Aave V3 supply/borrow/withdraw/payback were already
logged in a narrower slice; this pass adds aToken
payback, delegation, GHO, and Umbrella. Remaining
DFS: LlamaLend leftover, aaveV4, mcd,
tx-saver, triggers. Not submitted.
Note on Dex wrap-path leftovers (same files):
a fake vault that does not pay would make
wrap-path withdrawTokens of the requested
amount drain existing wallet tokens of that
asset — owner-or-bot, same class already
logged.
2026-09-03: DeFi Saver LlamaLend leftover + swapper (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction. Core create/borrow/withdraw/
payback already logged.
Files: contracts/actions/llamalend/{LlamaLendSupply, LlamaLendSelfLiquidate,LlamaLendGetDebt}.sol,
advanced/{LlamaLendLevCreate,LlamaLendBoost, LlamaLendRepay,LlamaLendSelfLiquidateWithColl, LlamaLendSwapper}.sol.
Checked for: self-liquidate of another user’s position; swapper callback from a fake controller; lev-create that spends wallet coll without a valid factory id; leftover sweep that sends more than the action’s delta.
Result: no user-exploitable finding.
- Supply
onBehalfOfis a donateadd_collateral. Self-liquidate callsliquidate(address(this)), pulls a 1000-wei buffer only if coll-in-debt < debt, refunds unused debt token tofrom, and sends the coll delta toto. Same un-gated controller +withdrawTokensfake-target class as the core slice. - Lev-create / boost / repay / self-liquidate-with-
coll require
factory.controllers(id) == addr. Swapper callbacks revert unlessmsg.senderis that controller. TransientexDatais written in the same tx. Leftovers use a starting-balance snapshot.withdrawAllreturns leftover swapper balances tomsg.sender(the wallet). GetDebtis a view.
LlamaLend treated as exhausted. Remaining DFS:
aaveV4 / leftover Aave, mcd, tx-saver,
triggers. Not submitted.
2026-09-03: DeFi Saver Aave V4 sig + premium (e623f20)
Same program and clone. No mainnet interaction.
Files: contracts/actions/aaveV4/{AaveV4DelegateBorrowWithSig, AaveV4DelegateWithdrawWithSig, AaveV4DelegateSetUsingAsCollateralWithSig, AaveV4SetUserManagersWithSig,AaveV4RefreshPremium}.sol.
Checked for: a recipe that sets a stranger’s managers or borrow/withdraw permits without their signature; premium refresh that mutates another account without Aave approval.
Result: no user-exploitable finding.
- Delegate / set-managers actions only relay EIP-712 signatures to hardcoded Taker / Config position managers or a caller-chosen Spoke. Aave verifies the signer.
RefreshPremiumdefaultsonBehalfto the wallet. On anotheronBehalfit goes throughConfigPositionManager*OnBehalfOf, which Aave gates (wallet must already be an approved manager). No tokens move.
Aave V4 listed wrappers treated as exhausted.
Remaining DFS: mcd, tx-saver, triggers.
Not submitted.
2026-09-03: DeFi Saver Maker MCD actions (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/mcd/{McdOpen,McdSupply,McdWithdraw, McdGenerate,McdPayback,McdGive,McdMerge,McdClaim, McdDsrDeposit,McdDsrWithdraw,McdTokenConverter, McdBoostComposite,McdRepayComposite,McdRatio}.sol,
helpers/{McdHelper,McdRatioHelper}.sol.
Checked for: generate/withdraw of a CDP the wallet does not own; Give that a bot can fire on a stranger’s vault; Cropper claim that steals another owner’s bonus; DSR withdraw of another pot pie; composite leftover DAI sent to the wrong address.
Result: no user-exploitable finding.
McdOpenmints the CDP toaddress(this). Managerfrob/give/shift/move/fluxrequire the wallet to own the vault. Cropper paths resolveowns(vaultId)andfrobas that owner; Cropper only accepts the owner’s authorized proxy.- Payback caps at
getAllDebt. Give reverts on0x0. Claim crops with amount 0 and sends only the wallet’s bonus delta. - DSR
join/exitusepot.pie(address(this))on max. Converter only routes DAI/USDS/MKR through hardcoded Sky converters. - Boost/repay composites hardcode
MCD_MANAGER_ADDR, sell via already-loggedDFSSell, and send leftover DAI to the wallet owner. Strategy ratio checks revert if the ratio moves the wrong way. - A caller-chosen
joinAddrpluswithdrawTokensof a requested amount is the same owner-or-bot fake-target class already logged for Comp / Spark / LlamaLend.
Maker MCD treated as exhausted. Remaining DFS:
tx-saver, triggers. Not submitted.
2026-09-03: DeFi Saver TxSaver leftover (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction. RecipeExecutor / BotAuth
already logged; this slice is the TxSaver entry
plus gas-cost helper.
Files: contracts/tx-saver/{TxSaverExecutor, BotAuthForTxSaver,TxSaverBytesTransientStorage, TxSaverGasCostCalc}.sol.
Checked for: a stranger calling executeTx
without a Safe signature; injected exchange
data that runs without the user’s signed
recipe; gas-cost helper that over-charges
past block gas.
Result: no user-exploitable finding.
executeTxrequiresBotAuthForTxSaver.isApproved(msg.sender)(owner-gated add/remove). It thenSafe.execTransactionto RecipeExecutor as DelegateCall with the user’s packed signatures. Safe verifies the signers. Deadline is checked when non-zero.- Transient storage is written only by TxSaverExecutor in the same tx. Anyone can read it; only that tx’s sell/fee hook consumes it.
- Gas cost caps
_gasUsedatblock.gaslimitand converts via an injected ETH price (reverts if zero). Fee-from-position vs EOA is the user’s signed flag.
TxSaver treated as exhausted. Remaining DFS: triggers. Not submitted.
2026-09-03: DeFi Saver Aave V4 money actions (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/defisaver-v3 at e623f20. No mainnet
interaction. Signature-relay / premium already logged;
this is contracts/actions/aavev4/ supply, borrow,
withdraw, payback, and collateral-switch.
Files: contracts/actions/aavev4/{AaveV4Supply, AaveV4Borrow,AaveV4Withdraw,AaveV4Payback, AaveV4CollateralSwitch,AaveV4StoreRatio}.sol,
helpers/{AaveV4Helper,MainnetAaveV4Addresses}.sol.
Checked for: borrow/withdraw of a third-party
position without Aave manager approval; payback
that over-pulls past debt; fake Spoke whose
getReserve returns a real token so the trailing
withdrawTokens drains the wallet.
Result: no user-exploitable finding.
- Giver / Taker / Config position managers are
hardcoded.
onBehalf == 0defaults to the wallet. Other-account supply/repay go throughGiverPositionManager; borrow/withdraw/ collateral-switch go through Taker / Config. Aave must already have enabled that manager and approved this wallet. - Payback caps at
getUserTotalDebt. Supply and payback pull fromfrom(allowance). - After borrow/withdraw the action sends
spoke.getReserve(id).underlyingof the returned amount toto. A fake Spoke plus thatwithdrawTokensis the same owner-or-bot fake-target class already logged.StoreRatiois a view helper.
Aave V4 money actions treated as exhausted. Remaining DFS: triggers. Not submitted.
2026-09-03: DeFi Saver triggers (e623f20)
Same program and clone. No mainnet interaction. StrategyExecutor / BotAuth already logged.
Files: contracts/triggers/{OffchainPriceTrigger, TokenBalanceTrigger,TrailingStopTrigger, ChainLinkPriceTrigger,TimestampTrigger, GasPriceTrigger,ClosePriceTrigger, AaveV3RatioTrigger,AaveV2RatioTrigger, AaveV4RatioTrigger,CompV3RatioTrigger, CompoundRatioTrigger,SparkRatioTrigger, MorphoBlueRatioTrigger,MorphoBluePriceTrigger, FluidRatioTrigger,LiquityRatioTrigger, LiquityV2RatioTrigger,McdRatioTrigger, CurveUsdCollRatioTrigger, CurveUsdHealthRatioTrigger, CurveUsdSoftLiquidationTrigger, CurveUsdBorrowRateTrigger}.sol plus the
quote-price / debt-in-front / adjust-rate
variants and helpers/TriggerHelper.sol.
Checked for: a stranger firing a strategy without the subscribed condition; Offchain price that a non-bot can set; LimitSell that accepts a 1-wei attested price and dumps the position; TokenBalance that reads a spoofable token.
Result: no user-exploitable finding.
executeStrategyis BotAuth-gated and theStrategySubhash must match storage. TriggercallDatais bot-supplied;subDatais the user’s stored hash.- Ratio / Chainlink / Morpho / Fluid /
Liquity / MCD / CurveUsd / Spark /
Comp / Aave quote-price triggers read
on-chain oracles or protocol views.
currRatio == 0or a missing price returns false (no fire). OffchainPriceTriggertakescurrentPricefrom bot calldata, writesCURR_PRICE, and LimitSell requiresminPrice == CURR_PRICEbefore_sell. A tiny attested price would weaken slippage to nearly zero. Only approved bots can pass that calldata — same owner-or-bot class already logged for LimitSell in the exchangeV3 slice.TrailingStopTriggertakes a ChainlinkmaxRoundIdfrom the bot but prices come fromgetRoundInfo; the round must be afterstartRoundId.- Token balance / timestamp / gas-price triggers are views on the subscribed addresses and thresholds.
DeFi Saver V3 treated as exhausted. Not submitted.
2026-09-03: DeFi Saver leftover Aave V2 (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction. Aave V3 / V4 already
logged; this is contracts/actions/aave/.
Files: contracts/actions/aave/{AaveSupply, AaveBorrow,AaveWithdraw,AavePayback, AaveCollateralSwitch,AaveClaimAAVE, AaveClaimStkAave,AaveUnstake}.sol,
helpers/{AaveHelper,MainnetAaveAddresses}.sol.
AaveSubProxy only registers boost/repay
bundles against hardcoded Aave V2 market
0xB53C…c5.
Checked for: borrow through a fake
AddressesProvider that then
withdrawTokens a caller-chosen amount;
payback leftover that sweeps more than the
unused pull; claim of another account’s
stkAave rewards.
Result: no user-exploitable finding.
marketis an unvalidated AddressesProvider. Borrow thenwithdrawTokens(tokenAddr, amount)— owner-or-bot fake-target, same class as Comp / Spark. Withdraw sends via the pool toto(max uses ato-balance delta). The 1–2 wei faucet top-up is hardcodedDYDX_FL_FEE_FAUCET.- Payback caps at
getWholeDebt. After repay itwithdrawTokens(_from, tokensAfter)— the entire remaining wallet balance of that token, not only unused pull. Recipe leftover footgun tofrom, not a third-party extract. - Claims / unstake hit hardcoded stkAave
0x4da2…0f5.amount == 0on unstake only starts cooldown.
2026-09-03: DeFi Saver EtherFi + Lido + leftover utils (e623f20)
Same program and clone.
Files: contracts/actions/etherfi/{EtherFiStake, EtherFiStakeFromLido,EtherFiWrap,EtherFiUnwrap}.sol,
lido/{LidoStake,LidoWrap,LidoUnwrap}.sol,
utils/{ExecuteCall,SendToken,SendTokens, PullToken,TransferNFT,ChangeProxyOwner, HandleAuth,PermitToken,TokenizedVaultAdapter, KingClaim,SDaiWrap,SDaiUnwrap}.sol.
Checked for: stake that sends more eETH /
stETH than the deposit minted; Lido ETH
call that a fake recipient can keep;
ERC4626 vault that withdrawTokens of a
requested amount; ExecuteCall that a
strategy bot can aim at an arbitrary
target; KingClaim of another wallet’s
merkle allocation.
Result: no user-exploitable finding.
- EtherFi / Lido addresses are hardcoded
(eETH
0x35fA…ac2, weETH0xCd5f…b7ee, liquidity pool, deposit adapter, stETH / wstETH). Stake / wrap send only the received-balance delta. Lido stake/wrap require the ETH call to succeed.StakeFromLidoapproves the adapter and passes an empty permit (deadline = max);minAmountOutis user-set. TokenizedVaultAdaptertakes a caller-chosen ERC4626. Deposit/mint pullvault.asset(). A fake vault can keep the pull — owner-or-bot. Redeem/withdraw use the vault’sfromallowance. Slippage (minOutOrMaxIn) is checked. Sky staked USDS uses a hardcoded vault + referral on mainnet.ExecuteCall/SendToken*/ChangeProxyOwnerare owner-or-bot recipe primitives.PermitTokenrelays an exact EIP-2612 signature and requires the nonce to increment.KingClaimclaims foraddress(this)on hardcoded0x6Db2…B64and sends the KING delta.SDaiWrapdeposits to hardcoded sDAI.
Remaining DFS folders without a dedicated
pass: renzo, sky, pendle, yearn,
summerfi, uniswap, insta, lsv,
merkel, fee, checkers, leftover
utils (CreateSub / UpdateSub /
ToggleSub / wrap-ETH). Not submitted.
2026-09-03: DeFi Saver Renzo / Sky / Pendle / Yearn / Uni (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/renzo/RenzoStake.sol,
sky/{SkyStake,SkyUnstake,SkyClaimRewards, SkyStakingEngineOpen,SkyStakingEngineStake, SkyStakingEngineUnstake,SkyStakingEngineClaimRewards, SkyStakingEngineSelectFarm}.sol,
pendle/PendleTokenRedeem.sol,
yearn/{YearnSupply,YearnWithdraw}.sol,
uniswap/{UniswapClaim,v2/UniSupply,v2/UniWithdraw, v3/UniMintV3,v3/UniSupplyV3,v3/UniWithdrawV3, v3/UniCollectV3,v3/UniCreatePoolV3}.sol.
Checked for: Yearn withdraw of a fake yVault
that withdrawTokens a requested underlying
amount; Sky unstake that sends wallet tokens
after a no-op withdraw; Pendle redeem that
transfers PT to a hostile YT; Uni V3
decrease/collect of an NFT the wallet does
not own.
Result: no user-exploitable finding.
- Renzo stake is hardcoded manager + ezETH and sends only the received-balance delta.
- Sky stake/unstake take a caller-chosen
stakingContract. Stake approves andstakes. Unstake callswithdrawthenwithdrawTokens(stakingToken, amount)— a no-op fake farm drains existing wallet tokens of that asset. Owner-or-bot. Staking-enginefree/locksend through the engine toto/ urn index foraddress(this). - Pendle redeem requires
market.isExpired(), pulls PT, transfers it toreadTokens().yt, thenredeemPY+ SYredeemwithminAmountOut. A hostile market that names an attacker YT is owner-or-bot. - Yearn supply uses hardcoded
yearnRegistry.latestVault(token). Withdraw takes a caller-chosen yToken, pulls shares,vault.withdraw, and sends the underlying-balance delta. A fake vault that does not pay sends zero, not a requested amount. - Uni V2 factory/router and Uni V3
position manager are hardcoded. V3
decrease/collect require the wallet to
own
tokenId. V2 removeLiquidity sends totovia the router.
Remaining DFS folders: summerfi, insta,
lsv, merkel, fee, checkers, leftover
utils (CreateSub / wrap-ETH). Not submitted.
2026-09-03: DeFi Saver Summer.fi / Insta / LSV / Merkl / fee / checkers (e623f20)
Same Immunefi program defisaver ($350,000, kyc: false).
Same clone /tmp/reviews/defisaver-v3 at e623f20.
No mainnet interaction.
Files: contracts/actions/summerfi/{SFProxyEntryPoint, SFApproveTokens,SummerfiUnsub,SummerfiUnsubV2}.sol,
insta/{InstPullTokens,connectors/ConnectV2DefiSaver*.sol, connectors/resolver.sol},
lsv/{LSVSupply,LSVBorrow,LSVPayback,LSVWithdraw}.sol,
merkel/MerklClaim.sol,
fee/{GasFeeTaker,GasFeeTakerL2,GasFeeCalc}.sol,
checkers/*RatioCheck*.sol,
utils/{CreateSub,UpdateSub,ToggleSub,WrapEth,UnwrapEth}.sol.
Checked for: Summer.fi approve that sets
allowance on a stranger’s SF proxy; Insta
cast that drains another DSA; Merkl
distinctTokens that withdrawTokens more
than the claim minted; LSV fee that takes
more than 10% of a real withdraw; GasFeeTaker
that spends an unpiped wallet balance past
the 20% cap.
Result: no user-exploitable finding.
SFApproveTokensexecutesAAVEV3PaybackWithdrawon a caller-chosensfProxythrough hardcoded OperationExecutor / SetApproval0x3CF2…bA5(version- pinned in ServiceRegistry). AccountGuard must already permit this wallet. Spender defaults to the wallet; allowance is re-read after the call.SummerfiUnsub/UnsubV2delegatecall hardcoded AutomationBot / AutomationBotV2 (0x6E87…01b/0x5743…25E) to remove the wallet’s own triggers.SFProxyEntryPointfallback delegatecalls RecipeExecutor;receivereverts.InstPullTokenscastsBASIC-Awithdraw on a caller-chosen DSA. Only a DSA that already authorized this wallet will succeed. ConnectV2DefiSaver fallbacks delegatecall a hardcoded RecipeExecutor from an Instadapp spell the DSA owner signed.- LSV supply/borrow/payback only write the hardcoded profit tracker. Withdraw takes a performance fee (0% if discounted) capped at 10% of the stated LST amount, converted via hardcoded rETH/cbETH/wstETH/weETH/ezETH rates.
MerklClaimhits the hardcoded distributor. Claiming for anotherusers[]entry is the intended merkle path;distinctTokensthenwithdrawTokensfrom the wallet — owner-or-bot if those amounts exceed the claim. Docs say leave that array empty when claiming for someone else.GasFeeTakercaps gas at 20% ofavailableAmount(wallet balance if unpiped) plus a DFS fee floored at 5 bps. Checkers only revert a strategy when the post-action ratio moved the wrong way.CreateSubgrants auth and stores a hash the wallet signed.
DeFi Saver leftover folders treated as exhausted. Not submitted.
2026-09-03: 0x Settler execute + Permit2 + RFQ/UniV3 (1df9087)
Immunefi program 0x ($1,000,000, kyc: true).
In-scope GH tree is
https://github.com/0xProject/0x-settler/tree/master/src.
Web/API (Matcha, gasless, swap) are websites —
not reviewed, no live-API probing. Local clone
/tmp/0x-settler at 1df9087. No mainnet
interaction.
Files: src/Settler.sol, src/SettlerMetaTxn.sol,
src/SettlerBase.sol (_checkSlippageAndTransfer),
src/core/{Permit2Payment,Basic,RfqOrderSettlement, UniswapV3Fork}.sol,
src/allowanceholder/AllowanceHolder.sol,
src/bridge/BridgeSettler.sol.
Checked for: a later action that spends a payer the taker did not authorize; forwarded Permit2 that accepts a forged empty sig; meta-txn that skips the witness-binding VIP; RFQ self-funded that transfers more taker tokens than the maker signed; UniV3 callback from a non-pool; AllowanceHolder that leaves a standing allowance; slippage check that sends the buy-token to the operator.
Result: no user-exploitable finding.
takerSubmittedsets transient payer to_operator()(_msgSender()). After that,_msgSender()is the payer. Restricted targets are Permit2 and AllowanceHolder (ConfusedDeputy).executeWithPermitrequires_isForwarded().- Forwarded
_transferFromrequires empty sig, nonce 0, and a live deadline, then AllowanceHoldertransferFrom. Witness transfers (_transferFromIKnowWhatImDoing) revertForwarderNotAllowedwhen forwarded. - Meta-txn
executeMetaTxnsets witness =keccak(slippage || actions hash)and payer = signedmsgSender. First action must be a VIP that spends that witness (METATXN_TRANSFER_FROM/METATXN_UNISWAPV3_VIP).takerSubmittedon the meta-txn contract reverts. Operator cannot equalmsgSender. Forwarded meta-txns revert. AllowanceHolder path on meta-txn revertsConfusedDeputy. - RFQ self-funded pays the maker from
Settler’s taker-token balance (capped at
maxTakerAmount, maker-favor rounding) thenpermitWitnessTransferFromof the maker’s permit with a Consideration witness of the taker. RFQ VIP is commented out. - UniV3 VIP / multi-hop: pool address is
CREATE2from a trusted factory+initHash (_uniV3ForkInfo). Callback is installed via_setOperatorAndCall; payeraddress(this)pays from Settler, payer0pays via Permit2/AllowanceHolder packed into callback data. Subsequent hops reset callback data to Settler+token. basicSellToPoolrejects restricted targets, patchesppmof balance into calldata, and forbids empty-return to an EOA.- AllowanceHolder
execsets an ephemeral allowance, ERC-2771-appends sender, rejects ERC20 targets viabalanceOfprobe. Ifsender != tx.originthe allowance is zeroed after exec. - Slippage:
minAmountOut==0 && buyToken==0skips (unless mandatory). Else require Settler balance ≥ min and send the full (or exact-min) buy-token/ETH toslippage.recipient. Intentional leftover sweep of the last hop. - BridgeSettler
executeis takerSubmitted; first action may beTRANSFER_FROMVIP or a regular dispatch. No slippage helper here — remaining work is the per-bridge adapters.
Remaining 0x: other per-DEX adapters and
the rest of src/bridge/. Not submitted.
2026-09-03: 0x Settler UniV2 / Velodrome / Across (1df9087)
Same Immunefi program 0x ($1,000,000, kyc: true).
Same clone /tmp/0x-settler at 1df9087. No
mainnet interaction. Execute / Permit2 / RFQ /
UniV3 already logged.
Files: src/SettlerBase.sol (UNISWAPV2,
VELODROME, POSITIVE_SLIPPAGE),
src/core/{UniswapV2,Velodrome,Across}.sol.
Checked for: a user-supplied UniV2/Velo pool that is not a pair but still drains a later action’s tokens; Across spoke that is a restricted target; positive-slippage that sends more than leftover.
Result: no user-exploitable finding.
- UniV2 / Velodrome take a caller-chosen
pool, read
token0/token1(ormetadata), transferppmof Settler’s sell-token balance, thenswap. A fake pool can only take tokens already in this Settler execution.minBuyAmountstill applies. Permit2 / AllowanceHolder do not implementswap. POSITIVE_SLIPPAGEsendsmin(balance - expected, balance * maxPpm / BASIS)of leftover torecipient. Action data is in the signed / submitted list.- Across overwrites
inputAmountto the current Settler balance (or ETH balance) and scalesoutputAmountwith 512-bit math, then callsISpokePool.depositon a caller-chosen spoke. Selector does not clash with restricted targets. Funds moved are this execution’s leftovers.
Remaining 0x: other DEX mixins (Maverick, Balancer, Bebop, EulerSwap, Dodo, Curve, UniswapV4, PancakeInfinity, Renegade, …) and Relay / NucleusTeller. Not submitted.
2026-09-03: Extra Finance LYF LendingPool + Velo manager
Immunefi program extrafinance ($100,000,
kyc: false, updated 2026-09-02). Scope is
Optimism etherscan addresses, no official
GH tree in the program JSON. Sources from
Sourcify exact-match plus
ExtraFi/extra-contracts
(repo documents mainnet-vs-fix diffs).
No mainnet interaction.
Files: Sourcify /tmp/extrafinance/lendingpool
contracts/lendingpool/{LendingPool, ExtraInterestBearingToken,StakingRewards}.sol,
libraries/logic/ReserveLogic.sol,
Payments.sol; Sourcify
/tmp/extrafinance/velo
contracts/VeloPositionManager.sol;
Sourcify /tmp/extrafinance/rdist
contracts/RewardsDistributor.sol.
Live LendingPool
0xBB505c54D71E9e599cB8435b4F0cEEc05fC71cbD,
VeloPositionManager
0xf9cFB8a62f50e10AdDE5Aa888B44cF01C5957055.
Checked for: redeem of another user’s eTokens; borrow without whitelist / credits; repay that inflates vault credits past actual debt; first-depositor exchange-rate inflation; Velo callback from a non-vault; staking withdraw of another user.
Result: no new user-exploitable finding.
- Borrow / repay require
borrowingWhiteList[msg.sender]anddebtPosition.owner == msg.sender. Credits and whitelist are owner-set per vault fromVaultFactory. - Mainnet
repayaddscreditsusing the requested amount before capping todebtPosition.borrowed. ExtraFi’s ownBUG_FIXES_AND_MODIFICATIONS.mdalready labels this a known mainnet bug and says it is not externally exploitable because only whitelisted vaults callrepay. The public repo already caps first. Vault position- logic implementations (registry ids 101–105) are not on Sourcify, so this slice cannot prove a user-controlled passthrough. Do not file the known credit bug without that vault path. - eToken burn is
onlyLendingPooland burns the pool’s own balance aftertransferFromof the redeemer.withdrawByLendingPoolisonlyLendingPool. - First-depositor inflation is also in ExtraFi’s known-issues list; they say mainnet inits dead-share the first 10k eTokens in the same tx.
unwrapWETH9unwraps the contract’s full WETH balance (donation / leftover sweep, not another user’s position).- Velo
payToVaultCallback/payFeeToTreasuryCallbackrequiremsg.sender == factory.vaults(id). Liquidation / compound / range-stop are whitelist-or-flag gated. - StakingRewards
setReward/ claim quirks are the same documented owner-gated known issues.
Remaining Extra Finance: vault
implementations (not Sourcify), ExtraX
account factory
(0x345e8250cB11F61F0d8cFaBAC6be59A356309a58),
Aave-fork Pool impl
(0x0353b6221B23B8320202320Ca450EEB9fB0de9E5),
veToken. Not submitted.
2026-09-03: 0x leftover Stargate / LayerZero / CCIP / Mayan / DeBridge (1df9087)
Same Immunefi program 0x ($1,000,000, kyc: true).
Same clone /tmp/0x-settler at 1df9087.
No mainnet interaction. Across / UniV2 /
Velodrome already logged.
Files: src/core/{StargateV2,LayerZeroOFT, CCIP,Mayan,DeBridge}.sol,
src/bridge/IBridgeSettlerActions.sol.
Checked for: a hostile pool/OFT/router that
is Permit2 or AllowanceHolder; amount
override that spends a later action’s
tokens for a stranger; Mayan
protocolAndData that calls an arbitrary
target with Settler’s allowance.
Result: no user-exploitable finding.
- All five run only from BridgeSettler
_dispatchinside onetakerSubmitted/ signed execute. They overwriteamountLD/giveAmount/tokenAmounts[0].amount/ MayanamountInto this Settler’s current token (or ETH-minus-fee) balance, thensafeApproveIfBelowthe bridge. - Stargate / LayerZero / CCIP take a
caller-chosen
pool/oft/routerand call a fixed selector (sendToken/send/ccipSend). Comments note those selectors do not clash with Permit2 or AllowanceHolder. A fake pool can only keep tokens this execution already pulled — same authenticated-execution class as UniV2. - Mayan / DeBridge use hardcoded
MAYAN_FORWARDER(0x3376…3E2) andDLN_SOURCE(0xeF4f…EB66). Receiver /to/mayanProtocolbytes are in the taker’s action data. - CCIP requires
feeToken == 0and exactly onetokenAmountsentry, then sendsselfbalance()as native fee (excess is documented as a donation).
Remaining 0x: other DEX mixins (UniV4, BalancerV3, Curve, Dodo, EulerSwap, PancakeInfinity, …) and Relay / NucleusTeller. Not submitted.
2026-09-03: 0x Settler UniV4 + Relay + SETTLER_SWAP (1df9087)
Same Immunefi program 0x ($1,000,000, kyc: true).
Same clone /tmp/reviews/0x-settler at 1df9087.
No mainnet interaction. Stargate / LayerZero /
CCIP / Mayan / DeBridge already logged in
the leftover above.
Files: src/core/{UniswapV4,Relay}.sol,
src/bridge/BridgeSettlerBase.sol
(SETTLER_SWAP, Relay),
src/chains/Mainnet/{Common,TakerSubmitted, MetaTxn}.sol (UniV4 / UniV4 VIP).
Checked for: a UniV4 hook that spends a payer the taker did not authorize; Relay that hits Permit2 or AllowanceHolder; SETTLER_SWAP to a counterfeit Settler.
Result: no user-exploitable finding.
- UniV4 unlocks via
_setOperatorAndCall. Payeraddress(this)transfers from Settler; payer0uses Permit2 / AllowanceHolder packed into the VIP. Fills (pool key, hooks, hook data, ppm) are in the submitted / signed action. Global buy token istaken torecipientagainstminBuyAmount; leftover credit on other notes is swept to Settler. Incomplete fill refunds sell credit. Zero sell reverts. - Relay transfers this execution’s full
ERC20 / ETH balance to the action’s
to. Native path is a raw call withrequestIdgraffiti; ERC20 path istransfer. Neither selector clashes with Permit2 / AllowanceHolder. SETTLER_SWAPrequires the target to be the current or previous Deployer NFT owner of the taker-submitted tokenId. Comment notes MEV can force the inner swap to its slippage limit; that is in-execution leftover, not another user’s custody.
Remaining 0x: other DEX mixins (Maverick, BalancerV3, Bebop, EulerSwap, Dodo, Curve, PancakeInfinity, Renegade, Ekubo, Hanji, NucleusTeller). Not submitted.
2026-09-03: 0x Settler Maverick / Dodo / BalancerV3 (1df9087)
Same Immunefi program 0x ($1,000,000, kyc: true).
Same clone /tmp/reviews/0x-settler at 1df9087.
No mainnet interaction. UniV4 / Relay /
SETTLER_SWAP already logged.
Files: src/core/{MaverickV2,DodoV1,DodoV2, BalancerV3}.sol,
src/chains/Mainnet/Common.sol (dispatch).
Checked for: a fake Maverick/Dodo pool that
drains a later action; BalancerV3 vault
callback that spends a payer the taker
did not authorize; Dodo V1 quote-for-base
that over-buys past minBuyAmount.
Result: no user-exploitable finding.
- Maverick V2 transfers
ppmof Settler balance (or pool-balance delta whenppm==0), thenswapwith empty callback data so the pool does not flash-callback.minBuyAmountstill applies. A fake pool can only take tokens already in this execution. - Dodo V2 transfers then
sellBase/sellQuotetorecipient. Dodo V1safeApproveIfBelows the caller-chosen pair, sells base with the pair’s ownminReceiveQuote, or quote-for-base after local curve math andbuyBaseToken(buyAmount, sellAmount). Slippage is checked before the buy call. - Balancer V3 vault is hardcoded
(
0xbA13…9bA9). Unlock uses the same_setOperatorAndCall+ notes pattern as UniV4. Payeraddress(this)transfers from Settler; payer0uses Permit2. Wrap/unwrap bits are in the signed fills. Global buy token issendTo’d torecipientagainstminBuyAmount.
Remaining 0x: EulerSwap, Curve, PancakeInfinity, Bebop, Renegade, Ekubo, Hanji, NucleusTeller. Not submitted.
2026-09-03: Extra Finance ExtraX factory + Aave-fork Pool
Same Immunefi program extrafinance ($100,000,
kyc: false, updated 2026-09-02). Same
Sourcify + ExtraFi/extra-contracts method
as the LYF slice. Live Optimism RPC
https://mainnet.optimism.io used only
for initialized / EIP-1967 views — no
state-changing calls. No mainnet
interaction beyond those reads.
Files: Sourcify exact_match ExtraX impl
/tmp/extrafinance/xacct
contracts/extra-x-account/ExtraXAccountFactory.sol
(0x345e8250cB11F61F0d8cFaBAC6be59A356309a58);
Safe creator
/tmp/extrafinance/creator_safe
…/SafeAccount130Creator.sol
(0x1EEA0464D31F349D31FF7D318ce236F48AD92438);
Coinbase creator
/tmp/extrafinance/creator_cb
…/CoinbaseAccountCreator.sol
(0xd4b5D2A9F8e9Ec1883Ef997eB508EA6Cc12B240f);
Sourcify match (not exact) Aave V3 fork
/tmp/extrafinance/poolimpl
contracts/core-v3/protocol/pool/Pool.sol
(0x0353b6221B23B8320202320Ca450EEB9fB0de9E5)
plus PoolConfigurator / AToken /
VariableDebtToken under
/tmp/extrafinance/{poolcfg,atoken,debt}.
Live ExtraX proxy
0x90cF2763CC710B9Ce215584A89c77F70bbb96B44.
Checked for: uninitialized ExtraX proxy
takeover; createAccountFor that assigns
a Safe/Coinbase account to a stranger;
import of an account the caller does not
own; ExtraFi-specific money-flow in the
Aave-fork Pool.
Result: no user-exploitable finding.
- Live proxy and impl both return
initialized() == 1. EIP-1967 implementation is the ExtraX factory impl; admin is0x750f7153e6c92a24089a34ec6afe65740c9bd40a.initializeispublic initializable(once). Not an uninitialized-proxy takeover. createAccount/createAccountForare public. They create a Safe 1.3.0 or Coinbase smart account owned byownervia official L2 factories (0xC228…10BC+ singleton0xfb1b…91EA; Coinbase0x0BA5…428a). That is a gift, not a steal. Creators areonlyFactory. Nonce iskeccak(factory, EXTRA_X_ACCOUNT_SEED, accType, owner, id).- Live
totalAccTypes == 2andisAccountImportEnabled == false. Import, when enabled, callsvalidateAccountOwner(isOwner+ singleton / implementation match). - Aave-fork Pool is stock Aave V3 Supply / Borrow / Liquidation / FlashLoan / Validation. Grep found no ExtraFi-specific money-flow. Do not spend a later pass re-auditing Aave V3.
- Official extra-contracts repo still
has only
VaultFactory+IveTokenfor vault / veToken. Registry logic ids 101–105 and live vault 1 (0x2f8305…A33C) are Sourcify 404.
Remaining Extra Finance: vault position logic (not Sourcify) and veToken. Not submitted.
2026-09-03: Index Coop Set Protocol V2
Immunefi program indexcoop ($200,000,
kyc: false, updated 2026-09-01). Scope
is five Ethereum mainnet etherscan
addresses, no GH tree in the program
JSON. Sourcify exact_match fetched to
/tmp/indexcoop/. No mainnet
interaction.
| Address | Contract | Path |
|---|---|---|
0xD2463675a099101E36D85278494268261a66603A |
Controller | ic_controller |
0x2758BF6Af0EC63f1710d3d7890e1C263a247B75E |
SetTokenCreator | ic_creator |
0xa0a98EB7Af028BE00d04e46e1316808A62a8fd59 |
DebtIssuanceModuleV2 | ic_dimv2 |
0x165EDF07Bb61904f47800e13F5120E64C4B9A186 |
StreamingFeeModule | ic_sfm |
0xb9083dee5e8273E54B9DB4c31bA9d4aB7C6B28d3 |
IntegrationRegistry | ic_registry |
These are Set Protocol V2 (Set Labs, Apache-2.0, Solidity 0.6.10).
Files: Controller.sol,
SetTokenCreator.sol,
DebtIssuanceModuleV2.sol +
IssuanceValidationUtils.sol,
StreamingFeeModule.sol,
IntegrationRegistry.sol.
Checked for: a non-factory that registers a Set; issue/redeem that leaves the Set undercollateralized beyond the documented aToken ±1 wei tolerance; streaming fee that inflates past the committed max; a public adapter add.
Result: no user-exploitable finding.
- Controller
initializeisonlyOwneronce.addSetisonlyFactory. Factories / modules / resources / fees are owner-gated. SetTokenCreator.createdeploys a new Set the caller manages and registers it viacontroller.addSet. Components / units / modules are checked; modules must already be enabled. Intended factory path.- DIMV2 overrides V1 issue/redeem with
looser post-transfer
collateralization checks (aToken ±1
wei rounding). Still
onlyValidAndInitializedSet, pulls components frommsg.sender, mints/burns, and charges manager/protocol fees. V1 manager hooks stayonlyManagerAndValidSet. Equity in usespreciseMulCeilas a lower bound after the transfer. - StreamingFee inflates Set supply to
the manager (and protocol cut).
feeStatesare per Set. Max fee is committed atinitialize(onlySetManager+ pending Set).updateStreamingFeeaccrues first and requires the new fee< max. - IntegrationRegistry add/edit/remove
are
onlyOwnerand requirecontroller.isModule.
Remaining Index Coop: none of the five in-scope addresses. Not submitted.
2026-09-03: 0x leftover Bebop / EulerSwap / Curve (1df9087)
Same Immunefi program 0x ($1,000,000,
kyc: true). Same clone
/tmp/0x-settler at 1df9087. No
mainnet interaction. Maverick / Dodo /
BalancerV3 already logged.
Files: src/core/{Bebop,EulerSwap, CurveTricrypto}.sol.
Checked for: Bebop that fills more taker tokens than Settler holds or sends maker proceeds to the operator; EulerSwap that spends a pool the account did not authorize as operator, or that incurs a second EVC controller; Curve callback that spends a Permit2 the taker did not sign.
Result: no user-exploitable finding.
- Bebop settlement is hardcoded
_BEBOP = 0xbbbbbBB520d69a9775E85b458C58c648259FAD5Fand is a restricted target. Taker fill ismin(Settler balance, order.taker_amount); maker fill scales with that.amountOutMinapplies before approve +fastSwapSingle. Calldata forcestaker_address = address()(Settler) andreceiver = recipient. Maker signature is required. - EulerSwap
sellToEulerSwapreads pool params/reserves first (safe because Euler admits only listed tokens), capsppmof Settler balance atcalcLimits(supply cap, cash, borrow cap, operator authorization). Curve solve thenfastSwaptorecipientifamountOut > 1.checkSolvencyrefuses a deferred-check account, refuses a second controller, and LTV-adjusts remaining collaterals against the single debt vault’s oracle. A fake pool can only take tokens already in this execution. - Curve Tricrypto VIP derives the pool
via CREATE2 from
_curveFactory()+factoryNoncepacked inpoolInfo. Callback is installed with_setOperatorAndCall. Permit fields live in transient storage. Callback assertspayer == 0and_transferFroms Permit2 / AllowanceHolder tomsg.sender(the pool). Code-prefix hash check is commented out; a colliding CREATE2 at that nonce would still only spend the signed permit.
Remaining 0x: PancakeInfinity, Renegade, Ekubo, Hanji, NucleusTeller. Not submitted.
2026-09-03: 0x leftover Pancake / Renegade / Ekubo / Hanji / Nucleus (1df9087)
Same Immunefi program 0x ($1,000,000, kyc: true).
Same clone /tmp/reviews/0x-settler at 1df9087.
No mainnet interaction. Bebop / EulerSwap /
Curve already logged.
Files: src/core/{PancakeInfinity,Renegade, EkuboV3,Hanji,NucleusTeller}.sol,
src/chains/Mainnet/BridgeSettler.sol.
Checked for: Pancake / Ekubo lock that spends a stranger’s Permit2; Renegade that pays a maker more than this Settler holds; Hanji / Nucleus that hits Permit2 or AllowanceHolder.
Result: no user-exploitable finding.
- Pancake Infinity and Ekubo V3 use
the same notes / VIP pattern as
UniV4 against hardcoded vault /
CORE. Payeraddress(this)transfers from Settler; payer0uses Permit2. Fills (hooks, pool manager id, fee) are in the signed action. - Renegade approves a chain-specific
GasSponsorV2, patches sell amount / tokens / recipient into opaque signed calldata, then subtractsmaxRefundAmountfrom reported buy (conservative).minBuyAmountapplies. - Hanji is a caller-chosen book:
approve or native
ppm, market order,minBuyAmount. - Nucleus Teller / WPAXG are
hardcoded.
bridge/depositAndBridgeoverwrite share or deposit amount to this Settler’s balance and forwardselfbalance().
0x Settler listed leftover DEX / bridge mixins treated as exhausted. Not submitted.
2026-09-03: Extra Finance VeToken (LYF)
Same Immunefi program extrafinance ($100,000,
kyc: false). Scope address
0xe0BeC4F45aEF64CeC9dCB9010d4beFfB13e91466
(Optimism). Sourcify match fetched to
/tmp/extrafinance/vetoken/VeToken.sol.
No mainnet interaction.
Checked for: withdraw of another user’s
lock; depositFor that extends a
stranger’s unlock time; transfer of
voting-escrow balance.
Result: no user-exploitable finding.
- Curve-style voting escrow. Locks are
per
msg.sender.withdrawrequiresblock.timestamp >= endand paysaccount(msg.sender) only. depositForcannot create a lock or extendend; it only adds tokens to an existing unexpired lock. Tokens come from_msgSender()viasafeTransferFrom.createLock/increaseAmount/increaseUnlockTimearemsg.sender-scoped. Unlock is rounded to weeks and capped atMAX_TIME.checkpointis permissionless bookkeeping.balanceOfis voting power, not an ERC-20 transferable balance.
Remaining Extra Finance in the Immunefi assets table: Aave-fork ACL / PoolAddressProvider / PoolConfigurator / AToken / DebtToken / EXTRA. Vault registry ids 101–105 are not listed on the program. Not submitted.
2026-09-03: Lista DAO Moolah + PublicLiquidator (ce72699)
Immunefi program listadao ($1,000,000,
kyc: false, updated 2026-05-29). Newest
in-scope adds that day:
Moolah
0x8F73b65B4caAf64FBA2aF91cC5D4a2A1318E5D8C
and PublicLiquidator
0x882475d622c687b079f149B69a15683FCbeCC6D9
(BSC). Official tree
lista-dao/moolah
cloned at ce72699. Sourcify
exact_match for live Moolah. No mainnet
interaction.
Files: src/moolah/Moolah.sol
(borrow / repay / supplyCollateral /
withdrawCollateral / liquidate /
flashLoan / authorization),
src/liquidator/PublicLiquidator.sol.
Checked for: borrow of another user’s position; liquidate of a healthy position; PublicLiquidator callback that spends a non-whitelisted pair or keeps leftover approval; flash loan that does not pull back.
Result: no user-exploitable finding in this first slice.
- Borrow / withdrawCollateral require
_isSenderAuthorizedunless a marketproviderorbrokeris set (then only that role). Supply and borrow also gateisWhiteList(empty list = open). Health is checked after share math; liquidity istotalBorrow <= totalSupply. liquidaterequires the caller on the market’s liquidation whitelist (empty = open), exactly one of seized/repaid, and!_isHealthy. Collateral is sent, thenonMoolahLiquidate, thentransferFromofrepaidAssets._isHealthyAfterLiquidateforbids leaving a dust unhealthy leftover belowminLoan.liquidateBrokerPositionismsg.sender == brokers[id]and writes off shares without seizing collateral (broker-gated).- Flash loan transfers out, callback,
then
transferFromthe same amount. Token blacklist is admin-set. - PublicLiquidator
isLiquidatableis an extra allowlist (Moolah open-liq / market / per-user), not the health check — Moolah still requires unhealthy. Flash pathscallonlypairWhitelist/smartProviders(MANAGER).NoProfitcompares pre/post loan or collateral balances. Approvals are zeroed after the swap.onMoolahLiquidateisOnlyMoolah.
Remaining Lista: older lisUSD / slisBNB / clipper / gemJoin / distributor / PSM / OFT / strategy addresses, plus Moolah vault / IRM / broker / credit-loan in the same repo if a later pass wants depth. Not submitted.
2026-09-03: 0x leftover EulerSwap / Curve / Pancake / Bebop / Renegade / Ekubo / Hanji / Nucleus / MakerPSM (1df9087)
Same Immunefi program 0x ($1,000,000, kyc: true).
Same clone /tmp/0x-settler at 1df9087
(log text also points at /tmp/reviews/0x-settler).
No mainnet interaction. Earlier 0x slices
already covered execute / Permit2 / RFQ /
UniV3 / AllowanceHolder / BridgeSettler,
UniV2 / Velodrome / Across /
POSITIVE_SLIPPAGE, leftover bridges,
UniV4 / Relay / SETTLER_SWAP, and
Maverick / Dodo / BalancerV3.
Files: src/core/{EulerSwap,EulerSwapBUSL, CurveTricrypto,PancakeInfinity,Bebop, Renegade,EkuboV2,EkuboV3,Hanji, NucleusTeller,MakerPSM}.sol,
src/core/pancakeInfinityForks/{PancakeInfinity,OrvexCL}.sol,
src/chains/{Mainnet,Arbitrum,Base,Bnb,Optimism}/Common.sol
(dispatch + hardcoded factory / vault /
sponsor / teller).
Checked for: a fake Euler/Hanji pool that
drains a later action; Curve VIP callback
that spends a Permit2 the taker did not
sign; Pancake / Ekubo lock callback that
pays a vault the operator did not set;
Bebop / Renegade settlement that
rewrites receiver past recipient;
Nucleus Teller that bridges a user’s
WPAXG they did not send this execution;
MakerPSM that spends constructor
approvals for a caller-chosen fake PSM.
Result: no user-exploitable finding.
- EulerSwap transfers
ppmof Settler balance (capped to the pool’sinLimit), thenswapafter local curve math. Slippage is checked before the swap. A fake pool can only keep tokens already in this execution.EulerSwapBUSLis the licensed curve library, not an entrypoint. - Curve Tricrypto VIP is compiled out
of the Mainnet mixin (
//CurveTricrypto) and still live on Arbitrum. Pool is CREATE-derived from a hardcoded factory (0xbC07…EE8) plus the action’s factory nonce. The old bytecode-prefix check is commented out; CREATE from the real factory is the deputy check. Callback assertspayer == 0and Permit2-transfers the signed token tomsg.sender(the derived pool). - Pancake Infinity vault is hardcoded
(
0x238a…e6c4on BNB/Base; Orvex fork0xFe7E…b0D). Lock uses the same_setOperatorAndCall+ notes pattern as UniV4. Payeraddress(this)transfers from Settler; payer0uses Permit2. Hostile hooks are in the signed fills and can only move this execution’s notes. Global buy token is taken torecipientagainstminBuyAmount. - Bebop settlement is hardcoded
(
0xbbbb…AD5F) and is a restricted target. Taker is overwritten to Settler; receiver is overwritten torecipient. Approval is this execution’s balance capped byorder.taker_amount. Proportional maker fill is slippage-checked beforeswapSingle. - Renegade calls a per-chain hardcoded
GasSponsorV2(Arbitrum0xcE7a…EBcf, Base0xD9E0…e80). Sell amount is this Settler’s balance capped bymaxSellAmount. Calldata prefix overwritesrecipient/ buy / sell tokens. Returned buy amount subtractsmaxRefundAmountbefore the slippage check when the refund is not already the buy token. - Ekubo V2 core
0xe0e0…d444and V3 core0x0000…d701are hardcoded. Same lock/notes pattern. V2 requirespayer == address(this)(no VIP). V3 VIP pays via Permit2 to the operator-set core. - Hanji is a caller-chosen pool.
Settler approves
ppmof balance (or sends native) and places a market order. A fake pool can only take tokens already in this execution. - Nucleus Teller
(
0xeE98…59dF) and WPAXG (0x5cB5…F484) are hardcoded.bridge/depositAndBridgeoverwrite share/deposit amount to this Settler’s current balance.BridgeData.destinationChainReceiveris in the action. Excess native is documented as an endpoint refund to this contract. - MakerPSM constructor max-approves
only LitePSM / SkyPSM / UsddPSM /
UsddGemJoin. Gem is USDT iff
psm == UsddPSM, else USDC. A fakedaionly changes the local balance read used to size the trade; the real PSM still pulls the approved stable. Oversized fakebalanceOfmakes the PSM revert when it cannot pull that much.
src/core/univ3forks/* are
factory+initHash tables for the
already-logged UniV3 path. OrvexCL is
address constants only. 0x leftover
DEX / teller mixins are exhausted.
Remaining 0x: none of the mixin trees. Not submitted.
2026-09-03: Enzyme Blue Bebop / ThreeOneThird / SharesSplitter (da3b870 + Sourcify)
Immunefi program enzymefinance ($200,000,
kyc: false). Gated-redemption wrapper +
share-price throttle already logged.
This slice is the leftover etherscan
adapters / splitter. No mainnet
interaction.
Files: GH /tmp/reviews/enzyme-protocol
da3b870
contracts/release/extensions/integration-manager/integrations/adapters/BebopBlendAdapter.sol,
contracts/persistent/shares-splitter/{SharesSplitterFactory,SharesSplitterLib,TreasurySplitterMixin}.sol,
contracts/persistent/global-config/GlobalConfigLib.sol
(isValidRedeemSharesCall);
Sourcify exact-match Base
0x5a1c0E89133C4Cd844A8B345370565f1368A79A8
(/tmp/reviews/enzyme-tot)
ThreeOneThirdAdapter.sol +
ThreeOneThirdActionsMixin.sol
(added to Immunefi 25 May 2026).
BebopBlendAdapter etherscan add is
17 Dec 2025; SharesSplitterFactory is
2022 (same tree).
Checked for: Bebop that sends maker proceeds off-vault or spends past the IM transfer; ThreeOneThird batch that nets spend/incoming so a later hop is unpaid; splitter redeem that cashes another user’s unclaimed shares.
Result: no user-exploitable finding.
- Bebop
actionisonlyIntegrationManager.parseAssetsForActionrequiresreceiver == vaultandisAllowedMaker(list id 0 is documented as any maker). IMTransferstaker_amountto the adapter, then checks the vault’s maker-token delta againstminIncomingAssetAmount. - ThreeOneThird
takeOrderhas noonlyIntegrationManager; it can only spend tokens already on the adapter (donation / leftover). IM stillTransfers net spend assets and requires the vault incoming delta.parseAssetsnets from/to per asset, appliesceilDiv(minToReceiveBeforeFees * (10000 - fee) / 10000), then leftover spend/incoming are pushed back to the vault. - SharesSplitter
initis factory-only once. Splits must sum to 100% with unique users.redeemSharesclaims onlymsg.sender’s share, thenisValidRedeemSharesCallrequires the vault accessor and a V4 redeem selector, and the encoded shares amount must equal the claimed amount. Recipient is intentionally unchecked (0x…aaaa).
Remaining Enzyme Blue leftover etherscan adapters: none of Bebop / ThreeOneThird / SharesSplitter. Extra Finance vault / veToken still not on Sourcify. Not submitted.
2026-09-03: Lista leftover PSM / LisUSD / clip-join / slisBNB (3e120da + 67e524c)
Same Immunefi program listadao ($1,000,000,
kyc: false). Moolah + PublicLiquidator
already logged. Official trees
lista-dao/lista-dao-contracts
at 3e120da and
lista-dao/synclub-contracts
at 67e524c. Immunefi HTML
(scraped 04:00 UTC 3 Sep) lists lisUSD
0x0782…41E5, PSM(USDT)
0xaa57…eC0c, LisUSDPoolSet
0x37DB…D0Bf, clipCE / clipper
rows, GemJoin rows, and slisBNB
0xB0b8…14A1. No mainnet
interaction.
Files: contracts/{LisUSD,clip,join}.sol,
contracts/psm/{PSM,VaultManager, LisUSDPoolSet,EarnPool}.sol,
contracts/ListaStakeManager.sol,
contracts/SLisBNB.sol.
Checked for: PSM buy that skips the
lisUSD pull; LisUSDPoolSet withdraw
that skips a user’s emission bucket;
EarnPool that credits a stranger’s
PSM fill; Clipper take of a healthy
vault; GemJoin exit without vat slip;
slisBNB mint without BNB / claim of
another user’s unconfirmed request.
Result: no user-exploitable finding.
- PSM
sellpulls token, paysamount - feelisUSD, deposits the full token amount toVaultManager(onlyPSMOrManager).buypullsamountlisUSD and withdrawsamount - feetoken to the caller. A 100%buyFeecan incrementfeeswithout a pull —setBuyFeeisMANAGER. Daily buy cap andminBuyapply. - VaultManager leftover token stays
in the vault when adapter points
sum to zero; otherwise it
distributes by point. Withdraw
walks live adapters until
remain == 0. - LisUSDPoolSet shares accrue a
synthetic
duty(BOT, capped bymaxDuty). Rate does not read the token balance, so donations do not inflate shares. Withdraw rounds shares up and requires the caller to drain emission weights first.depositForisonlyEarnPool. - EarnPool sells through a
manager-set PSM whose
token()must match, thendepositFor(token, msg.sender, delta). Leftover lisUSD in EarnPool is a gift to the next depositor, not a steal. - LisUSD mint is
onlyMinter. Burn spends the holder or their allowance.DEFAULT_ADMINis hardcoded TimeLock0x07D2…5253. - GemJoin / HayJoin
join/exitareauth(Interaction-gated), not public Maker-style joins. Clippertakeis alsoauth+ Maker dust /chostrules; PublicLiquidator was the previous slice. - slisBNB mint/burn is
onlyStakeManager. Deposit mints againstamountToDelegate + totalDelegated(notaddress(this).balance). Instant withdraw is whitelist-gated, burns the post-fee amount, and subtracts from the buffer.claimWithdrawonly pays a confirmed uuid to that request’s user (or BOT-for-user). Two hardcoded incident addresses redirect to a recovery vault.
Remaining Lista: SnBnb strategy /
OFT / older distributors / oracles,
and lista-new-contracts (fa5dfa5,
RWA / slisXAUE / LisAster) if those
addresses are later added to
Immunefi. Not submitted.
2026-09-03: Lista Moolah vault + Credit/Lending brokers (ce72699)
Same Immunefi program listadao ($1,000,000,
kyc: false). Moolah core +
PublicLiquidator already logged. Same
clone /tmp/reviews/lista-moolah at
ce72699. No mainnet interaction.
Files: src/moolah-vault/MoolahVault.sol
(deposit / mint / withdraw / redeem /
withdrawFor / redeemFor),
src/credit-loan/{CreditBroker,CreditToken, libraries/MoolahOperateLib}.sol,
src/broker/LendingBroker.sol.
Checked for: withdrawFor that burns
a stranger’s shares without a
provider; CreditBroker repay that
clears another user’s Moolah debt
with the caller as onBehalf;
_tryWithdrawAndBurnDebt that
withdraws credit tokens without
burning; LendingBroker borrow that
skips health.
Result: no user-exploitable finding.
- Vault
withdraw/redeemgo through ERC-4626_withdraw(senderspends allowance ofowner).withdrawFor/redeemForrequiremsg.sender == providerand pass the provider-suppliedsenderas that caller. Receiver is the provider. Deposit/mint whitelist thereceiver. - CreditBroker supply/borrow/
withdraw are
msg.sender+ merklesyncCreditScore._tryWithdrawAndBurnDebtpullsdebtOfcredit tokens back to the user so the following sync can_safeBurnthe excess._repaypulls loan tokens frommsg.senderand Moolah-repaysonBehalf. Penalized positions must be paid in full. Liquidate isBOTand only marks penalized positions bad debt afterliquidateBrokerPosition. - LendingBroker dynamic/fixed
borrow is
msg.sender, then_validateDynamicPosition/_borrowFixed. Repay paths go throughLendingBrokerOperatorLiband pull from the caller foronBehalf. MoolahOperateLib.supplyToMoolahVaultdocuments MEV on interest supply; they say it is capped on credit markets. Not filed.
Remaining Lista: providers
(SlisBNB / BNB / ERC20-LP),
MasterVault + yield strategies,
OFT / distributors /
lista-new-contracts (fa5dfa5).
Extra Finance leftover that is
actually in the Immunefi assets
table is Aave-fork ACL /
PoolAddressProvider /
PoolConfigurator / AToken /
DebtToken / EXTRA — not vault
registry ids 101–105. Not
submitted.
2026-09-03: Lista SlisBNB / BNB / ERC20-LP providers (ce72699 + Sourcify)
Same Immunefi program listadao
($1,000,000, kyc: false). In-scope
BSC adds: slisBNBProvider
0xfD31…819b (2024-12-04),
ERC20TokenProvider
0x2725…aa57 (2025-04-29),
BNBProvider
0x3673…5701 / 0x501b…35c9
and SlisBNBProvider
0x33f7…D5f (2025-05-27).
Moolah + vault + PSM leftover
already logged. Official tree
lista-dao/moolah
at ce72699. ERC20TokenProvider
live proxy is OZ ERC1967;
implementation
0x946e5C3d32d33128543B785a446B81eedbe74C05
is Sourcify ERC20LpTokenProvider
(contracts/dao/erc20LpProvider/ERC20LpTokenProvider.sol,
verified 2026-05-20). No mainnet
interaction.
Files:
src/provider/{SlisBNBProvider,BNBProvider}.sol
(and ETHProvider.sol as the
WETH twin — not an Immunefi
asset),
src/moolah-vault/MoolahVault.sol
withdrawFor / redeemFor (already
logged; re-read for the provider
call), Sourcify
ERC20LpTokenProvider.sol.
Checked for: SlisBNBProvider
withdraw of another user’s
Moolah collateral; permissionless
syncUserLp that mints unbacked
clis; BNBProvider
withdraw/borrow that unwraps
to an unauthorized receiver;
ERC20-LP deposit that mints clis
to a stranger or withdraw that
skips the distributor burn.
Result: no user-exploitable finding.
- SlisBNBProvider
supplyCollateralpulls slisBNB frommsg.sender, supplies to MoolahonBehalf, then_syncPosition.withdrawCollateralrequires_isSenderAuthorized(msg.sender == onBehalfor Moolah allowance).liquidateisonlyMoolah. LP rebalance convertsuserTotalDepositthroughSTAKE_MANAGER×userLpRate(MANAGER, ≤ 1e18) and mints/burns via_mintToMPCs/_safeBurnLp. Ifproviders[id][TOKEN]is not this contract, recorded collateral is treated as 0 (intended unbind).delegateAllTois disabled onceslisBNBxMinteris set. PermissionlesssyncUserLponly remints to the recorded holder. Transferring clis away leaves leftover tokens in circulation (_safeBurnLpburnsmin(need, balance)); that is a receipt-token footgun, not a steal of slisBNB. - BNBProvider wraps
msg.valueto WBNB and deposits only into manager-whitelisted vaults whoseMOOLAH()/asset()match.withdraw/redeemcall vaultwithdrawFor/redeemFor(msg.sender == provider) with the provider-suppliedsenderas the ERC-4626 spender, then unwrap toreceiver.borrow/withdrawCollateralrequireisSenderAuthorized. Excess BNB onmint/repayis refunded tomsg.sender.liquidateis an emptyonlyMoolahhook. - ERC20LpTokenProvider
deposit/withdrawaremsg.sender-scoped._deposittransfers the LP token,depositFors the distributor, then rebalances clis to the chosen delegatee.withdrawcallswithdrawFor(_amount, msg.sender)before rebalance.syncUserLpis permissionless bookkeeping.initializecompares_exchangeRate >= userLpRateagainst storage (still 0), so a bad first-time pair of rates can underflownewReservedLp— that is deploy/admin config, and latersetUserLpRaterequires_userLpRate <= exchangeRate. Live proxy has been serving since Apr- Not filed.
Remaining Lista: MasterVault +
yield strategies, OFT /
distributors /
lista-new-contracts. Extra
Finance in-scope leftover is
Aave-fork ACL / config / aToken
/ EXTRA, not vault 101–105.
Not submitted.
2026-09-03: Lista MasterVault + yield strategies (3e120da)
Same program. Official
lista-dao/lista-dao-contracts
at 3e120da. Immunefi lists
Master Vault
0x986b…cc54 and
Ceros / stkBNB / snBNB /
bnbYieldConverter strategies
(2024-02-22). PSM / clip-join
already logged. No mainnet
interaction.
Files:
contracts/masterVault/MasterVault.sol,
contracts/strategy/{BaseStrategy,SnBnbYieldConverterStrategy}.sol,
contracts/old/strategy/{CerosYieldConverterStrategy,StkBnbStrategy}.sol.
Checked for: MasterVault mint
without onlyProvider;
withdrawETH that pays more
BNB than burned shares;
strategy withdraw callable
by a stranger; FIFO
distribute that pays the
wrong recipient.
Result: no user-exploitable finding.
depositETH/withdrawETH/withdrawInTokenFromStrategyareonlyProvider. Deposit mintsamount - depositFeeceToken to the provider. Withdraw burnsamountfrom the provider, paysamount - withdrawalFeefrom idle BNB, then pulls the shortfall from active strategies (debt-capped).withdrawInTokenFromStrategyburns first, thenwithdrawInTokenon the strategy.allocate/retireStrat/migrateStrategyare manager.BaseStrategydeposit/withdrawareonlyVault.receiveaccepts BNB only fromdestinationorstrategist.- SnBnb strategy
_withdrawrecords FIFO{recipient, amount}and batchesrequestWithdrawpermissionlessly (≥ 1h)._distributeFundpays the recorded recipient (5000 gas); failed sends go tomanualWithdrawAmount(anyone candistributeManualto that recipient).withdrawInTokentransfersconvertBnbToSnBnb(amount)and decrementsbnbDepositBalance. Harvest is strategist-only and sends surplus snBNB (holding − queued unstake − BNB-equivalent) torewards. - Ceros / StkBnb old
strategies are the same
onlyVaultdeposit/withdraw pattern plus a strategist panic that withdraws vault debt to the vault.
Remaining Lista: OFT /
distributors /
lista-new-contracts
(fa5dfa5). Extra Finance
in-scope leftover is the
Aave-fork ACL / config /
aToken / EXTRA set. Not
submitted.
2026-09-03: Lista leftover strategy / OFT / distributors / providers (3e120da + 28a3c02 + fa5dfa5)
Same Immunefi program listadao ($1,000,000,
kyc: false). PSM / LisUSD / clip-join /
slisBNB already logged. Official trees
lista-dao-contracts 3e120da,
lista-token 28a3c02,
lista-new-contracts fa5dfa5.
Immunefi HTML (rechecked 04:03 UTC 3 Sep)
lists snBNBStrategy / Ceros / stkBNB /
bnbYieldConverter, ListaOFTAdapter
0x837C…E7B3, VenusAdapter(USDT),
SlisBNBProvider / ERC20TokenProvider,
Borrow / Collateral / Stake
distributors, VeListaRevenueDistributor,
VeListaInterestRebater, and
LendingRewardsDistributor. No mainnet
interaction.
Files: contracts/strategy/{BaseStrategy, SnBnbYieldConverterStrategy}.sol,
contracts/old/strategy/CerosYieldConverterStrategy.sol,
contracts/psm/VenusAdapter.sol,
contracts/ceros/{ClisToken,provider/BaseTokenProvider,provider/SlisBNBProvider}.sol,
contracts/{Interaction,libraries/AuctionProxy}.sol,
lista-token/contracts/oft/ListaOFTAdapter.sol,
lista-token/contracts/dao/{CommonListaDistributor,BorrowListaDistributor,CollateralListaDistributor,StakeLisUSDListaDistributor,VeListaRevenueDistributor}.sol,
lista-new-contracts/src/{LendingRewardsDistributor,VeListaInterestRebater}.sol.
Checked for: a permissionless strategy
withdraw that pays a stranger; Venus
harvest that drains principal; provider
release of another user’s token;
daoBurn that leaves LP spendable
after bark; OFT credit while paused;
distributor claim of another user’s
integral; merkle claim that pays the
caller.
Result: no user-exploitable finding.
- SnBnb / Ceros strategies:
deposit/withdrawareonlyVault. Harvest isonlyStrategist. FIFO unstake pays the recorded recipient; failed 5k-gas sends go tomanualWithdrawAmount[recipient]. Yield issnBNB balance - snBnbToUnstake - convert(bnbDepositBalance)and underflows rather than over-harvest. - VenusAdapter is
onlyVaultManager. Publicharvestsends interest abovenetDepositAmounttofeeReceiver. Withdraw cannot exceednetDepositAmount. - BaseTokenProvider
provide/releasearemsg.sender.liquidation/daoBurnarePROXY. Afterdog.bark,dao.lockedis 0 sodaoBurn’s_syncLpburns leftover LP even though it ignores_amount. SlisBNBProvider mints a reserve cut tolpReserveAddress;releaseForis migrator-only.withdrawLeftoverpaysdao.freeofmsg.sender. - ClisToken mint/burn is
onlyMinter; token is non-transferable. - ListaOFTAdapter is LayerZero
OFTAdapterplus pause and per-dest transfer limits._debit/_creditarewhenNotPaused. - CommonListaDistributor snapshots
are
MANAGER(Interaction).claimRewardpaysmsg.sendervia the vault;vaultClaimRewardisVAULT. VeListaRevenueDistributordistributeisBOTand splits to receiver +dEaD. - LendingRewardsDistributor and
VeListaInterestRebater merkle
leaves encode
chainid, account, totalAmount. Anyone may submit a proof; tokens go to_account. Pending root waits ≥6h (default 1 day).emergencyWithdrawisMANAGER.
Remaining Lista: price-feed oracles,
Pancake V3 / BNB vault provider
wrappers if they are not the same
BaseTokenProvider path, and
lista-new-contracts RWA / slisXAUE /
LisAster (not in the Immunefi HTML).
Not submitted.
2026-09-03: Extra Finance Aave-fork leftover (ACL / config / aToken)
Immunefi program extrafinance
($100,000, kyc: false). LYF +
ExtraX + Pool skim + VeToken
already logged. Remaining
listed assets (2024-11-26)
are Optimism Aave-v3-fork
PoolConfigurator
0x9378…0ADC, AToken
0x2B27…662E, DebtToken
0xC0C8…d5E,
PoolAddressProvider
0xA98c…721d, ACL
0x70Cd…595f, and EXTRA
0x2dad…8f8. Vault registry
ids 101–105 are not in the
assets table. Sourcify extracts
under /tmp/extrafinance/{atoken, debt,poolcfg}. No mainnet
interaction.
Files:
protocol/tokenization/{AToken,VariableDebtToken}.sol,
protocol/pool/PoolConfigurator.sol.
Checked for: aToken mint/burn
without onlyPool; debt token
that a user can mint to
themselves; configurator
initReserves / dropReserve
callable by a non-admin.
Result: no user-exploitable finding. This is stock Aave v3 tokenization + configurator.
- AToken
mint/burn/mintToTreasury/transferOnLiquidation/transferUnderlyingTo/updateTreasuryareonlyPool.rescueTokensisonlyPoolAdmin. Scaled balances usegetReserveNormalizedIncome. - VariableDebtToken
mint/burnareonlyPool.user != onBehalfOfspends borrow allowance. ERC-20transfer/approverevertOPERATION_NOT_SUPPORTED. - PoolConfigurator
initReservesisonlyAssetListingOrPoolAdmins;dropReserve/ treasury / interest-rate updates areonlyPoolAdmin; collateral / borrow flags areonlyRiskOrPoolAdmins; pause isonlyEmergencyOrPoolAdmin. Roles resolve through the addresses-provider ACL.
Remaining Extra Finance listed Solidity: EXTRA token (standard ERC-20, not pulled here). Vault 101–105 stay OOS. Not submitted.
2026-09-03: Lista new-contracts RWA / slisXAUE / LisAster / leftover distributors (fa5dfa5)
Same Immunefi program listadao ($1,000,000,
kyc: false). Official tree
lista-dao/lista-new-contracts
at fa5dfa5. Immunefi HTML
(scraped earlier 3 Sep) still lists
the Moolah / PSM / slisBNB table;
these RWA / XAUE / LisAster proxies
are not on that table. Program text
also invites out-of-table Lista
assets when the impact matches.
No mainnet interaction.
Files: src/rwa/{RWAEarnPool,RWAAdapter, OTCManager}.sol,
src/slisXAUE/{SlisXAUE,XAUEAdapter, XAUTStaking}.sol,
src/lisaster/{LisAster,LisAsterStaking, LisAsterDistributor,AsterVault, AsterRewards}.sol,
src/{LendingRewardsDistributor, LendingRewardsDistributorV2, VaultDistributor,RewardsRouter, BeraChainVaultAdapter}.sol.
Checked for: EarnPool withdraw that
pays a stranger; adapter notify that
inflates share price for the next
depositor; XAUE adapter interest on
unowned shares; SlisXAUE mint without
MINTER; LisAster claim that redirects
payout; claimAndStake that stakes
to the caller instead of the leaf
account; distributor claim that pays
msg.sender; VaultDistributor claim
that skips the LP / merkle bind.
Result: no user-exploitable finding on in-scope table assets. Not submitted.
- RWAEarnPool
depositmints thentransferFromto the adapter (reverts together). Whitelist gatesreceiveron deposit and share transfer.requestWithdrawburns the caller, queues forreceiver.claimWithdrawpaysuser, not the caller.convertToShares/AssetsusestotalSupply+1/totalAssets()+1.finishWithdrawis adapter-only. - RWAAdapter vault / OTC / fee
paths are BOT or MANAGER.
_updateVaultAssetsonly notifies when vault NAV rose. - SlisXAUE mint/burn is
onlyRole (MINTER). XAUTStaking deposit andrequestWithdrawsync adapter NAV first.claimWithdrawis self-only. Adapter NAV usesexpectedShareBalanceand fail-closes on a share deficit or NAV drop. - LisAster
stake/unstakearemsg.sender.stakeForis a permissionless gift. Distributor merkle leaf is(chainid, account, asterToken, cumulative).claimpaysaccount.claimAndStakeis self-only and deposits 1:1 into AsterVault thenstakeFor. - LendingRewardsDistributor /
V2 claims pay
_accountafter a chainid-bound proof. V2 leaf also bindsaddress(this),claim.selector, and token. RewardsRouter transfers are BOT to a whitelisted distributor. - VaultDistributor pulls
_lpAmountinto the contract and never returns it; the leaf binds that amount. MANAGERemergencyWithdrawis the only escape. Not filed: not on the Immunefi table, and a privileged rescue exists. - BeraChainVaultAdapter user
withdrawburns the caller’s LP 1:1. Manager/bot drains are privileged.
Remaining Lista: price-feed oracles / VeLista lock / airdrop. Extra Finance leftover listed Solidity is EXTRA token. Not submitted.
2026-09-03: Lista leftover price-feed oracles (fa5dfa5)
Same Immunefi program listadao ($1,000,000,
kyc: false). Same clone
/tmp/reviews/lista-new-contracts at
fa5dfa5. Program text still
excludes third-party oracle data
(not oracle-manipulation / flash-loan
attacks). No mainnet interaction.
Files: src/oracle/{LisAsterPriceFeed, wNLPPriceFeed,AtlasOracleAdaptor}.sol,
src/oracle/priceFeed/sUSDSPriceFeed.sol.
Checked for: a feed that lets a caller set the answer; scale that wraps a negative Atlas price into a huge unsigned; wNLP / sUSDS rate that a stranger can inflate on-chain without touching the wrapper.
Result: no user-exploitable finding. Not submitted.
- LisAsterPriceFeed is
ASTER * 0.8from ResilientOraclepeek. No admin.getRoundDatastampsblock.timestamp. - AtlasOracleAdaptor rescales 1e18
→ 1e8.
ans <= 0becomes 0 (ResilientOracle INVALID_PRICE). - wNLP and sUSDS multiply the
wrapper
convert/getNlpByWnlprate bypeek(underlying). Rate has no timestamp (documented). Constructor / constants pin addresses.
Remaining Lista: VeLista lock / airdrop. Extra Finance leftover listed Solidity is EXTRA token. Not submitted.
2026-09-03: Yearn stYFI July leftover (YBC / funding / bonus / team) (69e262e)
Immunefi program yearnfinance
($200,000, kyc: false). July 1
2026 adds: Weight Aggregator
0x6973…ECd7, YBC Weight
Aggregator 0xADB7…8D9, YBC
0xd6AF…B315, YBC Reward
Distributor 0x5310…bbe1, YBC
Election 0xe166…206C, Bonus
Recipient 0xf03a…9e4C, Team
Registry 0x9da4…2F29, Team
impl 0xa59B…BF43, Team
Accountant 0x1c22…DFD6,
Revenue Recipient 0x5B5A…9587,
Revenue Price Oracle
0xC1f9…E2E, Funding
Distributor 0xbCc9…116b,
Bonus Distributor 0xA660…1116,
Bonus Price Oracle 0x7e41…b416,
Staking Middleware
0x24b2…0A86. Official tree
yearn/stYFI
at 69e262e. No mainnet
interaction.
Files: contracts/ybc/{YBC, YBCElection,YBCRewardDistributor, YBCWeightAggregator, YBCBonusRecipient}.vy,
contracts/{WeightAggregator, FundingDistributor,BonusDistributor, Team,TeamRegistry,TeamAccountant, RewardClaimer,RewardDistributor}.vy.
Checked for: YBC claim that pays the caller instead of the member without a claimer gate; election execute of a failed vote; funding claim by a non-team; bonus claim by a non-owner; RewardClaimer that claims a stranger’s components into the caller.
Result: no user-exploitable finding. Not submitted.
- YBC
add_member/remove_memberaremsg.sender == selfvia operatorcall. Election execute is permissionless only after the proposal epoch + 1 and_passed. Members cannot vote their own expulsion. - YBCRewardDistributor
claimrequiresclaimers[msg.sender]and pays the claimer. RewardClaimer is the intended claimer: it callsclaim(msg.sender)then transfers to_recipient(default caller). - FundingDistributor
claimismsg.sender == teamandregistry.is_team. Refund does not unwindused. Teamclaim_fundingis owner-only.return_fundingis permissionless donate-back. - BonusDistributor
claimisITeam(_team).owner().finalize_periodis operator-or-unset. - WeightAggregator hooks
require
depositors [msg.sender]. YBCWeightAggregator member hooks requireupstream_members; stake hooks requireupstream_weights. - RewardDistributor
claimpaysmsg.senderand unpacks that caller as a registered component.
Remaining Yearn stYFI: Feb 2026 core (StakedYFI / liquid lockers / veYFI distributor) if a later pass wants it. Twyne / Hashflow still unreviewed. Remaining Lista: VeLista lock / airdrop. Not submitted.
2026-09-03: Lista VeLista lock + airdrop (28a3c02)
Same Immunefi program listadao
($1,000,000, kyc: false). Official
tree lista-dao/lista-token
at 28a3c02. OFT / dao
distributors already logged. No
mainnet interaction.
Files: contracts/{VeLista, ListaAirdrop}.sol.
Checked for: lock that credits a
stranger; claim / earlyClaim
that pays the caller for another
account; airdrop leaf collision
or payout to msg.sender.
Result: no user-exploitable finding. Not submitted.
lock/relockUnclaimed/extendWeek/claim/earlyClaimaremsg.sender.increaseAmountForis a permissionless gift (caller pays LISTA).claimrequires the lock expired and not auto-lock, then pays the caller.earlyClaimis self-only, appliesgetPenalty, and zeros the position.- ListaAirdrop leaf is
keccak256(abi.encodePacked (account, amount)).claimpaysaccount. Owner can change the root only beforestartTime.reclaimis owner after bothreclaimPeriodandendTime.
Remaining Lista leftover: none of the named VeLista lock / airdrop / oracle slices. Extra Finance leftover listed Solidity (EXTRA) is logged below. Not submitted.
2026-09-03: Hashflow factory / pool / router (e41cfaa)
Immunefi program hashflow
($50,000, kyc: false). 8 Jun
2026 listed assets:
HashflowFactory
0xdE82…DAb5, plus the
three sibling pool/router
rows. Official tree
hashflownetwork/x-protocol
at e41cfaa. No mainnet
interaction.
Files: evm/contracts/ {HashflowFactory, HashflowRouter}.sol,
evm/contracts/pools/ HashflowPool.sol.
Checked for: permissionless
createPool; RFQ-T that pays
a stranger without a MM
signature; RFQ-M that skips
the taker signature; x-chain
fillXChain from an
unauthorized messenger.
Result: no user-exploitable finding. Not submitted.
- Factory
createPoolis allowlisted.updatePoolImplis owner and one-shot. - Router RFQ-T pulls
effectiveBaseTokenAmountfrom_msgSenderand requires an authorized pool. PooltradeRFQTis router-only, recovers the MM signer, and paysquote.trader. The RFQ-T hash binds trader / effectiveTrader / amounts / nonce / expiry / chainid. Partial fills scale quote tokens down only. - RFQ-M requires the trader
EIP-1271 / EOA signature
and a unique
txid, then pulls fromquote.trader. fillXChainrequires an authorized messenger and peer pool. PoolfillXChainis router-only and one-shotstxid.
Remaining Hashflow: the listed Wormhole messenger (this pass below). There is no Aave portal row in the Immunefi table. Twyne GitHub is still private from this VM. Extra Finance leftover listed Solidity is EXTRA token. Not submitted.
2026-09-03: Extra Finance EXTRA token (Sourcify)
Immunefi program extrafinance
($100,000, kyc: false). Last
listed leftover Solidity is
Optimism EXTRA
0x2dAD3a13ef0C6366220f989157009e501e7938F8
(token row, 2023-08-30). Sourcify
v2 exact match, verified
2024-08-08. Contract name
EXTRA. Extract under
/tmp/extrafinance/extra-token.
No mainnet interaction.
Files: contracts/EXTRA.sol
plus stock OZ ERC20 /
Ownable.
Checked for: permissionless mint; mint that ignores the cap; ownerless mint via a public initializer.
Result: no user-exploitable finding. This is a capped owner-mint ERC-20. Closes Extra Finance listed Solidity (vault factory ids 101–105 stay off the table). Not submitted.
- Constructor sets an
immutable
supplyCap.mintisonlyOwnerand reverts whentotalSupply() + amountexceedscap(). No burn, no permit, no hooks. - Primacy of Impact still covers ExtraFi-owned Critical / High / Medium off-table assets; this pass only closes the EXTRA row.
2026-09-03: Hashflow Wormhole messenger (Sourcify)
Same Immunefi program
hashflow ($50,000,
kyc: false). Fourth 8 Jun
2026 listed asset:
Hashflow Wormhole Messenger
0x0a09B370950f69ADC4c2FbF8677C7b0047599c9F.
Sourcify v2 exact match,
verified 2024-08-08. Contract
name HashflowWormholeMessenger.
Extract under
/tmp/hashflow/wormhole.
Factory / pool / router
already logged (e41cfaa).
No mainnet interaction.
Files:
contracts/xchain/ {HashflowWormholeMessenger, HashflowXChainMessengerBase}.sol.
Checked for: tradeXChain
from a non-router; a VAA
from an unauthorized emitter
that still fills; a
permissioned-relayer bypass;
payload amounts that ignore
the source partial fill;
replay of the slow + fast
VAAs against the same
txid.
Result: no user-exploitable finding. Listed Hashflow Solidity is now exhausted. Not submitted.
tradeXChainis router-only and requiresquote.srcChainId == hChainId. PayloadquoteTokenAmountis the amount the router already scaled for a partial RFQ-T.publishMessagespendsmessageFee(doubled when a fast consistency level and a permissioned relayer are set). Excessmsg.valuestays on the messenger;withdrawFundsis owner. Self-grief, not theft.wormholeReceiverequires a Guardian-valid VAA, a configured source H-chain, andvm.emitterAddress ==the stored remote (left- padded). Destination addresses must be canonical EVM (high 12 bytes zero). A non-zeropermissionedRelayermust be the caller.- Router
fillXChainstill gates messenger + peer pool; poolfillXChainone-shotstxid, so the slow and fast VAAs cannot double-pay. dstContract/dstCalldataare not MM- signed. Destination callback still requires the callee to opt in both the source caller and the messenger. Dust partial fills of an x-chain RFQ-T can burndstTrader’s nonce; that is quote griefing, not a redirect.
2026-09-03: Magpie Wombat USDC deposit helper (Sourcify)
Immunefi program magpiexyz
($200,000, kyc: false).
Listed 2023-01-13 asset
“Main Pool USDC Deposit
Helper”
0xb68F5247f31fe28FDe0b0F7543F635a4d6EDbD7F
(BSC). Sourcify v2 exact
match, verified 2026-06-03.
Contract name
WombatPoolHelper. Extract
under /tmp/magpie/helper.
The 26 Aug 2026 add is
Primacy of Impact only. No
mainnet interaction.
Files:
contracts/wombat/ WombatPoolHelper.sol.
Checked for: deposit that stakes to the caller while pulling a stranger; withdraw that burns someone else’s receipt; native path that keeps the wrapped BNB.
Result: no user-exploitable finding. Listed Magpie Solidity is this helper; POI remains. Not submitted.
deposit/depositLPmeasurestakingTokenbalance, callwombatStaking, then_stakethe delta tomsg.sender. A donated receipt is a gift to the next depositor, not a theft.depositNativewrapsmsg.value, approves exactly that amount, and deposits from the helper.withdrawpulls from Wombat for the caller,withdrawFors the same liquidity from MasterMagpie, then burns the receipt.harvestis anyone-calls intowombatStaking.
2026-09-03: Lista leftover CDP oracles (3e120da)
Same Immunefi program listadao
($1,000,000, kyc: false). This
is the in-scope CDP oracle tree
in lista-dao/lista-dao-contracts
at 3e120da, not the already-logged
lista-new-contracts LisAster /
wNLP / Atlas / sUSDS feeds at
fa5dfa5. Official HTML / unofficial
mirror (3 Sep) lists eight oracle
rows: ResilientOracle
0xf3af…c750 plus the STONE /
solvBTC / BBTC / SolvBTC.BBN /
USDF / asUSDF / USD1 pips.
Read-only BSC eth_call only;
no state-changing txs.
Files: contracts/oracle/ ResilientOracle.sol,
BoundValidator.sol,
HelioOracle.sol,
PythOracle.sol,
API3Oracle.sol,
listed pip wrappers
(StoneOracle, SolvBtcOracle,
BBtcOracle, SolvBTCBBNOracle,
xSolvBtcOracle, UsdfOracle,
AsUsdfOracle, Usd1Oracle,
SlisBnbOracle, BnbOracle,
WeEthOracle, asBnbOracle,
sUsdxOracle), and
contracts/oracle/priceFeeds/*
(Stone, SlisBnb, AsBnb,
StableUsdt, StableAsUsdf,
sUSDX, sUSDXLiquidation,
USDXLiquidation, yUSD,
yUSDFixed, sUSD1, sUSDe,
xSolvBtc, uniBTC, mXRP,
wsrUSD, wstUSR, wNLPUSDT,
PufEth, WBETH, WstETH,
lisUSD).
Checked for: a raw AggregatorV3
main with pivot disabled so a
negative answer wraps through
uint256(answer) into a huge
CDP price; setTokenConfigs
without onlyOwner; wrapper
peek that returns
(huge, true) on a failed
inner price; composite feeds
that skip positivity or
staleness; convertToAssets /
convertSnBnbToBnb donation
inflation.
Result: no user-exploitable finding on the eight listed oracle addresses. Not submitted.
getPriceFromOraclecastsint256 answertouint256with noanswer > 0check (Venus’s original feed does check). If pivot is disabled,_getMainOraclePricereturns(mainPrice, true)with no BoundValidator. A negative aggregator answer would wrap.setTokenConfigshas no modifier but callssetTokenConfig, which isonlyOwner.- Live
getTokenConfigon ResilientOracle (BSC block ~119660895): solvBTC / USDT / USDF / USD1 / WBNB / ETH / BTC / USDe have pivot + fallback enabled. USDX / STONE / slisBNB / asUSDF / BBTC / xSolvBBN / sUSDX / yUSD / XRP are main-only (enabled [1,0,0]). - Those main-only mains are
Lista composites (or WINkLink
BBTC/BBUSD), not raw
Chainlink — except XRP
0x93a6…4fda(“XRP / USD”). Sampled Chainlink aggregators (XRP, solvBTC, USDT, ETH) haveminAnswer = 1, so the wrap cannot fire on those feeds. XRP / yUSD / sUSDX are not on the 57-asset Immunefi table. BBTC’s WINkLink pair has nominAnswer; BBtcOracle still treatsprice <= 0as(0, false). Do not file the wrap without a listed asset whose main is a raw feed that can returnanswer < 0and pivot off. - In-scope pip proxies
(EIP-1967) all
peek()successfully: STONE impl holds STONE + ResilientOracle; solvBTC / BBTC impls hold their token + ResilientOracle; USDF / asUSDF / USD1 impls hold the matching token. Live SolvBTC.BBN pip equals the solvBTC pip ($77,585.27), not the xSolvBtcPriceFeed USD print ($77,613.60). SourceSolvBTCBBNOraclewould double-count if both peeks were USD 8-dec; that path is not what the live pip returns. - Wrapper
peek()mostly returnshas=true.ResilientOracle.peekreverts on invalid, so Interaction /collateralPricenever sees a silent stale-false.SolvBtcOracle/BBtcOracleextra-checkprice <= 0.WeEthOraclerejectsprice1 < 0 || price2 < 0and 6h / 300s staleness. - Composite
latestRoundDatamocksupdatedAt = block.timestamp, so outer ResilientOracle staleness on the wrapper never fires. NestedlatestRoundDatastill enforces its own window (Stone/ETH 24h+300s, sUSD1 24h+300s, xSolv / PufETH / wstETH 6h+300s, uniBTC / wsrUSD / wstUSR 24h+300s).mXRPPriceFeedignoresupdatedAtand clamps the ratio to[1.0, 1.5]8-dec; mXRP is not on the Immunefi table. HelioOracleis owner-set. Trusted.yUSDFixedPriceFeedis hardcoded112400000(1.124e8) and is the live yUSD main; not listed.sUSDXLiquidationPriceFeed/USDXLiquidationPriceFeedare documented emergency feeds; manager0x8d38…B0c6sets the rate.lisUSDPriceFeedis fixed1e8.StableUsdtPriceFeedclamps USDT to[0.98, 1.02]8-dec (protocol risk on a deeper depeg, by design).sUSDXPriceFeed/yUSDPriceFeeduse ERC-4626convertToAssets (1e18).SlisBnbPriceFeedusesconvertSnBnbToBnboveramountToDelegate + totalDelegated, not the contract’s BNB balance, so a raw BNB donation does not inflate the rate.PythOracleusesgetPriceUnsafe; freshness is onlytimeDeltaToleranceif that adapter is a ResilientOracle source.API3Oracledivides the 18-dec dAPI by1e10to 8-dec.BoundValidatorrejectsreportedPrice == 0/anchorPrice == 0; ratios are 18-dec.- Copy-paste notes, not
filed:
asBnbOracleconstantAsBNB_TOKEN_ADDRis the slisBNB address (underprices asBNB if used as a pip; protocol-safe).sUsdxOracle.peekreads USDT, not sUSDX.
Lista CDP oracle + new-contracts oracle + VeLista lock / airdrop slices are now logged. Listed Extra Finance and Hashflow Solidity are exhausted. Not submitted.
2026-09-03: SparkLend sUSDC vault + PSM Variant1 actions (Sourcify)
Immunefi program sparklend
($5,000,000, kyc: false).
Newest money-moving adds
(15 Jul 2026): Ethereum SUSDC
proxy
0xBc65ad17c5C0a2A4D159fa5a503f4992c7B545FE,
SUSDC_IMPL
0xf943Cb8D5f06f2bBF352878ebEF3Ec5C537A20bA
(UsdcVault, Sourcify exact
match, verified 2025-04-29),
and USER_ACTIONS_PSM_VARIANT1
0xd0A61F2963622e992e6534bde4D52fd0a89F39E0
(PSMVariant1Actions,
verified 2024-09-11). Same
impl is listed on Arb / Base
/ OP / Unichain. Extract
under /tmp/spark/{usdc-vault, psm-actions}. No mainnet
interaction.
Files: src/UsdcVault.sol,
src/PSMVariant1Actions.sol.
Checked for: first-depositor
share inflation via donated
sUSDS; withdraw that burns a
stranger without allowance;
exit that transfers more
sUSDS than shares; PSM helper
that deposits a delta to the
caller after a stranger’s
pull.
Result: no user-exploitable finding. Not submitted.
- Vault shares are minted 1:1
with sUSDS received from
susds.deposit/mint, not from atotalAssets/totalSupplyratio. Donated USDC or sUSDS does not mint shares.exittransfers exactlysharesof sUSDS after_burn. deposit/mintpull USDC frommsg.sender,sellGemthrough the immutable PSM wrapper, and creditreceiver. PSMtin >= WADhalt-closes sells.withdraw/redeempull sUSDS,_burnthe owner (allowance if not sender), thenbuyGemtoreceiver.tout == type(uint256).maxhalt-closes buys. Rounding overestimates PSM fees and can leave USDS dust (documented).- UUPS
_authorizeUpgradeisauth(wards). - PSMVariant1Actions
swapAndDepositmeasures the DAI delta aftersellGemand deposits that toreceiver.withdrawAndSwap/redeemAndSwapspendmsg.sender’s 4626 allowance. Leftover DAI dust is documented.
Remaining SparkLend after this
slice: ALM controllers (logged
below at ce5cbd9) plus
other-chain vaults / PSM3 and
Robinhood / X Layer 13 Jul
rows. Not submitted.
2026-09-03: Twyne Aave V3 operators (Sourcify)
Immunefi program twyne
($50,000, kyc: false). GitHub
is private from this VM. Vault /
wrapper / EVC / factory rows
are still Sourcify 404. The
three Aave V3 operators
(listed June 2026) are exact
Sourcify matches
(verified 2026-03-06):
Teleport 0x868a…bd78,
Leverage 0x4519…4A4C,
Deleverage 0x229f…5e91.
Extract under
/tmp/twyne-sourcify. No
state-changing txs.
Files:
src/operators/AaveV3{Leverage, Deleverage,Teleport}Operator.sol.
Checked for: a stranger
flashloan that borrows from
someone else’s vault; swap
multicall that keeps the
Morpho loan; teleport that
pulls another user’s aTokens
without being the borrower.
Result: no user-exploitable finding. Not submitted.
executeLeverage/executeDeleverage/executeTeleportrequireisCollateralVaultandborrower() == _msgSender().onMorphoFlashLoanis Morpho-only. Morpho only callbacks the initiator, so encoded args stay the caller’s.- Leverage pulls the
borrower’s underlying /
aTokens via Permit2, supplies
Aave,
depositATokensto the vault, then EVC-batchskim+borrowon behalf of that borrower. A hostileswapDatacan only strand this tx (Morpho repay reverts). Leftover aTokens on the operator are deposited to the current vault (donation). - Deleverage swaps the
flashloaned underlying to
the target,
repays the vault’s Aave debt, checks<= maxDebt, thenredeemUnderlyingon behalf of the borrower. Dust of target / underlying is sent to the borrower. - Teleport
repays the borrower’s existing Aave debt, Permit2-pulls their aTokens, deposits the wrapper into their vault, and borrows the flashloan amount back.debtAmountis clamped to the user’s live variable-debt balance.
Remaining Twyne: vaults, wrappers, EVC, factories (still Sourcify 404). Not submitted.
2026-09-03: Yearn stYFI February core (69e262e)
Immunefi program yearnfinance
($200,000, kyc: false). July
YBC / funding / bonus leftover
already logged. This pass is
the 15 Feb 2026 stYFI core:
StakedYFI 0x42b2…c016,
liquid-locker depositors
(StakeDAO / 1up / Cove), and
the staking reward distributor
pattern. Official tree
yearn/stYFI
at 69e262e. No mainnet
interaction.
Files: contracts/{StakedYFI, LiquidLockerDepositor, StakingRewardDistributor}.vy.
Checked for: withdraw that
pays a stream that is still
locked; redeem of another
account without allowance;
reward claim that pays the
subject instead of the
claimer; first-depositor
inflation (1:1 vault).
Result: no user-exploitable finding. Not submitted.
- StakedYFI is 1:1.
deposit/mintpull frommsg.senderand mint to_receiver.unstakeburns the caller and starts a 14-day stream.withdraw/redeemspend allowance if_owner != msg.senderand only transfer the streamed (or hook-instant) amount.sweepcannot takeasset. - LiquidLockerDepositor is
1:scale. Transfers of shares are not implemented (onlyapprove).unstakeismsg.sender._redeemenforces the same stream math and allowance. - StakingRewardDistributor
claim(_account)requiresclaimers[msg.sender]and paysmsg.sender(the already-logged RewardClaimer pattern).
Remaining Yearn stYFI Feb: stYFIx / middleware / main RewardDistributor (this pass below). Not submitted.
2026-09-03: Yearn stYFI leftover stYFIx / middleware / main distributor (Sourcify)
Same Immunefi program
yearnfinance ($200,000,
kyc: false). February rows
not in the prior StakedYFI /
LL / StakingRewardDistributor
pass: stYFIx
0x9C42…9d79
(DelegatedStakedYFI,
Sourcify match, verified
2026-02-07), Staking
Middleware
0xc32b…4C020
(verified 2026-02-18),
Reward Claimer
0xA824…5e50
(verified 2026-02-22), and
stYFI Main Reward Distributor
0xd319…5934
(RewardDistributor,
verified 2026-02-18). Extract
under /tmp/yearn/{styfix, styfi_mw,styfi_claimer, styfi_maindist}. Official
tree still 69e262e. No
mainnet interaction.
Files:
contracts/{DelegatedStakedYFI, StakingMiddleware,RewardClaimer, RewardDistributor}.vy.
Checked for: stYFIx withdraw
that pulls stYFI without the
instant-whitelist assumption
failing closed; middleware
that lets a stranger set
instant_withdrawal; main
distributor claim by a
non-component; RewardClaimer
that claims a stranger’s
components into the caller.
Result: no user-exploitable finding. Not submitted.
- DelegatedStakedYFI is 1:1
over YFI and deposits into
StakedYFI.
unstakeburns the caller andstaking.withdraws to itself (needs the stYFI instant-withdrawal whitelist). User assets then stream 14 days.sweepcannot takeassetorstaking. - StakingMiddleware hooks
require
msg.sender == upstream. Instant whitelist and transfer blacklist are management. - RewardClaimer
claimcalls each componentclaim(msg.sender)and forwards tokens to_recipient. - RewardDistributor
claimisnonreentrantand only paysmsg.senderwhen that address is a packed component whose synced epoch is behind current.
Remaining Yearn stYFI Feb: veYFI / stYFIx / LL reward distributors and Vault V3.1.0 (23 Jun) if wanted. Not submitted.
2026-09-03: Balancer V3 Router (Sourcify)
Immunefi program balancer
($1,000,000, kyc: false).
23 Jun 2026 add: V3 Router
(V2) 0xAE56…8Ea2. Sourcify
v2 exact match, verified
2025-04-29. Contract name
Router. Extract under
/tmp/balancer/router. No
mainnet interaction.
Files: contracts/{Router, RouterCommon,SenderGuard, VaultGuard}.sol.
Checked for: a hook that
pulls Permit2 from a
stranger; remove-liquidity
that sends tokens to the
caller instead of
params.sender; swap that
skips onlyVault; query
path that mutates balances.
Result: no user-exploitable finding. Not submitted.
- External API functions
saveSender(msg.sender)then_vault.unlockinto the matching hook. Hooks areonlyVault+nonReentrant. addLiquidityHook/initializeHookpullparams.sendervia Permit2 (or wrapmsg.valuewhenwethIsEth) andsettlethe Vault. BPT is mintedto: params.sender.removeLiquidityHookburns BPTfrom: params.senderand_vault.sendTo/ unwraps WETH to that sender. Recovery hook is the same.swapSingleTokenHooktakestokenInfromparams.senderand sendstokenOutto them. Deadline isblock.timestamp.- Queries are separate
query*entrypoints; they do not settle.
Remaining Balancer 23 Jun rows: ProtocolFeeController and the V3 factory / oracle factory set (CompositeLiquidityRouter logged below). Not submitted.
2026-09-03: Yearn stYFI leftover LL redemption / LL+veYFI distributors (69e262e)
Same Immunefi program
yearnfinance ($200,000,
kyc: false). Official tree
yearn/stYFI
at 69e262e. February rows
not in the StakedYFI /
depositor / stYFIx /
StakingMiddleware pass:
LiquidLockerMiddleware,
LiquidLockerRedemption
(in-tree; no separate
Immunefi row),
LiquidLockerRewardDistributor
0x7eFc…A000, and
VotingEscrowRewardDistributor
(veYFI) 0x2548…e884. No
mainnet interaction.
Files: contracts/{ LiquidLockerMiddleware, LiquidLockerRedemption, LiquidLockerRewardDistributor, VotingEscrowRewardDistributor}.vy.
Checked for: a stranger
hook that credits another
account’s LL weight;
redeem that pays more YFI
than the scale allows;
exchange that underflows
used into extra LL;
reward claim that pays the
subject instead of the
claimer.
Result: no user-exploitable finding. Not submitted.
- LiquidLockerMiddleware
forwards
on_stake/on_unstaketo downstream- aggregator. Both require
msg.sender == upstream.
- aggregator. Both require
redeemis enabled +epoch < lock. It incrementsusedby_ll_amount // scale(must be > 0 and<= capacity), pulls LL tokens from the caller, and pays YFI minus a decaying fee (MAX_FEE10% over 104 epochs). Dust belowscalestays with the LL recipient. Fee YFI remains in the contract;sweepis management.exchangedecrementsused(Vyper underflow reverts), pulls YFI, and paysyfi * scaleLL tokens from inventory.- LiquidLockerRewardDistributor
and VotingEscrowRewardDistributor
claim(_account)requireclaimers[msg.sender]and paymsg.sender. Permissionlessreclaimonly moves expired rewards (bounty +reclaim_recipient).
Remaining Yearn: Vault V3.1.0 (23 Jun) if wanted. Not submitted.
2026-09-03: TermMax TMX token (Sourcify BSC)
Same Immunefi program
termstructurelabs ($80,000,
kyc: false). 24 Aug 2026
rows: TMX Ethereum and BNB
0x3c2F…0039. Ethereum
Sourcify 404. BSC Sourcify
exact match, flattened
MyOFT.sol (Hardhat 2.28).
Extract under
/tmp/tmx-sourcify/bsc. V2
market / vault / router
already logged. No
state-changing txs.
Files: contracts/MyOFT.sol
(LayerZero OFT v3 flatten).
Checked for: a public mint
after deploy; _credit to
an attacker; constructor
mint on BSC.
Result: no user-exploitable finding. Not submitted.
MyOFTis stock LayerZeroOFT._debitburnsamountSentLD;_creditmints to_to(address(0)remaps to0xdead).- Constructor
Ownable(_delegate). It mints1e9 etheronly whenblock.chainid == 1. The BSC bytecode therefore does not premint. - No extra mint / burn entrypoints beyond OFT send/receive.
Remaining TermMax adapters (Kyber, OKX, Pancake, Kodiak, vault helpers) are still lower-priority copies of the already-logged approve-and-call pattern. Not submitted.
2026-09-03: Balancer V3 CompositeLiquidityRouter (Sourcify)
Immunefi program balancer
($1,000,000, kyc: false).
23 Jun 2026 row
CompositeLiquidityRouter (V2)
0xb21A…5c8A. Sourcify exact
match. Extract under
/tmp/balancer-clr. The V3
Router row is already logged.
No mainnet interaction.
Files:
contracts/CompositeLiquidityRouter.sol
(hooks + wrap helpers).
Checked for: a hook that
mints BPT to the router; wrap
that pulls a stranger;
unwrap that sends tokens to
msg.sender instead of
params.sender.
Result: no user-exploitable finding. Not submitted.
- External add/remove
functions
saveSender (msg.sender)and_vault.unlockintoonlyVaulthooks.params.senderis that caller. - Unbalanced / proportional
add send BPT
to: params.sender. Tokens are_takeTokenInfrom that sender (Permit2 / ETH wrap). - Proportional remove burns
BPT
from: params.senderand_sendTokenOutto them after optional buffer unwrap.minAmountsOutis checked per token. - Buffer wrap/unwrap is the
Vault’s
erc4626BufferWrapOrUnwrap. Uninitialized buffers revert. Query paths are static-call only.
Remaining Balancer 23 Jun rows: ProtocolFeeController (this pass below) and the V3 factory / oracle factory set. Not submitted.
2026-09-03: Balancer ProtocolFeeController (Sourcify)
Immunefi program balancer
($1,000,000, kyc: false).
23 Jun 2026 leftover after
Router + CompositeLiquidityRouter:
ProtocolFeeController (V2)
0x212F…C2879. Sourcify
exact match, verified
2025-05-21. Extract under
/tmp/balancer/pfc. No
mainnet interaction.
Files:
contracts/{ProtocolFeeController, VaultGuard}.sol.
Checked for: fee collect /
withdraw that pays a
non-creator; split math that
credits the caller; migratePool
that overwrites live fee
balances.
Result: no user-exploitable finding. Not submitted.
collectAggregateFeesis permissionless and only pulls the Vault’s aggregate cut into this contract (onlyVaulthook).- Protocol withdraw is
authenticate. Creator withdraw with a recipient isonlyPoolCreator; the public overload pays_getPoolCreator(pool). - Split math reconstructs the pre-aggregate notional then assigns protocol first; underflow on a rounding inversion fail-closes.
migratePoolcopies percentages from the current Vault controller and cannot run when this contract is already the controller. Fee balances are not copied.
Remaining Balancer 23 Jun rows: V3 factory / oracle factory set (FixedPriceLBPoolFactory, Gyro2CLPPoolFactory, StableLPOracleFactory, LBPoolFactory this pass below, Stable / Weighted / ReClamm / StableSurge factories, EclpLPOracleFactory, GyroECLPPoolFactory). Not submitted.
2026-09-03: Spark ALM controller (ce5cbd9)
Immunefi program sparklend
($5,000,000, kyc: false).
Listed GitHub rows
marsfoundation/spark-alm-controller
MainnetController.sol,
ForeignController.sol,
ALMProxy.sol,
RateLimitHelpers.sol, plus
live ALM_CONTROLLER /
ALM_PROXY /
ALM_RATE_LIMITS on
Ethereum / Base / OP / Arb /
Avalanche / Unichain /
Robinhood / X Layer. Local
clone /tmp/spark-alm at
ce5cbd9. No mainnet
interaction.
Files:
src/{MainnetController,ForeignController,ALMProxy,ALMProxyFreezable,RateLimits,RateLimitHelpers,OTCBuffer,WEETHModule}.sol,
src/libraries/{CCTPLib,ERC4626Lib,LayerZeroLib,PSMLib,AaveLib,ApproveLib}.sol.
Checked for: a relayer
transferAsset to an
unlisted destination; CCTP
mintRecipient taken from
the caller; 4626 deposit that
mints to the relayer; LayerZero
to override; OTC claim that
unlocks a later send without
returning value; take that
pulls a user Spark vault;
farm stake to an arbitrary
farm without a rate-limit
key.
Result: no user-exploitable finding. Not submitted.
ALMProxy.doCall/doCallWithValue/doDelegateCallareCONTROLLERonly.RateLimitsdecrease / increase isCONTROLLERonly. Unset keys revert (zero-maxAmount).transferAssetburnsLIMIT_ASSET_TRANSFER(asset, destination)before the proxytransfer. Same pattern onForeignController.- CCTP uses
mintRecipients[domain](admin-set). Zero recipient reverts. Dual global + domain rate limits. - 4626 deposit mints shares
to the proxy, requires
minSharesOutandassets/shares <= maxExchangeRates[token]. Unset max rate is 0, so a deposit of assets > 0 reverts. Withdraw/redeem restore the deposit key using assets received. - LayerZero
toislayerZeroRecipients[eid]. Comment on the wrapper: keep the rate-limit key at zero until OFTs are integration-tested.minAmountLDis filled fromquoteOFT. - OTC first send is allowed
because storage
sent18is still 0 at the ready check. Later sends needclaimed + recharge >= sent * maxSlippage. Assets and the exchange buffer are admin whitelists. Compromised relayer + junk whitelist is their documented OTC trust assumption. - Farm / Maple / Superstate
/ Spark-vault
take/ wstETH / weETH / Ethena prepare-approve are rate-limited (or destination-keyed).setDelegatedSigneris relayer-callable; SECURITY.md accepts Ethena’s off-chain checks. Dai↔USDS is 1:1 inside the proxy (no rate limit; accepted parity assumption). FREEZERcanremoveRelayer. Threat model treats the relayer as compromisable and bounds loss by rate limits. Users do not call these entrypoints.
Remaining SparkLend after this slice: SparkVault V2 (logged below) plus PSM3 / treasury controllers and the 13 Jul Robinhood / X Layer rows. Not submitted.
2026-09-03: SparkVault V2 (51c6d7a)
Immunefi program sparklend
($5,000,000, kyc: false).
Listed GitHub row
sparkdotfi/spark-vaults-v2
src/SparkVault.sol
(“Spark Savings V2”). Local
clone /tmp/spark-vaults-v2
at 51c6d7a. No mainnet
interaction.
Files: src/SparkVault.sol
(sUSDS-style pot).
Checked for: first-depositor
inflation via a dust mint
plus a raw asset donation;
take by a non-taker;
redeem that pays
msg.sender instead of
receiver; chi/VSR overflow
that mints extra shares;
taker depositing then
redeeming other users’
liquidity.
Result: no user-exploitable finding. Not submitted.
- PPS is
chi, notbalance / supply. A raw donation does not changeconvertToShares. Initialchi == RAYso the first deposit is 1:1. takeisTAKER_ROLEonly and just_pushAssets. Liquidity can go belowtotalAssets()(assetsOutstanding). That is the ALM model already reviewed above;maxRedeem/maxWithdraware capped by the token balance.- Deposit/mint pull
msg.senderand mint toreceiver(not 0 / self). Taker cannot be sender or receiver. Redeem / withdraw burnowner(allowance if sender ≠ owner) and payreceiver. dripis the Maker pot_rpow. VSR is bounded to[RAY, MAX_VSR](100% APY). UUPSinitializeis initializer-gated; impl constructor disables initializers. Upgrade is admin-only.
Remaining SparkLend after this slice: PSM3 (logged later this pass) plus treasury controllers and the 13 Jul Robinhood / X Layer rows. Not submitted.
2026-09-03: Yearn Vault V3.1.0 (Sourcify)
Immunefi program
yearnfinance ($200,000,
kyc: false). 23 Jun 2026
rows: Vault V3.1.0
0xdD3F…7824 (Sourcify
match, Vyper
YearnV3Vault, verified
2026-06-19), Tokenized
Strategy V3.1.0
0x310f…1e76 (exact
match, TokenizedStrategy),
Vault V3.1.0 Factory
0x310a…bcAC (match,
YearnVaultFactory).
Extracts under
/tmp/yearn/{vault310,strat310,vfact310}.
No mainnet interaction.
Files:
YearnV3Vault.vy,
src/TokenizedStrategy.sol,
YearnVaultFactory.vy.
Checked for: first-depositor
inflation via a 1-wei
deposit plus a raw asset
donation; redeem that pays
msg.sender instead of
receiver / burns a
stranger; process_report
that mints unlocked profit;
factory fee unpack that
points fees at the caller;
strategy MINIMUM_SUPPLY
bypass that lets a dust
depositor steal a later
deposit.
Result: no user-exploitable finding. Not submitted.
- Vault
total_assetsistotal_idle + total_debt, not the ERC20 balance. A raw donation does not change PPS untilprocess_report(self)(role-gated) accrues it into idle. Empty supply mints 1:1; `total_supply0
andtotal_assets == 0mints 0 shares (cannot mint zero`). - Deposit pulls
msg.senderand mints torecipient(cannot beaddress(0)orself). Redeem burnsowner(allowance if sender ≠ owner) and paysreceiver. Losses from the withdraw queue are capped bymax_loss. - Profit is locked as
shares minted to the
vault and unlocked over
profit_max_unlock_time. Fees go to the accountant and the factoryprotocol_fee_configrecipient. - Factory
deploy_new_vaultis create2 +initialize. Protocol fee bps ≤ 5000. Custom vault fees still pay the default recipient. Governance is two-step. - TokenizedStrategy 3.1.0
simulates constant
accrual for
convertTo*/totalAssets.MINIMUM_SUPPLY(1e3) confiscates profit into supply while under the floor. Deposit transfers first, thendeployFunds, then mints. WithdrawfreeFundsthen paysreceiver.report/tendare keeper-only.
Remaining Yearn listed Solidity after this slice: none of the 23 Jun V3.1.0 trio. Older 3.0.4 vault / factory rows were already in the table and were not re-read here. Not submitted.
2026-09-03: Balancer V3 LBPoolFactory (Sourcify)
Immunefi program balancer
($1,000,000, kyc: false).
23 Jun 2026 leftover factory
row: V3 LBPoolFactory (V4)
0x6642…069A. Sourcify
exact match, verified
2026-05-16. Extract under
/tmp/balancer/lb_factory.
WeightedPoolFactory
0x3326…1D99 and
StablePoolFactory
0x4eFc…3228 are Sourcify
404 on Ethereum / Base /
Arbitrum / Optimism /
Polygon from this VM. No
mainnet interaction.
Files: contracts/lbp/{LBPoolFactory, BaseLBPFactory,LBPValidation, LBPool,LBPCommon}.sol,
@balancer-labs/v3-pool-utils/contracts/BasePoolFactory.sol.
Checked for: create that
registers attacker bytecode
as a Balancer pool; hook
set to a stranger; add
liquidity by a non-owner
through an untrusted router;
remove during the sale.
Result: no user-exploitable finding. Not submitted.
createdeploys the factory’sLBPoolcreationCode via create2 (salt bindsmsg.sender+ chainid) and registers that pool as its own hook. Tokens are the two LBP tokens, STANDARD, sorted. Unbalanced liquidity is disabled.onRegisterrequirespool == address(this)and two STANDARD tokens.onBeforeAddLiquidityrequires the trusted router andgetSender() == owner(), andonlyBeforeSale.onBeforeInitializeis owner-via-getSenderandonlyBeforeSale. Seedless LBPs reject a non-zero reserve amount. Init frontrun is the documented factory DoS, not a steal.onBeforeRemoveLiquidityreverts while the sale is live.
Remaining Balancer 23 Jun factories: ReClamm + LP oracle factories this pass below; FixedPrice LBP, Gyro2CLP, GyroECLP, StableSurge, plus Weighted / Stable (Sourcify 404). Not submitted.
2026-09-03: Balancer ReClamm factory + LP oracle factories (Sourcify)
Immunefi program balancer
($1,000,000, kyc: false).
23 Jun leftover:
ReClammPoolFactory (V3)
0x3ccD…ab7FF (exact match,
verified 2026-05-14),
StableLPOracleFactory (V2)
0x765c…A93c (2026-02-27),
WeightedLPOracleFactory (V2)
0x4b4b…85C6 (2026-04-04),
EclpLPOracleFactory
0x301E…54B (2026-04-04).
Extract under
/tmp/balancer/{reclamm, stable_oracle,weighted_oracle, eclp_oracle}. FixedPrice LBP
/ Gyro2CLP / GyroECLP /
StableSurge factories are
still Sourcify 404. No
mainnet interaction.
Files:
contracts/{ReClammPoolFactory, lib/ReClammPoolFactoryLib, ReClammPool}.sol,
contracts/{LPOracleFactoryBase, LPOracleBase,StableLPOracle, WeightedLPOracle,EclpLPOracle, *Factory}.sol.
Checked for: factory create
that registers attacker
bytecode; ReClamm hook used
by a stranger pool; 1-token
ReClamm that skips Vault
min-token checks; factory
oracle that overwrites a
canonical feed set; TVL that
credits a transient balance
when the vault is locked.
Result: no user-exploitable finding. Not submitted.
- ReClamm
createdeploys the factory’sReClammPoolcreationCode (helper vault must match) and registers that pool as its own hook. Donation is off; unbalanced liquidity is disabled.onRegisterrequirespool == address(this), two tokens, and those liquidity flags. Factorytokens.length <= 2without an explicit min still fail-closes atonRegister. - Init / add / remove hooks
are
onlyVaultand scale virtual balances with supply. Price-range params are bounded inReClammPoolFactoryLib. - Oracle factories deploy a
new oracle per
(pool, flags, feeds)id. A junk feed list cannot replace an existing id.latestRoundDatais TVL / BPT supply; sequencer uptime is checked when a feed is configured.shouldRevertIfVaultUnlockedis an integrator flag. Feeds are caller-chosen;isOracleFromFactoryis not a price-feed whitelist.
Remaining Balancer 23 Jun factories: FixedPrice LBP, Gyro2CLP, GyroECLP, StableSurge, Weighted / Stable (Sourcify 404). Not submitted.
2026-09-03: Balancer leftover Sourcify-404 factories (official monorepo)
Immunefi program balancer
($1,000,000, kyc: false).
23 Jun 2026 rows still open
after PFC / Router / CLR /
LBPool / ReClamm / LP
oracles: FixedPriceLBPoolFactory
0xeb1a…8758, Gyro2CLP
0x8902…ECC6, GyroECLP
0x04d5…69d1, StableSurge
0x187a…A6Ac, V3 Stable
0x4eFc…3228, V3 Weighted
0x3326…1D99. Sourcify v2
and repo.sourcify.dev
full/partial match are 404
from this VM. create()
bodies were read from
official
balancer/balancer-v3-monorepo
main raw files (3 Sep;
same BasePoolFactory
pattern as the Sourcify-exact
LBPool / ReClamm factories).
No state-changing txs.
Files (GitHub main, not
bytecode-matched):
FixedPriceLBPoolFactory.sol,
Gyro2CLPPoolFactory.sol,
GyroECLPPoolFactory.sol,
StablePoolFactory.sol,
WeightedPoolFactory.sol,
StableSurgePoolFactory.sol,
BasePoolFactory.sol.
Checked for: a create that registers a pool the factory did not deploy; CREATE2 salt that omits the sender so a stranger can collide; a hook/role account the caller cannot set; StableSurge registering a stranger hook.
Result: no user-exploitable
finding. Not submitted.
Bytecode match is unverified
here; do not file against
these addresses until
Sourcify/Etherscan confirms
the same create().
- Every factory
_creates (CREATE2 saltkeccak(msg.sender, chainid, salt)) thenregisterPools in the same transaction.disable()isauthenticate. - Gyro factories revert
unless
tokens.length == 2. Stable / StableSurge cap atStableMath.MAX_STABLE_TOKENS. Weighted computesminTokenBalancesviaMinTokenBalanceLib. - FixedPrice LBP requires
projectTokenRate != 0andblockProjectTokenSwapsIn(buy-only), then uses the same_registerLBPpath (pool is the hook;poolCreatoris a create argument). - StableSurge hardcodes
the factory’s
StableSurgeHook. Other factories takepoolHooksContract/roleAccountsas documented create args.protocolFeeExemptis always false.
23 Jun Balancer leftover is exhausted. Older Jan 2025 BatchRouter / BufferRouter rows are unchanged. Not submitted.
2026-09-03: Spark PSM3 (2b1a72a)
Immunefi program sparklend
($5,000,000, kyc: false).
Listed GitHub row
marsfoundation/spark-psm
src/PSM3.sol, plus live
PSM3 on Base
0x1601…47E, Optimism
0xe0F9…7F62, Arbitrum
0x2B05…7266, Unichain
0x7b42…312f. Local clone
/tmp/spark-psm at
2b1a72a. Live
totalShares() was read
via eth_call only (Base
~3.41e24, OP ~1.57e24, Arb
~4.63e25). No state-changing
txs.
Files: src/PSM3.sol,
deploy/PSM3Deploy.sol,
test/unit/{InflationAttack,DoSAttack}.t.sol.
Checked for: first-depositor
inflation via a 1-wei share
plus a USDC donation;
deposit that mints 0 shares
after a pre-seed donation
(totalShares == 0 and
totalAssets > 0); swap
that pays a stranger;
withdraw that burns another
user’s shares; pocket drain
by a non-owner.
Result: no submittable finding. Not submitted.
- README marks both attacks
CRITICAL and requires
a deploy-time seed of at
least 1e18 shares.
PSM3Deploydeposits 1e6 USDC (1e18 value) toaddress(0)so those shares cannot withdraw. In-repo tests show the unseeded 1-wei + 10m donation path and the pre-seed 0-share DoS. - Live listed PSM3s already have ≫ 1e18 shares. The documented seed mitigation is in place. Do not file a test-suite attack against a seeded pool.
- Swaps are 1:1 USDC↔USDS
or sUSDS via the
immutable rate provider.
minAmountOut/maxAmountInbind the caller. Receiver cannot be 0. - Deposit mints to
receiverthen pullsmsg.sender. Withdraw burnsmsg.senderthen pushes toreceiver. USDC custody ispocket(Base live pocket is the PSM itself).setPocketis owner-only and moves the full USDC balance.
Remaining SparkLend: treasury / cap automator / ratio oracles (this pass below) and the 13 Jul Robinhood / X Layer rows. Not submitted.
2026-09-03: Spark CapAutomator + ratio oracles + CollectorController (Sourcify)
Immunefi program sparklend
($5,000,000, kyc: false).
5 Mar 2026 leftover:
CapAutomator v1.1.0
0x4C13…F2eE (exact match,
verified 2026-03-09),
cbBTC/weETH/rETH ratio
oracles (0x64B1…cCBC,
0x4C80…b7E4,
0xd0B3…8d06), plus
Ethereum TREASURY_CONTROLLER
0x92eF…8F7a (CollectorController,
verified 2025-06-23). Treasury
proxy rows are
InitializableAdminUpgradeabilityProxy
only. Extract under
/tmp/spark-leftover/{cap_auto, cbbtc_oracle,weeth_oracle, reth_oracle,treasury_ctrl}.
No mainnet interaction.
Files: src/CapAutomator.sol,
src/{CBBTC,WEETH,RETH}RatioOracle.sol,
CollectorController.sol.
Checked for: a public exec
that raises caps past max;
same-block cap pump; ratio
oracle that returns 1e18 on
a dead feed; controller
transfer by a non-owner.
Result: no user-exploitable finding. Not submitted.
- Cap config is
DEFAULT_ADMIN_ROLE.exec/execSupply/execBorrowareUPDATE_ROLE. New cap ismin(usage + gap, max). Increases respectincreaseCooldown; decreases do not. A second update in the same block returns the current cap. - Ratio oracles return 0 when a feed is non-positive (or the LST rate is 0). Kill-switch consumers treat that as a halt, not a peg. Feeds are immutable.
- CollectorController
approve/transferareonlyOwnerand forward to the collector proxy.
Remaining SparkLend: the 13 Jul Robinhood / X Layer executor / receiver rows (ALM + Vault V2 on those chains already logged). Not submitted.
2026-09-03: Yearn leftover yYB token / operator / locker / staker / distributor (Sourcify)
Same Immunefi program
yearnfinance ($200,000,
kyc: false). 5 Jan 2026
rows: yYB Token
0x2222…9D6 (exact
YToken), Operator
0x1111…4af9 (exact),
Locker 0x0000…6A (exact),
Boosted Staker
0x5D2e…AD91 (match,
YearnBoostedStaker),
Reward Distributor
0x1d02…746 (match,
SingleTokenRewardDistributor).
Extract under
/tmp/yearn-yyb. Vault
V3.1.0 + stYFI leftovers
already logged. No
state-changing txs.
Files: src/{YToken, Operator,Locker}.sol,
YearnBoostedStaker.sol,
SingleTokenRewardDistributor.sol.
Checked for: a stranger
YToken.mint that skips
the underlying transfer;
Locker.execute that
anyone can call;
nftTransferCallback
that mints without a lock
increase; distributor
claimFor that pays the
claimer; staker
stakeAsMaxWeighted that
is permissionless.
Result: no user-exploitable finding. Not submitted.
YToken.mintpullstokento the locker andOperator.lockunlessmsg.senderis the locker operator (NFT wrap path).sweep/setLockerare owner or operator.Locker.execute/safeExecuteare owner or operator. Escrowincrease_amountis blocked unless the operator calls.onERC721Receivedrequires the escrow NFT and forwards tonftTransferCallback.- Operator
nftTransferCallbackis locker-only and mints the lock-amount delta.lockisonlyLockers(yToken is authorized at construct). Gauge / DAO votes are role-gated. - Staker
stake/unstakeuse even amounts and checkpoints.stakeAsMaxWeightedisapprovedWeightedStaker.stakeFor/unstakeForneedapprovedCaller. - Distributor
claim/claimWithRangepay the account (or its configured recipient).claimForneedsapprovedClaimer. Skipping weeks in a ranged claim is a documented self-lockout.pushRewardsonly moves a past week with zero adjusted global weight.
Yearn 23 Jun + Jan 2026 yYB leftovers are exhausted. Auction / splitter / 3.0.4 factory rows (this pass below). Not submitted.
2026-09-03: Yearn AuctionFactory leftover (Sourcify)
Immunefi program
yearnfinance ($200,000,
kyc: false). 29 Oct 2025
row: Auction Factory
0xbC58…7526. Sourcify
exact match, verified
2025-11-26, AuctionFactory
v1.0.3. Extract under
/tmp/yearn-leftover/auction_fact.
Splitter Factory
0xe28f…614D is a flattened
Vyper match; 3.0.4 Vault
Factory 0x770D…812F is
YearnVaultFactory.vy
(same pattern as the
already-logged 3.1.0
factory). No mainnet
interaction.
Files:
src/Auctions/{AuctionFactory, Auction}.sol.
Checked for: factory
create that initializes
to an attacker receiver;
take that sends from
without pulling want;
CoW isValidSignature
that accepts a stranger
receiver; kick that
restarts a live auction.
Result: no user-exploitable finding. Not submitted.
- Factory clones the
immutable
Auctionoriginal via create2 andinitializes want / receiver / governance / starting price. takeisnonReentrant. It transfers_fromto the taker, optional callback, thensafeTransferFromwantfrommsg.sendertoreceiver. A failed pay reverts the take.- CoW signature requires
receiver == receiver,buyToken == want,buyAmount >= needed,feeAmount == 0. kickneeds an enabled auction pastAUCTION_LENGTHand a non-zero balance.enable/disable/sweep/forceKickare governance.
Remaining Yearn: splitter factory flatten and 3.0.4 vault factory (this pass below). Not submitted.
2026-09-03: Yearn splitter factory + 3.0.4 Vault Factory leftover (Sourcify)
Immunefi program
yearnfinance ($200,000,
kyc: false). 29 Oct 2025
rows: Splitter Factory
0xe28f…614D and Vault
Factory 3.0.4
0x770D…812F. Factory
Sourcify exact match
(verified 2025-01-14,
Vyper 0.3.7 flatten).
ORIGINAL splitter
0x8e8e…6f69 Sourcify
exact match (verified
2026-02-01). 3.0.4 factory
is YearnVaultFactory.vy
API 3.0.4, same pattern
as the already-logged
3.1.0 factory. Extract
under
/tmp/yearn-leftover/{splitter_fact,splitter_impl,vault304_fact}.
No mainnet interaction.
Files:
Vyper_contract.vy
(factory + impl),
YearnVaultFactory.vy.
Checked for: factory
newSplitter that leaves
the clone uninitialized
or points ORIGINAL at
an attacker impl;
initialize that can be
replayed; unwrapVault
that redeems to a
stranger; distribute*
that pays an attacker
cut; fundAuction that
anyone can drain; set*
that a non-manager /
non-splitee can flip;
3.0.4 deploy_new_vault
that skips initialize or
lets a stranger take
protocol fees.
Result: no user-exploitable finding. Not submitted.
- Factory
create_minimal_proxy_tothe immutableORIGINAL(0x8e8e…6f69) andinitializes in the same tx. Permissionless deploy is intended. - Impl
initializeis one-shot (manager == 0). Manager, recipient, and splitee must be non-zero; split must be non-zero. DefaultmaxLossis 1. unwrapVault(s)are manager or splitee. Redeem sends assets toselfwith storedmaxLoss.distribute*are manager or splitee. Manager cut isbalance * split / 10_000; remainder to splitee.split == 10_000pays the manager recipient only.fundAuction(s)are manager or splitee and transfer to the storedauction.auctionstarts unset; sending to0is a trusted-role burn.setMangerRecipient/setSplit/setMaxLoss/setAuctionare manager-only.setSpliteeis current-splitee-only.setSplithas noMAX_BPScap (manager can brickdistributewithunsafe_mul/unsafe_sub); trusted role, not a user finding.- 3.0.4 factory
deploy_new_vaultis create2 (msg.sender, asset, name, symbol) +initialize. Protocol fee bps ≤ 5000. Custom vault fees still pay the default recipient. Governance is two-step.shutdown_factoryis one-way.
Yearn 29 Oct 2025 leftover rows (AuctionFactory + splitter factory + 3.0.4 factory) are exhausted. Not submitted.
2026-09-03: GammaSwap vault May 2026 leftover + PositionManager
Immunefi program gammaswap
($40,000, kyc: false,
Primacy of Rules, critical
only, PoC required). 10 May
2026 leftover: VaultGammaPool
0xbd6e…311c (live factory
protocol 3 impl),
VaultBorrow / Repay /
Rebalance / ExternalRebalance
/ Liquidation / ExternalLiq
/ BatchLiq / Short strategies,
CPMMMath, VaultBatchLiquidation
(listed; pool no-ops batch +
external liquidate), and
PositionManager proxy
0x3b72…98b0 → impl
0x3Cc1…fB37 (Sourcify
exact PositionManagerExternalWithStaking).
Sources: @gammaswap/v1-implementations@1.2.18
/tmp/gammaswap-impl e71dd91,
v1-core /tmp/gammaswap-core
2312d0e, periphery Sourcify
/tmp/gammaswap-pm (repo
v1-periphery 6774367).
Live factory
0xFD51…c20B owner
0x937f…C3Fb.
getLoanObserver(1..15) all
unset (zero addr, refType 0).
Known issues list empty.
No Arbitrum state-changing
txs from this VM.
Files: contracts/pools/VaultGammaPool.sol,
strategies/vault/**,
libraries/cpmm/CPMMMath.sol,
v1-core AbstractLoanObserverStore
LibStorage.createLoan,PositionManager{,WithStaking,ExternalWithStaking}.sol,base/{Transfers,GammaPoolERC721,GammaPoolQueryableLoans}.sol.
Checked for: anyone opening a
refType-3 interest-free loan;
reserved-LP global counter
theft; reserved borrowed
invariant desync on repay;
share-price inflation from
reserved debt; no-op
liquidation freezing funds;
PositionManager callback
paying a stranger; public
clearToken / unwrapWETH
stealing user funds in
flight.
Result: no user-exploitable finding. Not submitted.
createLoan(refId)readsgetPoolObserverByUserfrom the factory. refType 3 requires an owner-set observer that implementsICollateralManager, an observed pool, and (ifrestricted) an allowlist.createLoan(0)is refType 0 and accrues interest. Live observers 1–15 are empty, so nobody can open a refType-3 loan today. Do not file “anyone can borrow interest-free.”_reserveLPTokensis loan-creator + refType 3 only. The reserved-LP counter is global: any other live refType-3 creator can unreserve. That is privileged-user griefing, not theft, and it is not live.- Reserved LP is excluded
from
maxAssets,getAdjLPTokenBalance, and utilization (98% cap). Reserved borrowed invariant is excluded from interest inaccrueBorrowedInvariantand added back asconvertInvariantToLPRoundUpintotalReservedAssetsAndSupply.payLoanLiquiditydecrements reserved borrowed invariant on refType-3 repay. VaultGammaPool.liquidateExternallyandbatchLiquidationsreturn(0, []). Regularliquidatestill hitsVaultLiquidationStrategy. External / batch strategy contracts exist but are unreachable through the pool. Not a freeze of liquidatable debt.- OOS: UniV2 issues in DeltaSwap unless GammaSwap materially changed them; “impacts affecting only the state of implementation contracts”; GS / timelock / staking capped at high; airdrop ineligible for medium. Program pays critical only.
- PositionManager: loans are
owned by the PM; the NFT
owner (or approved) gates
borrow / repay / collateral.
sendTokensCallbackrequiresmsg.senderis the computed GammaPool.createLoanuses PM asmsg.senderfor observer lookup.clearToken/unwrapWETH/refundETHsweep leftovers on the PM (UniV3-style dust), not funds sitting in a pool. UUPS_authorizeUpgradeisonlyOwner.
Remaining GammaSwap listed
Solidity: 2024 factory /
DeltaSwap / staking / GS /
timelock / airdrop rows
(staking / GS / timelock
capped at high; airdrop
medium ineligible). Spark
13 Jul Robinhood / X Layer
rows are the same ALM +
Vault V2 trees already
logged. Next leftover:
Olympus March 2026
migrator / Cooler / CCIP
(olympus, $3.33M, no KYC)
or Spark 15 Jul sUSDC
impls. Not submitted.
2026-09-03: Olympus V1Migrator + Cooler V2 + CCIP + CD Facility (3f918a0)
Immunefi program olympus
($3,333,333, kyc: false,
critical only: loss of
treasury / user / bond
funds). 2 Mar 2026 leftover
is V1 Migrator
0x5131…B8B0. 20 Feb 2026
Cooler / CD / CCIP leftover
includes MonoCooler
0xdb59…e7cC, Cooler v2
Migrator 0xe045…9F1c,
CCIPCrossChainBridge
0xFbf6…143D, CD Facility
0xEBDe…9678, CD Auctioneer
0xF351…E39a. Official
OlympusDAO/olympus-v3
3f918a0 (2026-09-01).
Sourcify v2 returned HTTP
400 on checksummed
addresses; used the public
tree. No mainnet
interaction.
Files: src/policies/V1Migrator.sol,
policies/cooler/{MonoCooler, CoolerTreasuryBorrower, CoolerLtvOracle}.sol,
periphery/{CoolerV2Migrator, bridge/CCIPCrossChainBridge}.sol,
policies/deposits/ConvertibleDepositFacility.sol.
Checked for: merkle-free
OHM v2 mint; migrator
reminting after a root
change without burning v1;
Cooler V2 migrator flash
loan that credits a
stranger; MonoCooler
borrow / withdraw without
authorization; CCIP receive
from an untrusted remote;
CD convert minting OHM
for a non-owner.
Result: no user-exploitable finding. Not submitted.
V1Migrator.migrateisonlyEnabled, burnsOHMv1frommsg.sender, thenMINTR.mintOhmafter a double-hashed merkle leaf(account, allocated). Partial claims are capped by_migratedAmountsfor the current nonce. gOHMbalanceTo/balanceFromcan dust; documented.setMerkleRootincrements the nonce (admin /legacy_migration_admin).rescuesweeps to that same role.CoolerV2Migrator.consolidaterequires the caller owns each factory-created Cooler, lenders in CHREG, and DAI/USDS debt. Flash DAI (fee 0) repays V1, pulls gOHM from the owner,addCollateral/borrowon Cooler V2 fornewOwner(needs authorization or a signature), converts USDS back, repays the flash. Leftover DAI/USDS refund tomsg.sender.MonoCoolerwithdraw / borrow / applyDelegations needisSenderAuthorized.addCollateralcan credit anyonBehalfOf(donation); delegating for them still needs auth.repayis permissionless. Liquidation burns gOHM minus incentive andwriteOffDebt. LTV oracle can only rise.setTreasuryBorroweris permissionless only while unset.- CCIP send pulls OHM from
the caller to a trusted
remote. Receive requires
the stored EVM remote,
a single OHM amount, and
transfers to the decoded
recipient. Failed messages
are retryable by anyone
to that same recipient.
withdrawis owner-only native dust. - CD
createPositionisROLE_AUCTIONEER.convertis owner-only, withdraws the receipt into TRSRY, then mints OHM at the position’sconversionPrice.claimYieldsends yield to TRSRY.
Remaining Olympus leftover:
DepositManager / ReceiptToken
/ RedemptionVault, Clearinghouse
v1.2, Heart / Operator /
Emission, CCIP token pool
(logged below), Governor
Bravo, BondTeller /
BondCallback, L2 MINTR /
Roles / CrossChainBridge
copies. Spark 15 Jul
Ethereum UsdcVault is
logged; L2 rows are
UsdcVaultL2 (logged
below). Not submitted.
2026-09-03: Spark leftover gov-relay Executor + SPARK_RECEIVER (6218d57)
Immunefi program sparklend
($5,000,000, kyc: false).
Listed GitHub row
marsfoundation/spark-gov-relay
src/Executor.sol plus
SPARK_EXECUTOR /
SPARK_RECEIVER clones
(including 13 Jul
Robinhood / X Layer).
Local clone
/tmp/spark-gov-relay
at 6218d57 (sparkdotfi
mirror). Receivers are
marsfoundation/xchain-helpers
OptimismReceiver /
ArbitrumReceiver /
LZReceiver /
AMBReceiver (raw
master, 3 Sep). ALM +
Vault V2 + PSM3 +
Collector already logged.
No state-changing txs.
Files: src/Executor.sol,
deploy/Deploy.sol,
xchain-helpers receivers.
Checked for: a stranger
queue / execute that
runs before the delay;
receiver fallback that
forwards without the
bridge check; admin role
that is left on the
deployer after
setUpExecutorPermissions.
Result: no user-exploitable finding. Not submitted.
queueisSUBMISSION_ROLE(the receiver).executeis permissionless afterexecutionTimeand only whileQueued. It marksexecutedbefore the calls.cancelisGUARDIAN_ROLE. Delay / grace-period updates andexecuteDelegateCallareDEFAULT_ADMIN_ROLE. The constructor also grants admin toaddress(this)so a queued self-call can reconfigure.- Optimism receiver
requires the L2
messenger and
xDomainMessageSender == l1Authority. Arbitrum subtracts the standard alias. LZ / AMB check src eid / chain id and source authority. AllfunctionCallthe executor. - Deploy grants
SUBMISSION_ROLEto the receiver and revokes deployerDEFAULT_ADMIN_ROLE.
Remaining SparkLend after this write-up was the DSR / SSR tree; that pass is logged below. Robinhood / X Layer executor / receiver rows are the same gov-relay contracts. Not submitted.
2026-09-03: Spark leftover DSR/SSR xchain-ssr-oracle (4a23d1f)
Immunefi program sparklend
($5,000,000, kyc: false).
Listed GitHub
marsfoundation/xchain-ssr-oracle
(live default tree is
sky-ecosystem/xchain-ssr-oracle
master 4a23d1f). DSR_*
live rows are the README
“Legacy Deployments (DAI)”
of the same contracts.
Receivers are
marsfoundation/xchain-helpers
bb76966
(OptimismReceiver /
ArbitrumReceiver /
AMBReceiver /
LZComposeReceiver).
ALM + Vault V2 + PSM3 +
Collector + gov-relay
already logged. No
state-changing txs.
Read-only eth_call only.
Files: SSRAuthOracle,
SSRMainnetOracle,
SSROracleBase, forwarders
(Base / Optimism /
Arbitrum / Gnosis / LZ),
adapters (Chainlink /
Balancer), script/Deploy.s.sol,
xchain-helpers receivers.
Checked for: a stranger
setSUSDSData; a receiver
fallback that skips the
bridge check; a forwarder
that lets the caller pick
a fake payload; first-update
/ maxSSR == 0 letting a
stranger inflate chi;
Arbitrum alias spoof.
Result: no user-exploitable finding. Not submitted.
setSUSDSDataisDATA_PROVIDER_ROLE.rhomust be<= nowand strictly increasing;ssr >= RAY;chinon-decreasing; optionalchiMaxonly whenmaxSSR != 0. First update (rho == 0) skips those checks. Deploy grantsDATA_PROVIDERto the receiver and renounces deployer admin.- Live Base AuthOracle
0x65d946…f7a1(~04:41 UTC 3 Sep):maxSSR = 0(same on Arb / OP). Receiver0x212871…8474hasDATA_PROVIDER, not admin. Zero is not admin.maxSSR = 0is documented; a compromised provider can set a largechi, but the provider is the bridge receiver. Storedrhois 2026-08-20T12:56:47Z; views extrapolate. - Forwarders are
permissionless
refresh()that SafeCast-pack live sUSDS and send to the immutablel2Oracle(the receiver). The caller cannot choose the payload. - Optimism receiver:
messenger
0x4200…0007andxDomainMessageSender == l1Authority. Arbitrum subtracts the standard alias. AMB checks amb / source chain / authority. LZ compose checks src eid + source authority, then composes only from self via the endpoint. - Mainnet
refresh()copies sUSDS with raw uint96 / 120 / 40 casts (forwarders use SafeCast). Livessr/chiare nowhere near those caps. - Adapters are views.
Chainlink
latestRoundDatausesroundId = 0. Balancer divides the binomial ray by1e9.getAPRunchecked(ssr - RAY)is a view; the Auth path rejectsssr < RAY.
Remaining SparkLend after
this write-up was
SSR_RATE_SOURCE /
KILL_SWITCH_ORACLE /
SavingsDaiOracle; that
pass is logged below. The
xchain-ssr-oracle GitHub
tree and DSR / SSR live
rows are exhausted. Not
submitted.
2026-09-03: Spark leftover SSRRateSource + KillSwitchOracle + SavingsDaiOracle (Sourcify)
Immunefi program sparklend
($5,000,000, kyc: false).
Leftover oracle addresses
after the DSR / SSR tree:
SSR_RATE_SOURCE
0x57027B…9973 (Sourcify
exact, verified 2024-12-28,
SSRRateSource),
KILL_SWITCH_ORACLE
0x909A86…be82 (exact,
2024-08-08,
KillSwitchOracle),
SavingsDaiOracle
0xb9E6DB…AB5f (exact,
2025-07-04). Extract under
/tmp/spark-leftover-oracles.
15 Jul sUSDC / UsdcVault
already logged. No
state-changing txs.
Read-only eth_call only.
Files: src/SSRRateSource.sol,
src/KillSwitchOracle.sol,
src/SavingsDaiOracle.sol.
Checked for: a stranger
trigger that disables
borrows while listed
oracles are healthy; a
threshold of zero that
still counts; getAPR
that underflows into a
huge rate; getAnswer
that multiplies a stale
DAI round by current
chi in a money path.
Result: no user-exploitable finding. Not submitted.
SSRRateSource.getAPRis a view:(susds.ssr() - 1e27) * 365 daysin 0.8 (reverts ifssr < RAY). Live04:45 UTC: ~3.46e25 (3.46% APR ray).KillSwitchOracle.triggeris permissionless. The first trip requires a owner-listed oracle withlatestAnswer > 0andprice <= threshold. After that, anyone can keep disabling borrow on remaining active reserves untilreset(owner). Live:triggered = false, 6 oracles, owner0x3300f198…8c4.SavingsDaiOracleis a view adapter:daiPrice * pot.chi / RAY.getAnswer(roundId)uses currentchiagainst a historical DAI round (known inaccuracy; Aave paths uselatestAnswer). LivelatestAnswer~1.18e8 (8-dec USD).
Remaining SparkLend listed
oracle leftovers are
exhausted (AAVE_ORACLE is
the already-logged Aave V3
price oracle). Not
submitted.
2026-09-03: KeeperHub #2105 claimed
Rechecked ~04:34 UTC
3 Sep. Issue #2105 is
still open +
accepted +
confirmed, but
comment
and
PR #2275
from tenk-earn (opened
04:27 UTC, targeting
staging,
Closes #2105,
app/api/openapi/route.ts
tests/unit/openapi-route.test.ts). Do not open a second
#2105 PR. This run’s #2105 spec is superseded. No KeeperHub implementation before the 6 Sep window; #2240 remains the other track.
2026-09-03: Spark X Layer SavingsVaultIntents leftover (Sourcify)
Immunefi program sparklend
($5,000,000, kyc: false).
18 Mar 2026 leftover:
SPARK_SAVINGS_INTENTS
0x5bCD…1865 on X Layer
(chain 196). Sourcify
exact match, verified
2026-08-11,
SavingsVaultIntents
solc 0.8.27. Ctor admin
0x23d4…5FB3, relayer
0x8a25…39ab,
maxDeadlineDuration
604800. Extract under
/tmp/spark-leftover/intents.
No mainnet interaction.
Files:
src/SavingsVaultIntents.sol,
src/interfaces/{ISavingsVaultIntents,IERC4626Like}.sol.
Checked for: request
that binds a stranger’s
shares; fulfill that
redeems to an attacker
or after the deadline;
overwrite of another
account’s request; a
non-relayer fulfill;
admin-less vault swap
mid-flight.
Result: no user-exploitable finding. Not submitted.
requestis permissionless for the caller’s own(account, vault)slot. Vault must be whitelisted. Recipient cannot be0. Assets fromconvertToAssets(shares)must sit in[min, max]. Deadline must be in(now, now + maxDeadlineDuration]. Caller must hold the shares and have approved this contract. Shares are not pulled at request time.- A second
requestfor the same vault overwrites the caller’s pending intent only. canceldeletes the caller’s slot.fulfillisRELAYER. It requires a matching non-zerorequestId, rejects afterdeadline, deletes, thenredeem(shares, recipient, account). The relayer cannot change shares or recipient. A later allowance revoke or share transfer makes redeem revert (user self-lock, not theft).- Admin sets whitelist /
bounds /
maxDeadlineDuration(!= 0). Relayer is granted in the constructor.
Spark leftover oracle
rows and 15 Jul Ethereum
UsdcVault were logged
in a parallel pass. L2
15 Jul SUSDC_IMPL rows
are UsdcVaultL2 (logged
below), not the Ethereum
vault. Not submitted.
2026-09-03: Olympus DepositManager + RedemptionVault + Clearinghouse + Heart (3f918a0)
Same Immunefi program
olympus ($3,333,333,
kyc: false, critical
only). 20 Feb leftover
after the V1Migrator /
Cooler V2 / CCIP / CD
Facility pass:
DepositManager
0xcb4E…bbf2,
ReceiptTokenMgr
0xD98B…ddd1,
DepositRedemptionVault
0x20a3…029Db,
Clearinghouse v1.2
0x1e09…e0, Heart v1.7
0x5824…5ECB, Operator
v1.5 0x6417…b52,
EmissionManager v1.2
0xa61b…b6ff,
CCIPBurnMintTokenPool
0xa558…e3aD. Official
olympus-v3 3f918a0.
Sourcify v2 HTTP 400 on
several leftovers; used
the public tree. No
state-changing txs.
Files:
src/policies/deposits/{DepositManager, ReceiptTokenManager, DepositRedemptionVault}.sol,
policies/{Clearinghouse, Heart,Operator,EmissionManager}.sol,
policies/bridge/CCIPBurnMintTokenPool.sol.
Checked for: a deposit
operator withdrawing
another operator’s
liabilities; receipt mint
by a stranger; redemption
finish before redeemableAt;
borrow-against-redemption
without a committed
receipt; Clearinghouse
lendToCooler to a
factory-foreign cooler;
Heart beat minting
unbounded OHM; CCIP pool
_mint callable outside
the router.
Result: no user-exploitable finding. Not submitted.
DepositManager.deposit/withdraw/claimYield/borrowingWithdrawareROLE_DEPOSIT_OPERATORand keyed bymsg.sender. Receipt token IDs bind(manager, asset, period, operator). Mint/burn require the token owner (ReceiptTokenManager). Solvency is `liabilities <= assets- borrowed`. Borrow capacity is the operator’s own liabilities minus already borrowed.
- Redemption start pulls
unwrapped receipts, records
msg.sender, and commits at the facility. Finish / cancel / borrow / repay areonlyValidRedemptionIdfor the owner. Finish waits forredeemableAtand refuses an unpaid loan. Default burns unpaid principal receipts and sends the buffer to TRSRY. Clearinghouse.lendToCoolerrequiresfactory.createdand matching gOHM/reserve, pulls collateral from the caller, and clears the request itself. Defaults pay a capped keeper reward and burn leftover gOHM.defundiscooler_overseer.Heart.beatis frequency-gated and mints at mostcurrentReward().EmissionManager.executeandOperator.operateareheart.Operator.swapis the RBS wall with capacity +minAmountOut.- CCIP pool
_mint/_burnoverride Chainlink’s TokenPool hooks (onlyEnabled). Router / RMN still gate the external path.
2026-09-03: Olympus Governor Bravo + BondTeller + BondCallback (3f918a0)
Same program. Sourcify
exact matches on
GovernorBravoDelegate
0xa601…1B4, Delegator
0x0941…fcD, Timelock
0x953E…9c39,
BondFixedTermTeller
0x007F…Fed6,
BondCallback v1.1
0x73df…795e. Bond
Manager
0xf577…B2A3 is
BondManager.sol.
Official tree 3f918a0.
No state-changing txs.
Files:
src/external/governance/{GovernorBravoDelegate, GovernorBravoDelegator,Timelock}.sol,
src/policies/{BondCallback,BondManager}.sol,
Bond Protocol
BondFixedTermTeller /
BondBaseTeller (Sourcify
- vendored
src/test/lib/bonds). Also read L2 copies ofOlympusMinter.soland deprecatedpolicies/CrossChainBridge.sol.
Checked for: a stranger
initialize / _setImplementation;
emergency propose / queue
without the veto guardian;
cancel of an emergency
proposal by a non-proposer
when proposalThreshold
is 0; execute after a
target codehash change;
callback mint to a
non-whitelisted teller;
teller redeem that pays
more underlying than
shares burned; BondManager
market create by a
non-admin; L2 MINTR mint
without kernel permission;
LZ receive from an
untrusted remote.
Result: no user-exploitable finding. Not submitted.
- Delegator constructor
delegatecallsinitialize(admin-only, reverts iftimelockalready set) then setsadmin = timelock_._setImplementationis admin-only and rejectsaddress(0). proposerequires prior votes above the percentage threshold.activate(anyone, afterstartBlock) locks quorum from current gOHM supply. Votes takemin(startBlock, now-1)prior votes. Queue / execute requireSucceeded/Queuedand that the proposer still holds the captured threshold. Timelock execute re-checks the propose-time codehash.emergencyPropose/ emergency queue / execute arevetoGuardianand only whilegOHM.totalSupply < 1000e18. Emergency proposals storeproposalThreshold = 0; cancel by a stranger hitsvotes >= 0and revertsCancel_AboveThreshold. Only the proposer (guardian) can cancel.- BondCallback
callbackrequiresapprovedMarkets[msg.sender][id_]. Whitelist / blacklist arecallback_whitelistand the teller must match the aggregator. Quote tokens must already sit on the callback. OHM payout mints to the teller; inverse withdraws TRSRY (unwraps a configured 4626 first) and burns the received OHM.batchToTreasury/setOperatorarecallback_admin. - Teller
purchasepulls quote, pays protocol / referrer fees from the quote, then eithercallback(must returnpayout_of the payout token) ortransferFromthe market owner. Redeem /createare 1:1 with the ERC1155 supply after expiry. Protocol fee isrequiresAuthand capped at 5%. BondManagermarket launch / settle / emergency withdraw arebondmanager_admin.- L2
OlympusMintermintOhmispermissioned+onlyWhileActiveand spendsmintApproval. Deprecated LZCrossChainBridgelzReceiverequires the endpoint and a stored trusted remote; mint goes to the decoded recipient. Failed messages retry the same payload hash.
Remaining Olympus leftover:
CD Auctioneer / Limit
Orders / CoolerFactory /
LTV / TreasuryBorrower /
Composites / RANGE / YRF
/ CHREG / RGSTY / DLGTE /
RolesAdmin (this pass
below). CDEPO module
0x0233…9F1c is still
Sourcify 404. Not
submitted.
2026-09-03: Spark UsdcVaultL2 (15 Jul L2 SUSDC_IMPL)
Immunefi program
sparklend ($5,000,000,
kyc: false). 15 Jul
L2 SUSDC_IMPL rows are
not the Ethereum
UsdcVault already
logged. Sourcify exact
UsdcVaultL2
src/UsdcVaultL2.sol:
Base
0x6ACC…7723
(verified 2026-06-30),
Arbitrum
0xdC8D…92d6
(2026-06-19), Optimism
0x3a1d…CEA5
(2026-06-19). Unichain
0x1fcc…4C79
Sourcify 404 (same
listing). Ethereum
0xf943…20bA remains
UsdcVault. Extract
under
/tmp/spark-usdcvault-l2.
Read-only. No
state-changing txs.
Checked for: first-depositor
share inflation; withdraw /
redeem that spends vault
sUSDS without burning the
owner’s shares; exit
that pays more sUSDS than
shares; mint /
swapExactOut taking a
stranger’s USDC; UUPS
upgrade without wards.
Result: no user-exploitable finding. Not submitted.
- Shares mint 1:1 with
sUSDS received from
psm.swapExactIn/swapExactOut, not from atotalAssets/totalSupplyratio. Donated USDC or sUSDS does not mint shares. depositpulls USDC frommsg.sender, swaps into this vault, then_mintsamountOut.withdraw/redeemswap vault sUSDS to the receiver and then_burnthe owner (allowance if not sender). A shortfall reverts the whole tx.exitburns shares and transfers that many sUSDS. Transfer toaddress(this)is rejected.- UUPS
_authorizeUpgradeisauth.initializeis disabled on the implementation.
Listed Spark leftover addresses after this correction: Unichain impl still unverified on Sourcify (treat as the same L2 vault). Not submitted.
2026-09-03: Olympus CD Auctioneer + Cooler leftovers + RANGE/YRF (3f918a0)
Same Immunefi program
olympus ($3,333,333,
kyc: false, critical
only). Sourcify matches
on ConvertibleDeposit
Auctioneer
0xF351…E39a,
CDAuctioneerLimitOrders
0x7d8f…Fc2e,
CoolerFactory
0x30Ce…4216,
CoolerLtvOracle
0x9ee9…e8dc,
CoolerTreasuryBorrower
0xD58d…79B0,
CoolerComposites
0x6593…57Fd,
YieldRepurchaseFacility
0x271e…0692,
OlympusRange
0x399c…0fb5,
CHREG
0x69a3…43a4,
RGSTY
0x8963…de48,
DLGTE
0xD320…ad74.
RolesAdmin is
policies/RolesAdmin.sol
(L2 copies of the same
tree). Official
olympus-v3 3f918a0.
CDEPO 0x0233…9F1c
Sourcify 404. No
state-changing txs.
Files:
policies/deposits/{ConvertibleDepositAuctioneer,LimitOrders}.sol,
external/cooler/CoolerFactory.sol,
policies/cooler/{CoolerLtvOracle,CoolerTreasuryBorrower}.sol,
periphery/CoolerComposites.sol,
policies/{YieldRepurchaseFacility,RolesAdmin}.sol,
modules/{RANGE/OlympusRange,CHREG/OlympusClearinghouseRegistry,RGSTY/OlympusContractRegistry,DLGTE/OlympusGovDelegation}.sol.
Checked for: a stranger
bid that mints a
receipt at a stale
price below minPrice;
limit-order fillOrder
that spends another
user’s sUSDS or sweeps
principal as yield;
CoolerFactory
generateCooler that
overwrites a victim’s
escrow; LTV decrease;
TreasuryBorrower
borrow without the
cooler role; composites
that borrow against a
stranger without a
signature; YRF
endEpoch by a
non-heart; DLGTE
withdraw across policy
namespaces.
Result: no user-exploitable finding. Not submitted.
- Auctioneer
bidisonlyEnabled+ period-enabled +nonReentrant. It prices from the decaying tick (floored atminPrice) andcreatePositions at the facility asROLE_AUCTIONEER. Parameters arecd_emissionmanager/ manager-or-admin. - Limit orders hold USDS
in sUSDS and track
totalUsdsOwed.fillOrderwithdraws onlyfill + incentive, bids withminOhmOut = preview, and sends the NFT + receipts to the order owner.sweepYieldtransfers only shares abovepreviewWithdraw(totalUsdsOwed).cancelOrderis the owner and works while disabled. - CoolerFactory clones
with immutable owner /
tokens / factory and
sets
created. Events areonlyFromFactory. - LTV
setOriginationLtvAtis admin-only and revertsCannotDecreaseLtv. Slope is capped. - TreasuryBorrower
borrow/repay/writeOffDebtaretreasuryborrower_cooler.setDebtis admin. - Composites pull
collateral / debt from
msg.sender, creditmsg.senderon MonoCooler, and optionallysetAuthorizationWithSig. Excess debt is refunded to the caller. - YRF
endEpochisheart.initialize/adjustNextYield/shutdownareloop_daddy. - RANGE / CHREG / RGSTY
mutators are
permissioned. - DLGTE deposit / withdraw
/
applyDelegationsarepermissioned. Withdraw is capped by_policyAccountBalances[msg.sender][onBehalfOf]. - RolesAdmin
grantRole/revokeRoleareonlyAdminwith a two-step admin handoff.
Remaining Olympus leftover:
CDEPO module
0x0233…9F1c
(Sourcify 404). L2 OHM /
gOHM token rows are
standard tokens. 20 Feb
money-moving leftovers
that Sourcify or the
public tree can open
are exhausted. Not
submitted.
2026-09-03: GammaSwap 2024 factory + DeltaSwap leftover
Immunefi program
gammaswap ($40,000,
kyc: false, Primacy of
Rules, critical only,
PoC required). 24 Mar
2024 leftover after the
May 2026 vault pass:
GammaPoolFactory
0xFD51…c20B (Sourcify
exact, solc 0.8.21,
core 2312d0e),
DeltaSwapFactory
0xCb85…ffA8,
DeltaSwapRouter02
0x5FbE…1e1b,
DeltaSwapPair
0x755F…6EF0
(Sourcify exact),
MinimalBeaconProxy +
LockableMinimalBeacon.
Extract under
/tmp/gammaswap-core
and
/tmp/gammaswap-deltaswap.
Read-only. No
state-changing txs.
UniV2 issues in
DeltaSwap are OOS unless
GammaSwap materially
changed them. Staking /
GS / timelock are capped
at high; airdrop is
medium-ineligible.
Files:
contracts/GammaPoolFactory.sol,
base/AbstractGammaPoolFactory.sol,
utils/{LockableMinimalBeacon,MinimalBeaconProxy}.sol,
libraries/AddressCalculator.sol,
observer/AbstractLoanObserverStore.sol,
DeltaSwap
{DeltaSwapFactory,DeltaSwapPair,DeltaSwapRouter02}.sol.
Checked for: a stranger
createPool that
initializes a victim’s
predicted address; beacon
delegatecall to a
swappable impl; factory
execute by a
non-feeToSetter; DeltaSwap
swap that skips the K
check when
msg.sender == gammaPool
for a spoofed pool;
setGammaPool by a
stranger; router fee
calc that lets a swap
drain reserves.
Result: no user-exploitable critical. Not submitted.
createPoolis permissionless unless the protocol is restricted. ItvalidateCFMMs, salts by(cfmm, protocolId), create2s, theninitializes in the same tx.addProtocol/updateProtocol/lockProtocolare owner-only. Afterlock, the beacon freezes_implementation().executeisfeeToSetteronly (admin-trusted arbitrary call). Pause is owner.- Beacon proxy bytecode
is
calcMinimalBeaconProxyBytecode(factory + protocolId baked in), not the placeholder constants in the Solidity source. - DeltaSwap is UniV2
plus a size-gated fee
(
dsFeewhen trade ≥dsFeeThresholdof the liquidity EMA) and agsFeepath whenmsg.sender == gammaPool.gammaPoolis set only by the factory tocalcAddress(gsFactory, gsProtocolId, keccak256(pair, protocolId)).setGammaPool/updateGammaPoolaregammaPoolSetter. - Zero-fee small trades
are designed. The K
invariant still uses
1000 - fee. RoutergetAmountOutusescalcPairTradingFee. - Staking rows Sourcify
as GMX-style
RewardTracker/Vester/StakingRouter(@gammaswap/v1-staking). Do not file high findings against them.
Remaining GammaSwap listed Solidity: staking / GS / timelock (high-capped) and airdrop (medium ineligible). Factory + DeltaSwap + May 2026 vault leftover are logged. Not submitted.
2026-09-03: Zest Protocol V2 market + vault leftover (f2fce52)
Immunefi program
zest-protocol-v2
($100,000, kyc: false,
Clarity / Stacks). Listed
Hiro principals under
SP1A27…ADJ7:
v0-6-market (newest
listed market),
v0-market-vault,
v0-assets, v0-egroup,
six v0-vault-*
(sBTC / STX / stSTX /
USDC / USDH / stSTXbtc)
plus DAO executor /
multisig / treasury.
Official
Zest-Protocol/zest-v2-contracts
f2fce52 (2026-09-02)
has v0-8-market as the
current tree. Hiro
v0-6-market source
pulled read-only
(/tmp/zest-v06.json).
Repo extract under
/tmp/zest-v2. No
mainnet interaction.
Files:
mainnet/contracts/market/{v0-8-market,v0-market-vault}.clar,
vault/v0-vault-sbtc.clar,
Hiro v0-6-market.clar.
Checked for: collateral
add that credits a
stranger; remove that
pays a non-owner;
borrow without a
health check; repay
that writes off another
account without a pull;
liquidate of a healthy
or same-block borrower;
vault system-borrow
without market auth.
Result: no user-exploitable finding. Not submitted.
collateral-add/supply-collateral-add/repay/liquidaterequirecontract-caller == tx-sender. Account iscontract-caller. Vaultreceive-tokenspulls that account.collateral-remove/borrowcredit an optional receiver but still debitcontract-caller. Borrow and remove check egroup LTV after the change.- Market-vault money
paths are
check-impl-auth(contract-caller == impl).set-implisdao-executor. - Vault
system-borrow/system-repayarecheck-caller-auth(authorized-contract map, DAO-set). Caps bind available assets andCAP-DEBT. - Liquidation requires
current-ltv >= LTV-LIQ-PARTIAL, rejectslast-borrow-block == stacks-block-height, then repay + seize withmin-collateral- expected. Same-block oracle borrow is blocked. v0-6 Hiro source has the same auth / same-block / healthy gates.
Remaining Zest leftover was DAO executor / multisig / treasury and the zvstBTC strategy vault; logged in the DAO + strategy pass below. Not submitted.
2026-09-03: GammaSwap staking + GS token + timelock + airdrop leftover
Immunefi program
gammaswap ($40,000,
kyc: false, Primacy of
Rules, critical only:
theft / freeze /
insolvency). Custom OOS:
GS, GSTimelockController,
and staking are eligible
for at most high (so they
do not pay on this
program); airdrop is not
eligible for medium.
Factory + DeltaSwap + May
2026 vault leftovers are
already logged. This pass
is the remaining 2024
staking / GS / timelock /
airdrop rows. Sourcify
exact (Arbitrum 42161).
Read-only eth_call via
https://arb1.arbitrum.io/rpc
~05:05 UTC 3 Sep. No
state-changing txs.
Listing labels are
swapped: listed
GSTimelockController
0xb08d…3e83 is an
ERC1967 proxy whose
implementation
0x91fb…f2dd is GS
(symbol GS, name
GammaSwap); listed GS
0x3f7c…73f8 is
GSTimelockController
(minDelay 60). Airdrop
0x4c02…0f98 token()
is the GS proxy.
Sources: staking router
Sourcify
/tmp/gammaswap-leftover/c582…4ae4
- tree
/tmp/gammaswap-stakingc3df0b0; GS impl/tmp/gammaswap-leftover/91fb…f2dd /tmp/gammaswap-gstoken9e7e3d2; timelock/tmp/gammaswap-leftover/3f7c…73f8/tmp/gammaswap-timelockd3cfc85; airdrop/tmp/gammaswap-leftover/4c02…0f98.
Files:
StakingRouter.sol,
StakingAdmin.sol,
RewardTracker.sol,
RewardDistributor.sol,
Vester.sol,
FeeTracker.sol,
BonusDistributor.sol,
BeaconProxyFactory.sol,
contracts/GS.sol (LZ V2
OFT + UUPS),
GSTimelockController.sol,
Airdrop.sol.
Checked for: public
stake / stakeForAccount
draining a tracker;
uninitialized GS-token
router accepting deposits;
airdrop claim against a
zero merkle root; OFT mint
above MAX_SUPPLY or
without a peer; timelock
executeEmergency on an
unlisted selector;
permissionless
addEmergencyCall.
Result: no user-exploitable finding. Not submitted. Would not pay even as high (GS / staking / timelock cap) or medium (airdrop).
- StakingRouter owner
0x937f…C3Fb.gsTokensInitializedis false;gs/esGsare zero. Live RewardTracker0xd04F…4088is in private staking / transfer mode,distributor == 0,totalSupply == 0.stakereverts when private;stakeForAccountis handler-only. Loan staking is a published known issue (unused).initializeGSTokensis owner-only and one-shot. - GS is LayerZero V2 OFT
- UUPS. Constructor /
initializemint once; later mint is OFT_credit(peer-gated) and_mintenforcesMAX_SUPPLY1.6e9. Live supply ~3.33e8. Proxy owner0x9b2a…b3f1(not the factory EOA). Upgrade isonlyOwner.
- UUPS. Constructor /
- Timelock
minDelayis 60 seconds. Factory EOA0x937f…C3Fbholds proposer / executor / canceller / emergency; it does not holdDEFAULT_ADMIN_ROLE.addEmergencyCall/removeEmergencyCallrequiremsg.sender == address(this).executeEmergencyisEMERGENCY_ROLEand only for a previously registered(target, func)id. - Airdrop:
isPaused == true, merkle roots 0 and 1 are zero,totalClaimed == 0, GS balance 0.claimrevertsMerkleRootNotSetwhen the epoch root is zero (alsoPaused).updateRoot/withdraw/pause/ UUPS are owner-only. Constructor_disableInitializers().
Listed GammaSwap Solidity
is exhausted. Do not
re-review factory /
DeltaSwap / May 2026
vault. Olympus CDEPO is
the official DEPOS
module and is logged
below. Next leftover:
StackingDAO rewards /
stakers / signers,
TermMax adapters, Twyne
Sourcify-404 vaults, Sky
PAUFactory / Kicker /
sky-oapp-oft, or Yearn
3.0.4 Tokenized Strategy
/ Vault V3. Not
submitted.
2026-09-03: Zest Protocol V2 DAO + zvstBTC strategy leftover (f2fce52)
Immunefi program
zest-protocol-v2
($100,000, kyc: false,
Clarity / Stacks). Listed
Hiro principals include
dao-executor /
dao-multisig /
dao-treasury. The
zvstBTC strategy vault
is in the official
Zest-Protocol/zest-v2-contracts
tree at f2fce52 (not a
listed Hiro row; Primacy
of Impact only if a
finding existed). Local
extract /tmp/zest-v2.
No mainnet interaction.
Files:
mainnet/contracts/dao/{dao-executor,dao-multisig,dao-treasury,dao-traits}.clar,
mainnet/contracts/strategy-vault/{zvstBTC,zv-engine-stbtc-0,zv-ops-stbtc-0,zv-state-stbtc-0,zv-traits}.clar.
Checked for: proposal execution that skips the multisig impl; treasury withdraw that is not executor-gated; strategy share mint without a pull; redeem that pays a stranger; first-depositor inflation; claim double-fund; trader redirect of borrowed sBTC or removed collateral; ops sweep that drains state past funded-claim liability.
Result: no user-exploitable finding. Not submitted.
dao-executorexecute-proposal/set-implrequirecontract-caller == impl.initis deployer-once.as-contractso proposal scripts seetx-sender == dao-executor.- Multisig signer
management and impl
schedule / execute /
cancel are
tx-sender == dao-executor. Propose / approve / execute are signer-gated. Execute requires matching script, threshold, unexpired, and either the 1-day timelock or theurgentflag (DAO trust). Impl replace has a 7-day timelock. - Treasury
withdrawis executor-only and pays the proposal- chosen recipient. zvstBTCmint / burn are engine-only.set-authorized-minteris state-only.- Engine
initializeseeds 1000 dead shares to the null principal. Deposit mintsamount * supply / grossafter crystallize; sBTC deposit converts first, then uses pre-deposit NAV. Request-redeem locks a share price and escrows shares.fund-claimpaysmin(quoted, live NAV)and can run after cooldown or by manager/engine.redeemalways pays the stored user. Cancel is user-only and unfunded-only. - State pulls / pays
are engine- or
ops-gated. Collateral
to ops cannot drop
the state stBTC
balance below
funded-claim-liability. Owner / trader / guardian are privileged; hot-role changes are immediate (admin trust). - Ops open / borrow /
close / unstack keep
sBTC and stBTC inside
ops → StackingDAO /
Zest market → state.
Borrow receiver is
none(ops). Collateral remove receiver iszv-state. Close requires zero leftover scaled debt. Permissionlessrestack-ops-sbtc/sweep-ops-stbtconly return leftovers to state.
Listed Zest Clarity is exhausted. Next leftover is StackingDAO rewards / stakers / signers after the core deposit path logged below, not a second Zest pass. Not submitted.
2026-09-03: Olympus DEPOS / CDEPO (3f918a0)
Same Immunefi program
olympus ($3,333,333,
kyc: false, critical
only). Listed leftover
CDEPO
0x02331A4c97a4841084dF54d7c0eC04DD3f1A9F1c
is still Sourcify 404.
Official
OlympusDAO/olympus-v3
3f918a0 + env.json
map it to module
OlympusDepositPositionManager
(KEYCODE DEPOS), not a
separate deposit vault.
Renderer is
PositionTokenRenderer.
No state-changing txs.
Files:
src/modules/DEPOS/{OlympusDepositPositionManager,DEPOS.v1,IDepositPositionManager,PositionTokenRenderer}.sol,
plus the already-logged
ConvertibleDepositFacility
/ BaseDepositFacility
DEPOS call sites.
Checked for: permissionless
mint of conversion
rights; split to a
stranger; wrap/unwrap
that steals an NFT;
transferFrom that
leaves position.owner
and ERC721 owner
desynced; previewConvert
that overpays OHM;
facility convert that
mints without burning
receipts.
Result: no user-exploitable finding. Not submitted.
mint/setRemainingDeposit/split/setAdditionalData/setTokenRendererare Kernelpermissioned. Only CDF requestsmint/setRemainingDeposit/split._createbindsoperator = msg.sender(the policy). CDFcreatePositionisROLE_AUCTIONEERand mints remaining equal toDepositManager.depositactualAmount.- CDF
splitrequiresposition.operator == thisandposition.owner == msg.sender. DEPOSsplitcannot be called by the holder. wrap/unwrapareonlyPositionOwner. OverriddentransferFromupdatesposition.ownerand_userPositionsbefore Solmate transfer. Unwrapped IDs revertDEPOS_NotWrapped.- CDF
convertrequiresposition.owner == msg.sender,operator == this, decrements remaining, thenDepositManager.withdrawreceipts from the caller andMINTR.mintOhmto the caller. NFT without receipts cannot convert. handlePositionRedemption/ cancel are authorized-operator only (already-logged DepositRedemptionVault).- Renderer is view-only metadata.
Listed Olympus leftover addresses that Sourcify or the public tree can open are exhausted. L2 MINTR / RolesAdmin / deprecated LZ bridge copies are the same tree already logged. Not submitted.
2026-09-03: Sky StarGuard + SubProxyMethods + PAU assembler (707c84d / 8ab9daf / c13e80f)
Immunefi program sky
($10,000,000, kyc: false).
Feb 2026 leftover
star-guard
src/StarGuard.sol
(main 707c84d).
6 Jul leftover
subproxy-methods
src/SubProxyMethods.sol
(8ab9daf),
pau-assemblers
DefaultPAUAssembler.sol
(dev c13e80f), and
pau-administered-agent
AdministeredAgent{,Factory}.sol
(5e6b52f). Official
clones under
/tmp/sky-star-guard,
/tmp/sky-subproxy-methods,
/tmp/sky-pau-assembler,
/tmp/sky-administered-agent.
No mainnet interaction.
Files as named above
plus deploy/StarGuardInit.sol.
Checked for: permissionless
plot / exec of an
unwhitelisted star
spell; exec that
keeps running after a
codehash swap;
SubProxyMethods
transfer that drains
a SubProxy without
wards; assembler
deploy that keeps
DEFAULT_ADMIN on a
live PAU; agent
call without being
an actor.
Result: no user-exploitable finding. Not submitted.
- StarGuard
plot/drop/file/rely/denyareauth.execis permissionless only after a plotted address, matchingcodehash,deadline, andisExecutable().spellDatais deleted beforesubProxy.exec. AfterwardssubProxy.wards(this) == 1or the tx reverts. Cantina + ChainSecurity reports are in-repo. Trust model is PauseProxy wards + trusted spells. - SubProxyMethods is a
one-function
delegatecallhelper. Direct calls move tokens from the helper (empty). ViaSubProxy.execit moves SubProxy inventory; that path is ward-gated. DefaultPAUAssembler.deployis permissionless factory wiring. It is temporary admin, grants caller-supplied admins, then revokes itself. It cannot touch an already- deployed stack.AdministeredAgentFactory.deployis a create.call/batchCall/sendValueareonlyActor. Last admin cannot be removed. Actors are trusted allocators for a new stack.
Remaining Sky leftover
that this pass did not
open: sky-oapp-oft
after PAUFactory +
Kicker logged below.
Not submitted.
2026-09-03: Yearn Accountant leftover (Sourcify)
Immunefi program
yearnfinance
($200,000, kyc: false).
29 Oct 2025 leftover
Accountant
0x5A74Cb32D36f2f517DB6f7b0A0591e09b22cDE69
is not the already-
logged stYFI
TeamAccountant
0x1c22…DFD6.
Sourcify exact match
Accountant.sol:Accountant
(verified 2024-08-08).
Extract
/tmp/yearn-accountant.
No state-changing txs.
Files: Sourcify
Accountant.sol
(report,
addVault /
removeVault,
redeemUnderlying,
distribute,
config / role
handoff).
Checked for: a stranger
adding their vault and
pulling refunds; report
approving the caller
for the accountant’s
entire asset balance;
permissionless
redeemUnderlying /
distribute.
Result: no user-exploitable finding. Not submitted.
addVault/removeVaultarefeeManagerorvaultManager(the modifier nameonlyVaultOrFeeManagerdoes not let a vault add itself).reportisonlyAddedVaults. Refunds approve the reporting vault formin(loss * refundRatio, idle asset). Shared-asset idle (fees from another vault) is trusted-vault inventory, not an external extract.redeemUnderlyingisonlyFeeManager.distributeisfeeManagerorfeeRecipientand always paysfeeRecipient.- Fee caps: management ≤ 2%, performance ≤ 50%. Health-check skips are one-shot and manager-set.
Remaining Yearn listed
leftover: 3.0.4
Tokenized Strategy
0xD377…139c and
3.0.4 Vault V3
0xd806…00d if a
later pass wants those
impls (Factory 3.0.4
is already logged).
Not submitted.
2026-09-03: StackingDAO cores + stBTC/STX reserve leftover (Hiro 13 Aug 2026)
Immunefi program
stackingdao ($100,000,
kyc: false, Primacy of
Impact on Critical/High).
Newest listed money path
(13 Aug 2026): Hiro
SP4SZE…VDPBG
stacking-dao-core-stbtc-v1,
stacking-dao-core-stx-v2,
stacking-dao-core-ststxbtc-v2,
plus stbtc-token,
stbtc-reserve,
data-stbtc-v1,
stx-reserve-v2,
data-stx-v2,
withdraw-data-stbtc,
stbtc-withdraw-nft.
Official repo
StackingDAO/stackingdao-smart-contracts
updated the same day.
Source pulled read-only
from Hiro
(/tmp/stacking-dao).
No mainnet interaction.
Checked for: first-depositor
inflation; share mint
without a pull; idle
withdraw that spends
reserved backing; NFT
withdraw that pays a
non-owner or a missing
ticket; ratio excluding
pending/escrow shares
incorrectly; stSTX vs
stSTXbtc reserve mix-up;
permissionless
process-rewards
skimming new deposits.
Result: no user-exploitable finding. Not submitted.
- stBTC / stSTX deposit
computes shares from
the pre-pull ratio
(
get-*-uprounds against the depositor), then pulls the full asset and mints. First deposit seeds 1000 dead shares on the core. init-withdrawescrows shares on the core, records the NFT ticket, and increments the reserved counter (does not require idle cash).withdrawis NFT-owner- unlock-height gated, deletes the ticket, pays the stored user amount, then burns escrowed shares. Missing tickets default to a zero payout.
withdraw-idleburns the caller's shares and pays onlyidle - reserved. Idle fee stays in the pool (stBTC/stSTX) or goes to treasury (stSTXbtc).- Ratio uses
total - reservedoversupply - pending (stBTC) / escrowed cores (stSTX). stSTXbtc is 1:1 and earmarked viastx-for-ststxbtc-idle; STX reserve pay/stack paths keep that bucket out of stSTX idle. - Token mint/burn and
reserve moves are
dao.check-is-protocol (contract-caller). NFT mint/burn too. rewards-pox5-v1 process-rewardsis called on deposit. The permissionless branch only streams already-queued sBTC into reserves. Commission on new inbound sBTC is keeper-only.
Remaining StackingDAO was rewards-stx / commission / strategy-v6 / stakers; logged in the strategy + rewards pass below. Native-pool / signer-managers if a later pass wants those admin wrappers. Not submitted.
2026-09-03: Yearn 3.0.4 TokenizedStrategy + Vault V3 leftover (Sourcify)
Immunefi program
yearnfinance ($200,000,
kyc: false). Remaining
listed impls after
Factory 3.0.4 + V3.1.0 +
Accountant: 3.0.4
Tokenized Strategy
0xD377919FA87120584B21279a491F82D5265A139c
(Sourcify match,
TokenizedStrategy,
solc 0.8.18, verified
2024-11-01,
API_VERSION 3.0.4) and
3.0.4 Vault V3
0xd8063123BBA3B480569244AE66BFE72B6c84b00d
(Sourcify match,
YearnV3Vault, Vyper
0.3.7, verified
2025-01-14). Extract
/tmp/yearn-304/{strat304,vault304}.
These are implementation
singletons used via
clones; no
state-changing txs.
Files: flattened
TokenizedStrategy.sol
(initialize,
deposit / mint /
withdraw / redeem,
_deposit / _withdraw,
report, tend),
YearnV3Vault.vy
(initialize,
_deposit / _redeem,
process_report,
_total_assets).
Checked for: first-depositor
1-wei inflation plus a
raw donation (3.0.4 has
no MINIMUM_SUPPLY);
deposit that credits a
stranger or the vault;
redeem that pays
msg.sender instead of
receiver; keeper-less
report that unlocks
profit immediately;
process_report(self)
by a non-role.
Result: no user-exploitable finding. Not submitted. Listed Yearn leftover impls are exhausted.
- Strategy
totalAssetsis a stored counter, notbalanceOf. Empty supply mints 1:1;totalSupply > 0andtotalAssets == 0mints 0. Donations sit idle until a keeperreport/harvestAndReport; profit is locked as shares to the strategy and unlocked overprofitMaxUnlockTime(default 10 days)._depositpullsmsg.sender, thendeployFundson the full loose balance, thentotalAssets += assets(deposited amount only), then mints toreceiver. Cannot deposit toaddress(this)._withdrawburnsowner(allowance if sender ≠ owner) and paysreceiver.report/tendareonlyKeepers. Performance fee ≤ 50%.initializeis one-shot (asset == 0). - Vault
_total_assetsistotal_idle + total_debt. Empty supply is 1:1;total_assets == 0with supply > 0 mints 0._depositpullsmsg.sender, increments idle, mints torecipient._max_depositis 0 foraddress(0)andself._redeemburnsownerand paysreceiver. Losses from the withdraw queue are capped bymax_loss.process_reportisREPORTING_MANAGER. Impl__init__setsasset = selfso the singleton cannot be initialized. Factory 3.0.4create2+initializeis already logged.
Next leftover: Sky
sky-oapp-oft, TermMax
leftover adapters, Twyne
Sourcify-404 vaults, or
StackingDAO native-pool
/ signer-managers. Not
submitted.
2026-09-03: Sky PAUFactory + Kicker leftover (fd5f09c / ed90ec2)
Immunefi program sky
($10,000,000, kyc: false). Remaining
listed Solidity after
StarGuard /
SubProxyMethods / PAU
assembler /
AdministeredAgent:
PAUFactory.sol (6 Jul
2026,
sky-ecosystem/diamond-pau
dev fd5f09c) and
Kicker.sol (19 Nov
2025, dss-flappers
ed90ec2). Official
raw GitHub. No mainnet
interaction.
Files:
src/PAUFactory.sol,
src/Kicker.sol.
Checked for: factory
deploy* that
re-points a live
controller / proxy /
rate-limit to a
stranger; permissionless
flap that sucks
beyond the surplus
threshold or pays the
caller.
Result: no user-exploitable finding. Not submitted.
- PAUFactory stores an
immutable
beacon(non-zero). Everydeploy*is anewof a fresh AccessControls / Controller / ALMProxy / ALMProxyFreezable / RateLimits. It cannot mutate an already- deployed PAU graph. Controller is wired with caller-supplied accessControls / proxy / rateLimits plus the factory beacon. - Kicker
rely/deny/filearewards.flapis permissionless only after `vat.dai(vow) >= vat.sin(vow) + kbump- khump
. Itvat.suck(vow, this, kbump)thensplitter.kick(kbump, 0). The kickerhope`s the splitter in the constructor. No caller payout.
- khump
Remaining Sky listed
Solidity was
sky-oapp-oft; logged
in the OFT pass below.
Not submitted.
2026-09-03: StackingDAO strategy-v6 + stakers + rewards leftover (Hiro 13 Aug 2026)
Same Immunefi program
stackingdao ($100,000,
kyc: false). Remaining
admin / stacker path
after the cores: Hiro
strategy-v6,
stx-staker-stacking-dao-v2,
stbtc-staker-bond-1-v2,
commission-sbtc-v1,
rewards-stx-v2. Source
pulled read-only
(/tmp/stacking-dao).
No mainnet interaction.
Checked for: strategy
perform-* callable by
anyone; staker that
pulls reserve STX/sBTC
without protocol auth;
return-* that credits
a stranger; commission
skim that is not
protocol-gated;
permissionless
process-rewards that
folds new inbound STX
to a non-reserve sink.
Result: no user-exploitable finding. Not submitted.
strategy-v6perform-*requirecontract-caller == manager. Bond / recall / rollover / stake / unstake also require an approved signer-manager.initialize/set-manager/set-approved-signer-manageraredao.check-is-protocol.- STX / sBTC stakers
are protocol-gated.
They pull via reserve
request-*-to-stack/request-stx-for-staking(reserved-aware) and return viareturn-*-from-stacking. PoX calls runas-contract. commission-sbtc-v1 add-commissionpulls fromtx-senderand is protocol-gated. Default signer bps is 10000 (all tosigner-payout-v1).withdraw-treasuryis protocol-gated.rewards-stx-v2 process-rewardsis permissionless only for already-queued streaming STX tostx-reserve-v2. Folding new inbound STX andadd-rewardsare keeper-only.
Remaining StackingDAO was native-pool + signer-managers / signer-payout; logged in the native-pool pass below. Not submitted.
2026-09-03: Sky sky-oapp-oft leftover (0baba10)
Immunefi program sky
($10,000,000, kyc: false). Last listed
Sky leftover after
PAUFactory / Kicker:
sky-ecosystem/sky-oapp-oft
0baba10 (19 Nov 2025
assets). Listed files
SkyOFTAdapter.sol,
GovernanceOAppSender.sol,
programs/oft/src/state/oft.rs,
programs/governance/src/state/governance.rs.
Also read the money
path around those:
SkyOFTCore /
SkyRateLimiter /
SkyOFTAdapterMintBurn
/ GovernanceOAppReceiver,
Solana send /
lz_receive /
withdraw_fee. Official
raw GitHub
(/tmp/sky-oapp). No
mainnet interaction.
Checked for: adapter
_credit that unlocks
more than was locked;
fee withdraw that
pulls TVL; mint-burn
_debit that burns
less than it credits
remotely; inbound
without an LZ peer;
Solana withdraw that
ignores tvl_ld;
governance _lzReceive
that executes for a
non-peer.
Result: no user-exploitable finding. Not submitted. Listed Sky leftover Solidity / Solana OFT is exhausted.
- Adapter
_debitpullsamountSentLDfrom_from, rate- limitsamountReceivedLD, and parks the fee infeeBalance._creditiswhenNotPaused, inbound-limited, and unlocks exactly_amountLD. Zero / token recipients go to0xdead.withdrawFeesandmigrateLockedTokensareonlyOwnerand excludefeeBalancefrom migration. - Mint-burn adapter
burns
amountSentLDand mints the fee to itself;_creditmints to the recipient. Fee withdraw is owner rescue of the adapter balance. - Unset rate-limit
windows have
limit == 0so_calculateDecayreturns 0 capacity (fail-closed). - Governance sender
sendTxrequirescanCallTarget(onlyOwnerset). Receiver_lzReceiveis peer-gated by OAppCore and does a raw call to the decoded target; targets must checkmessageOrigin. - Solana Adapter send
escrows
amount_sent_ldand incrementstvl_ldbyamount_received_ld. Receive requirespeer.peer_address == params.sender, clears via the endpoint, then unlocks / mintssd2ld(amount_sd).withdraw_feeis admin and requiresescrow.amount - tvl_ld >= fee_ld.
Next leftover: Sky L1/L2 governance relays + TermMax leftover adapters (logged below), or Twyne Sourcify-404 vaults. Not submitted.
2026-09-03: StackingDAO native-pool + signer leftover (Hiro 13 Aug 2026)
Same Immunefi program
stackingdao ($100,000,
kyc: false). Remaining
wrappers after
strategy-v6 / stakers /
rewards: Hiro
native-pool-v1,
native-pool-signer-manager,
signer-manager-stacking-dao-v1,
signer-manager-bond-1-v1,
signer-payout-v1,
signer-admin-v1.
Source pulled read-only
(/tmp/stacking-dao).
No mainnet interaction.
Checked for: native-pool
delegate that stakes a
stranger's STX; signer
validate-stake! that
accepts any staker;
claim-rewards that
pays the caller;
payout distribute
that is not keeper-
gated; admin bootstrap
that seizes a manager
before the DAO wires
it.
Result: no user-exploitable finding. Not submitted. Listed StackingDAO Clarity leftover is exhausted.
native-pool-v1 delegate/delegate-update/undelegateusetx-senderand the protocol-setnative-pool-sm. Thedelegatingflag is set only around the user's own PoX call.- Native-pool signer
validate-stake!requiresis-delegating (staker, this).claim-staker-rewardspaystx-sender. - Protocol signer-
managers
validate-stake!against an admin allowlist.claim-rewardsforwards sBTC to the admin-set recipient, not the caller. signer-admin-v1 set-adminisdao.check-is-protocolwith no self- bootstrap.signer-payout-v1 distributeis keeper-only.withdraw-residualis protocol-gated.
2026-09-03: Sky L1/L2 governance relay leftover (ff964bb / 82918f4)
Immunefi program sky
($10,000,000, kyc: false). Remaining
listed relays after
sky-oapp-oft:
sky-ecosystem/lz-governance-relay
master ff964bb
and
sky-ecosystem/op-token-bridge
master 82918f4.
Local clones
/tmp/lz-gov-relay and
/tmp/op-token-bridge.
No mainnet interaction.
Files:
lz-governance-relay/src/{L1,L2}GovernanceRelay.sol,
op-token-bridge/src/{L1,L2}GovernanceRelay.sol.
Checked for:
permissionless relay
that executes a stranger
spell; L2 file that
re-points the OApp /
L1 sender; OP messenger
spoof (xDomainMessageSender
unchecked).
Result: no user-exploitable finding. Not submitted.
- LZ L1
relayEVM/relayRaw/reclaim*arewards. The payload isL2GovernanceRelay.relay(target, targetData)via the already-reviewed GovernanceOAppSender (src sender must be allowlisted per dst target). - LZ L2
relayismessageAuth:msg.sender == l2Oapp,srcEid == l1Eid,srcSender == l1GovernanceRelay. Execution isdelegatecall.filerequiresmsg.sender == address(this)(only via that relay). - OP L1
relayiswardsand always targets the immutablel2GovernanceRelaythrough the immutable messenger. L2onlyL1GovRelayrequiresmsg.sender == messengerandxDomainMessageSender == l1GovernanceRelay.
Remaining Sky listed relays are the older Optimism / Arbitrum / Starknet DAI-bridge copies of the same ward + messenger pattern. Not submitted.
2026-09-03: StackingDAO swap + rewards-pox5 leftover (Hiro 13 Aug 2026)
Same Immunefi program
stackingdao ($100,000,
kyc: false). Listed
wrappers the native-pool
pass did not open:
Hiro
swap-ststx-ststxbtc-v4,
rewards-pox5-v1,
reward-split-calculator-v1.
Source pulled read-only
(/tmp/stackingdao).
No mainnet interaction.
Checked for: swap that
mints stSTXbtc without
locking idle; harvest
of the already-logged
paper PPS bump after
pending stSTXbtc exit;
permissionless
process-rewards that
skims new inbound
sBTC.
Result: no user-exploitable finding. Not submitted. Listed StackingDAO money-path leftover that Hiro would open is exhausted (tracking / withdraw NFTs were reviewed with the cores).
- Forward swap pulls
stSTX, quotes
get-stx-per-ststx(round down), burns, mintsvalue-vstSTXbtc, andlock-stx-for-ststxbtc. Reverse usesget-stx-per-ststx-upso shares round against the swapper, then unlocks only when idle covers amount + reserved withdrawals.get-stx-availablesubtractsstx-for-ststxbtc-idle. Afterinit-withdrawof stSTXbtc the quoted stSTX PPS can rise (circulatingget-stx-for-ststxbtcdrops) but available idle does not, so the inflated quote failsERR_INSUFFICIENT_IDLEthe same waywithdraw-idledoes. rewards-pox5-v1 process-rewardsis permissionless only for already-queued sBTC (split by protocol bps). Commission on new inbound sBTC and the fold are keeper-only.reward-split- calculator-v1 compute-and-applyis protocol-gated.
2026-09-03: TermMax leftover swap adapters (e314f3f)
Same Immunefi program
termstructurelabs
($80,000, kyc: false).
Remaining V2 adapters
after the already-logged
1inch / LiFi / Odos /
UniV3 / Pendle /
TermMaxSwap set:
KyberswapV2AdapterV2,
OkxSwapAdapter,
PancakeSmartAdapter,
KodiakSwapAdapter,
ERC4626VaultAdapterV2,
StrataVaultAdapter,
TerminalVaultAdapter,
OndoSwapAdapter.
Local clone
/tmp/termmax-v2 at
e314f3f. No mainnet
interaction.
Checked for: adapter
swap callable on the
implementation;
user calldata that
pays a third party
while returning a
fake tokenOutAmt;
vault redeem that
credits a stranger;
Ondo quote that
spends a different
asset than tokenIn.
Result: no user-exploitable finding. Not submitted. Listed TermMax leftover adapters are exhausted.
- Parent
ERC20SwapAdapterV2.swapisonlyProxy(delegatecallfrom the router). Markets / adapters stay on the already-logged whitelist. - Kyber scales via
the immutable helper
then
functionCalls the immutable router. OKX / Pancake / Kodiak measure or decode output on the router and revert onLessThanMinTokenOut/InvalidTradeAmount. A payload that pays a third party yields zero observed output. - 4626 / Strata
deposit to
recipientand redeem fromaddress(this). Terminal instant paths leave output on the router and forward the balance (same intentional leftover-sweep asuseBalanceOnchain). - Ondo checks
quote.assetagainsttokenOut(BUY) ortokenIn(SELL) and refunds unused input / USDon to the user-setrefundAddress.
Next leftover: Sky Optimism / Arbitrum / Starknet DAI-bridge relays (logged below), Lombard EVM strategy leftover (logged below), or Twyne Sourcify-404 vaults. Not submitted.
2026-09-03: Sky Optimism / Arbitrum / Starknet DAI-bridge leftover
Immunefi program sky
($10,000,000, kyc: false). Remaining
listed 2022 DAI-bridge
trees after LZ / OP
governance relays:
sky-ecosystem/optimism-dai-bridge
master bc3d63f,
arbitrum-dai-bridge
master ba5e986,
starknet-dai-bridge
main 380a6ed.
Local clones
/tmp/op-dai-bridge,
/tmp/arb-dai-bridge,
/tmp/sn-dai-bridge.
No mainnet interaction.
Files: OP
L1/L2GovernanceRelay,
L1Escrow,
L1/L2DAITokenBridge;
Arb
L1/L2GovernanceRelay,
L1Escrow,
L1/L2DaiGateway;
Starknet
L1DAIBridge,
L1Escrow,
L1EscrowMom,
L1GovernanceRelay,
l2_dai_bridge.cairo,
l2_governance_relay.cairo.
Checked for:
permissionless L2
relay / mint;
withdrawal that unlocks
escrow without a burn;
escrow approve that
is not ward-gated;
Starknet
consumeMessageFromL2
that pays a stranger
who did not appear in
the L2 payload;
Arb router-decoded
from that burns a
non-caller without the
official router.
Result: no user-exploitable finding. Not submitted. Listed Sky leftover that a public GitHub tree would open is exhausted (Twyne vaults are still Sourcify 404).
- OP / Arb L1 relays
are
wards. L2relayis messenger + L1 counterpart gated anddelegatecalls a trusted spell. OP L2 also checks the messenger slot did not change. - Escrows only
approveunderwards. StarknetL1EscrowMom.refusecan only set allowance to 0. - OP deposit locks
DAI in escrow and
mints on L2 only
via
onlyFromCrossDomainAccount. L2 withdraw burnsmsg.senderthen unlocks the same amount on L1. Closed bridges still finalize in-flight messages and reject new ones. - Arb
outboundTransfersetsfrom = msg.senderunlessmsg.senderis the immutable official router. Extra hook data is rejected. L2 burnsfromand L1finalizeInboundTransferisonlyL2Counterpart. - Starknet deposit
pulls
msg.senderinto escrow undermaxDeposit+ ceiling. L2handle_depositrequiresfrom_address == l1 bridge.initiate_withdrawburns the L2 caller and posts[0, l1_recipient, amount]. L1withdrawconsumes that payload withmsg.sender == l1_recipient, then may forward DAI to a caller-chosen address (same designated recipient).cancelDepositrebuilds the original payload withmsg.senderas the depositor.
Next leftover: Lombard
EVM strategy leftover
(logged below), Enzyme
CreWorkflowConsumer,
or Twyne Sourcify-404
vaults. Not submitted.
2026-09-03: Lombard EVM strategy shard leftover (7fe83e5)
Immunefi program
lombard-finance
($250,000, kyc: true).
15 Jul 2026 leftover
after the SVM tree:
Shard.sol,
BlocklistOracle.sol,
MerkleAllowlistValidator.sol,
and
contracts/strategy/converters
(listed live Ethereum
0xDde9…2dFD /
0xc94B…da16 /
0x5D84…6602 /
0x6647…CDd3 /
0xecc0…A777).
Official clone
/tmp/lombard-evm at
7fe83e5. No mainnet
interaction.
Files as named plus
ShardBaseUpgradeable.sol
and
ChainlinkConverter /
ChainlinkCompositeConverter
/ DirectConverter.
Checked for: exec
that skips the
allowlist; merkle
validatorArgs that
forges a leaf; privileged
exec callable by
anyone; pullFromStrategy
without the transfer
role; blocklist check
that an allowlisted
sanctioned address
bypasses; converter
that uses a stale or
pre-downtime answer.
Result: no user-exploitable finding. Not submitted.
Shard.initializeis one-shot (initializer) and_disableInitializerson the impl.pullFromStrategy/pushToStrategyareSHARD_TRANSFER_ROLE.execisnonReentrant, rejectsto == this, and requiresvalidator.isAllowed. The 3-argexecisPRIVILEGED_EXECUTOR_ROLEonly.setValidatorisDEFAULT_ADMIN_ROLE.- Merkle validator
fail-closes on a
zero root. Leaves
bind
LEAF_TYPE+ chainid +address(this). Rules are packed and must be canonical (reserved flags 0, unused header fields 0, exact length, strictly increasing constraint offsets,expected ⊆ mask). Dynamic-ABI constraint limits are documented in-source (policy authoring, not a user bypass). - Blocklist
checkreverts on the manual list first, then external sanction lists. Allowlist skips sanctions only.blockAccount/unblockAccount/allowAccount/ sanction-list add are role-gated. - Converters are
view. Chainlink
rejects
answer <= 0, futureupdatedAt, heartbeat staleness, sequencer-down, zerostartedAt, grace period, and pre-recovery answers. Composite is onemulDiv. Direct is 1:1.
Next leftover: Enzyme
CreWorkflowConsumer
(logged below), Silo V3
vaults (logged below),
or Twyne Sourcify-404
vaults.
Not submitted.
2026-09-03: Enzyme Onyx CreWorkflowConsumer leftover (7b48d24)
Immunefi program
enzyme-onyx ($200,000,
kyc: false). 2 Jul /
24 Feb leftover
CreWorkflowConsumer.sol
after the ACE issuance
pass. Official clone
/tmp/enzyme-onyx at
7b48d24 (same ACE
commit). In-repo
ChainSecurity QA notes
nonce / expiry and
deployment sequencing.
No mainnet interaction.
Files:
src/components/automations/chainlink-cre/CreWorkflowConsumer.sol,
IReceiver.sol. Adjacent:
LimitedAccessLimitedCallForwarder.executeCalls.
Checked for: onReport
from a non-Keystone
caller; metadata that
swaps workflow owner;
replay / skipped nonce;
permissionless init
that steals a live
forwarder role;
setAllowedWorkflowId
by a stranger.
Result: no user-exploitable finding. Not submitted.
onReportrequiresmsg.sender == CHAINLINK_KEYSTONE_FORWARDER(immutable). Metadata must match stored workflow id / name and immutableALLOWED_WORKFLOW_OWNER.expiresAtisblock.timestamp <=. Nonce must belastNonce + 1; storage updates beforeexecuteCalls.executeCallson the configured forwarder requiresisUser(consumer). A front-runinitcan point a not-yet-inited clone at a stranger forwarder (DoS of that instance until redeploy). It cannot become a user on the live protocol forwarder (addUserisonlyAdminOrOwner). In-repo QA already flags the sequencing.initis one-shot (forwarder != 0).setAllowedWorkflowIdisonlyAdminOrOwner.
Next leftover: Silo V3 vaults (logged below) or Twyne Sourcify-404 vaults. Not submitted.
2026-09-03: Silo Finance V3 vaults (31b98b3)
Immunefi program silofinance-v2 (Silo Finance v2 & v3,
$100,000, kyc: true). GitHub vault tree added 25 Mar
2026. Local clone /tmp/silo-v3 at 31b98b3. No
mainnet interaction.
Files: silo-vaults/contracts/{SiloVault,PublicAllocator, SiloVaultsFactory,IdleVault,IdleVaultsFactory}.sol,
libraries/{SiloVaultActionsLib,SiloVaultFactoryActionsLib}.sol,
incentives/VaultIncentivesModule.sol.
Checked for: first-depositor inflation; lying market
previewRedeem that inflates share price then deflates;
balanceTracker that can be lowered without a real
withdraw; PublicAllocator flow-cap underflow / unsorted
duplicates; claiming-logic delegatecall without a
timelock; IdleVault deposit-to-stranger; factory init
that leaves the incentives module unbound.
Result: no user-exploitable finding.
- MetaMorpho-style allocator / curator / guardian /
timelock. Caps require
market.asset() == vault.asset(). Lowering a cap is instant; raising is timelocked. Market removal needs cap 0, no pending cap, and either zero market-share balance orremovableAtelapsed. DECIMALS_OFFSET = 6plus+1virtual assets. IdleVault is the same offset and onlyONLY_DEPOSITOR(the SiloVault) may mint/deposit (maxDeposit(other) == 0and receiver must match).balanceTrackeronly ratchets up when the market reports more (_updateInternalBalanceForMarket). It decreases only by the exact ERC20 delta received (_checkAfterWithdraw). A lying high report can raisetotalAssets()(fee / share price) but that is curator-trusted market risk; the tracker then blocks further supply until a guardiansyncBalanceTracker.- Fresh deposits
forceApprovethe exact amount, then reset to 1 wei._priceManipulationCheckreverts ifpreviewRedeem(gotShares) + threshold < assets(default threshold1e6). - PublicAllocator
reallocateTois permissionless but only if the vault set it as allocator. Withdrawals must be unique and address-sorted;maxOut/maxInareuint128withMAX_SETTABLE_FLOW_CAP = type(uint128).max / 2. Fee is exactmsg.value. - Incentives claiming logics run via
delegatecallfrom the vault. Owner-submitted logics are timelocked; curator-submitted logics skip the timelock only when a trusted factory (itself owner-timelocked) reportscreatedInFactory. Notification receivers are owner-only. - Factory clones the incentives module, deploys
SiloVaultwith that address, then__VaultIncentivesModule_initbindsvault.
Not submitted. Remaining Silo listed Solidity: core
Silo / SiloConfig / SiloFactory / router /
leverage / kink IRM / incentives / hooks, plus
share tokens (core Actions logged below).
2026-09-03: Silo Finance V3 core Actions leftover (31b98b3)
Same Immunefi program silofinance-v2. Money path
after the vault pass: silo-core/contracts/Silo.sol
wrappers plus lib/{Actions,SiloLendingLib,Views}.sol.
Local clone /tmp/silo-v3 at 31b98b3. No mainnet
interaction.
Checked for: flash-loan reentrancy that borrows
against accounting liquidity after tokens left;
repay that burns more debt than it pulls; withdraw
that skips solvency when the deposit silo is the
collateral silo; transitionCollateral that mints
unbacked shares; withdrawFees that spends
protected assets; callOnBehalfOfSilo from a
non-hook.
Result: no user-exploitable finding.
- Deposit / withdraw / borrow / repay / transition
take
siloConfigreentrancy, accrue, then mutate. Borrow forbids an existing other-silo debt, sets the other silo as collateral, then_checkLTVWithoutAccruingInterest. Withdraw / transition check solvency whendepositConfig.silo == collateralConfig.silo. SiloLendingLib.borrowsizes from storedtotalAssets[Debt]and requiresborrowedAssets <= collateral - debt. Transfer is live ERC20; a flash-loan callback that tries to borrow more than the leftover balance reverts onsafeTransfer. Flash loan itself does not change accounting (intentional) and only lendsbalance - protected.- Repay converts, clamps shares to the borrower's
debt balance, requires
totalDebt >= assets, burns thentransferFrom(commented fee-on- transfer ignore). Anyone may repay anyone. - Transition withdraws with
_asset == 0(no transfer) and deposits the sameassetsonto the other share token. No extra tokens appear. withdrawFeessubtracts protected frombalanceOf(this)before paying DAO/deployer. Failed deployer transfer redirects to the DAO.callOnBehalfOfSiloisOnlyHookReceiver. Hookdelegatecallis hook-admin trust.
Not submitted. Remaining Silo listed Solidity is logged below.
2026-09-03: Silo Finance V3 config / router / leverage / hooks leftover (31b98b3)
Same Immunefi program silofinance-v2. Remaining
listed Solidity after vaults + Actions:
SiloConfig, SiloFactory, SiloRouterV2 +
implementation, LeverageRouter +
LeverageUsingSiloFlashloanWithGeneralSwap,
PartialLiquidation / PartialLiquidationExecLib,
SiloHookV1/V2/V3, ShareDebtToken, plus a
skim of DynamicKinkModel and
SiloIncentivesControllerCompatible. Local clone
/tmp/silo-v3 at 31b98b3. No mainnet interaction.
Checked for: setOtherSiloAsCollateralSilo from a
non-silo; debt transfer that skips recipient
solvency; router delegatecall that spends a
stranger's leftover; leverage swap that keeps
flash-loaned tokens; liquidation that seizes
shares of a solvent user; V3 hook that still
liquidates.
Result: no user-exploitable finding.
- Config is immutable except
borrowerCollateralSilo. Only a silo can_setSiloAsCollateralSilo.onDebtTransferisOnlyDebtShareToken, forbids a second-silo debt, and copies the sender's collateral silo only when the recipient has none.ShareDebtTokentransfers need a receive allowance and require the recipient solvent after (transferWithChecks). - Factory clones + initializes both silos and
share tokens, mints the fee NFT to
_deployer. Fee caps are owner-set (max 50% DAO / 15% deployer / 30% liquidation). - Router
multicallisnonReentrant+ pause anddelegatecalls the implementation. Deposit / withdraw / borrow / repay always usemsg.senderas owner. Leftover on the router is the caller's to sweep (transferAll); next user can take it (documented). - Per-user leverage clone,
onlyRouter. Open: flash debt → swap → deposit to borrower → borrow debt+fee to repay flash. Close: flash maxRepay → repayShares → redeem → swap must cover flash+fee; leftover goes to borrower.GeneralSwapModuleis a separate contract; leverage transfers sell tokens in, never approves the module. User calldata that pays elsewhere yieldsamountOut == 0and reverts.onFlashLoanrequiresmsg.sender == _txFlashloanTarget. - Partial liquidation accrues, sizes via
liquidationPreview(revertsUserIsSolvent), pulls debt from the caller, forwards share tokens with checks off, thenrepay. Empty collateral after seize revertsNoCollateralToLiquidate. V1/V2beforeActionreverts; V3liquidationCallisNotSupported(defaulting path is V2). - IRM implementation is initializer-locked;
RCUR_CAPis 1000% APR. Incentives gauge kill is owner-only.
Listed Silo V3 GitHub Solidity leftover is exhausted. Next leftover: PancakeSwap Infinity (logged below), Mux3 (logged below), or Twyne Sourcify-404 vaults. Not submitted.
2026-09-03: PancakeSwap Infinity leftover (61cd131 / 8261f8d / 33dbf5a)
Immunefi program pancakeswap ($1,000,000,
kyc: false, not paused). Five GitHub SC
assets added 30 Oct 2025. This pass is the
Infinity trees only. Local clones:
/tmp/pcs-infinity-core 61cd131 (single
squash titled “Fix known issues (#263)”,
2 Sep 2026), /tmp/pcs-infinity-periphery
8261f8d (bin add-liquidity slippage
#95, 2 Sep 2026), /tmp/pcs-infinity-ur
33dbf5a (BytesLib.toLengthOffset bounds
#57, 22 Jul 2026). Hexens / OtterSec /
Zellic PDFs ship in-tree. No mainnet
interaction.
Immunefi known issues — do not refile: 1291 (UniversalRouter OnlyMintAllowed bypass via INCREASE_FROM_DELTAS + TAKE_PAIR), 1298 (CL MINT_POSITION_FROM_DELTAS / _increaseFromDeltas slippage; Uniswap v4-periphery #517), 1493 (exact-output partial fill). OFT issues go to LayerZero. Website scope is only pancakeswap.finance.
Files: core Vault / VaultToken /
SettlementGuard / AppDeficit /
VaultReserve / ProtocolFees /
ProtocolFeeController / Hooks /
CLPoolManager / CLPool / CLHooks /
BinPoolManager / BinPool /
BinHooks / BinHelper; periphery
SlippageCheck / DeltaResolver /
SafeCallback / BaseActionsRouter /
InfinityRouter / CLPositionManager
FROM_DELTAS / BinPositionManager
add/remove; UR UniversalRouter /
Dispatcher / InfinitySwapRouter /
Payments / BytesLib / Lock.
Checked for: lock that releases with an
unrepaid app reserve overdraft; hook
that takes another app’s physical
tokens via the shared vault pot;
collectFee vs floored reserves;
sync sandwich from a hook or token
callback; donate on empty liquidity;
first-bin share inflation;
afterMint/afterBurn hook delta
unbounded vs official routers;
BIN_ADD_LIQUIDITY_FROM_DELTAS without
amountMax / share min; UR
INFI_SWAP forwarding position-manager
actions; leftover TRANSFER of another
user’s tokens; BytesLib length/offset
OOB after #57.
Result: no user-exploitable finding beyond the listed known issues.
- Vault
lockrequires zero unsettled settler deltas andAppDeficit.count() == 0. Mid-lock_accountDeltaForAppfloorsreservesOfAppat 0 and records a transient per-(app, currency) deficit (the #263 JIT-hook underflow fix). Cross-app deposit cannot repay another app’s deficit (in-repoVaultAppDeficittest).take/mint/settle/clear/burnareisLocked.collectFeeis registered-app only, not locked, and underflows while a deficit has floored the reserve.syncis public; a hook that resets VaultReserve after a user transfer zeros the nextsettleand the lock reverts (CurrencyNotSettled). Same lock, whole tx reverts. - CL donate reverts
NoLiquidityToReceiveFees. Bin donate reverts on empty active bin and, separately, ifshareOfBin[active] < minBinShareForDonate(default2**128, so donate is owner-gated). - First bin mint locks
MINIMUM_SHARE1e3 and reverts if the minter would receive 0. Burns round down. Last burn that leaves only the min share drops the bin from the tree; reserves for the lock stay. - Swap hook specified-delta cannot flip
exact-in/out
(
HookDeltaExceedsSwapAmount). Unspecified afterSwap delta is paid by the caller.afterMint/afterBurn/ CL after-modify hook deltas are unbounded — users opt into the hook. Official BinPositionManager nowvalidateMaxInplus per-binminLiquidities(#95). CL FROM_DELTAS still usesvalidateMaxInon principal only (known issue 1298). - UR
INFI_SWAPcallsInfinityRouter._executeActions. That router only handles CL/Bin swaps and SETTLE/TAKE — not position-manager mint/increase. NoOnlyMintAllowedcommand remains in33dbf5a.TRANSFER/SWEEPmove the router’s own balance; leftover from a caller who skipped SWEEP is the next caller’s (same Uniswap UR pattern).toLengthOffsetreverts if32*length + relativeOffsetexceeds the input. Self-reentrancy viaEXECUTE_SUB_PLANis allowed; external reentrancy is not. - Protocol fee is subtracted from bin
/ CL step input before reserves
update and is collected from app
reserves later. Controller is
owner-set;
protocolFeeForPoolcaps each direction at 0.4%.
Not submitted. Remaining Pancake listed
Solidity: pancake-v3-contracts and
pancake-swap-periphery (older V3/V2
trees added the same day). Next leftover:
Mux3 (logged below) or Twyne
Sourcify-404 vaults.
2026-09-03: Mux3 core trade + pool + orderbook (8674f2b)
Immunefi program mux ($100,000, kyc: false). mux3-protocol tree added 17 Mar
2025. Local clone /tmp/mux3 at
8674f2b. No mainnet interaction.
Files: core/trade/{FacetPositionAccount, FacetOpen,FacetClose,PositionAccount}.sol,
orderbook/OrderBook.sol,
libraries/{LibOrderBook2,LibCodec}.sol,
pool/CollateralPool.sol (add/remove/
rebalance), peripherals/Swapper.sol
(swapAndTransfer).
Checked for: deposit into a stranger's positionId; withdraw that skips MM after fees; liquidate of a solvent account; LP remove that spends reserved collateral; swapper that keeps tokens on failure; broker-less fill.
Result: no user-exploitable finding.
- PositionId encodes
address || index. OrderBook deposit / withdraw / modify requiredecode(positionId) == msg.senderunlessDELEGATOR. Fills, liquidate, ADL, and rebalance-fill areBROKER_ROLE. Core trade facets areORDER_BOOK_ROLE. - Deposit: OrderBook pulls tokens to the
facet, then
_depositToAccountcredits wad. Sub-1e18 amounts on tokens with decimals > 18 credit 0 (dust donation to the core, user self-grief). - Withdraw deducts wad, sends raw to
Swapper. Failed / skipped swap transfers
tokenIntopositionAccount.owner. Partial withdraw then requires leverage and IM safe.withdrawAllrequiresactiveMarkets.length == 0. - Open/close size must be a lot multiple. Fees come from collateral. Close realizes capped PnL then requires MM safe. Liquidate gathers all markets, requires MM unsafe including pending borrowing, closes profits then losses.
- Reallocate is broker-only;
toPoolreservedUsd <= collateralUsd. - LP add/remove
onlyOrderBook. Shares =(amount - fee) * price / nav. Remove burns shares held by the pool and refuses if new collateral USD < reserved. Rebalance sends token0 then expects collateral back under slippage. - Swap paths are admin
SET_ROUTE_ROLE.receive()only accepts WETH.
Not submitted. Remaining Mux: mux-protocol core/orderbook (Aug 2025 leftover), aggregator proxyFactory / gmxV2 (logged below), mux-degen, mux-staking.
2026-09-03: Obyte Coop AA leftover (d7d5e57)
Immunefi program obyte
($50,000, kyc: false).
22 Jun 2026 leftover
byteball/coop-aa
(Autonomous Agent for
Obyte Coop). Official
clone /tmp/obyte-coop-aa
at d7d5e57 (“fix
total_votes_bal
accounting after
partial withdrawal” —
the whole tree, not a
follow-up delta). Custom
OOS: fund-loss under
$1,000; attacker expense
≥ 50% of damage. No
mainnet interaction.
Files: coop.oscript
(deposit, withdraw, claim,
vote, replace, update_user
emission index,
check_attestation) and
governance.oscript
(commit / vote / unvote /
update_user_balance).
Checked for: withdraw that
leaves total_votes_bal
high so later emissions
overpay; claim that mints
without a liquid accrual;
deposit referral that
credits a stranger; vote
that adds strength without
a 1-year lock; governance
commit before the
challenge window;
update_user skipped on
withdraw that lets an
exited voter steal
principal.
Result: no user-exploitable finding. Not submitted.
- Deposit requires a
messaging attestation
and either a real-name
attestation or
min_balance_instead_of_real_name. AAs are refused. One messaging / real-name id per address. Unlock term is 365–3650 days and cannot move backward.total_votes_bal += amount * existing votesso new deposits immediately scale prior votes. - Referrer is first-deposit
only, must already exist,
and must unlock ≥ 1 year
out. The deposit-share
payment is
issued-by-definer. The
fixed
referral_rewardis state inflation capped bymin(referral_reward, user.total_balance, referrer.total_balance)and added to both balances. - Withdraw pays
min(balance, 4e15)COOP plus all remaining bytes and storedliquid_balance. It subtracts(total_balance - new_balance) * votesfromtotal_votes_bal(the named partial- withdraw fix). Votes persist until 90-day expiry (by design; exited voters can still accrue the vote-share of new emissions, not other users’ deposits). Withdraw does not call$update_user, so unaccrued locked emissions stay unminted (self-loss, not theft). - Claim calls
$update_userfirst, then mints storedliquid_balanceand zeroes it. Restake folds the remainder into locked balance andtotal_lockedand can extend unlock +1 year. - Vote strength is 0–3;
self-vote is
3 * sqrt(balance). Target and voter must unlock ≥ 1 year out.delete_expired_votesonly removes votes past$vote_lifetime. - Governance names are a
fixed list. Daily
locked/liquid rewards
are capped at 0.1.
commitrequires the 3-daychallenging_period. Permissionlessupdate_user_balanceonly rescales existing support to currentsqrt(total_balance).
Next leftover: remaining
Obyte friend-aa /
prediction-markets-aa /
counterstake-bridge, or
Mux mux3-protocol, or
Twyne Sourcify-404
vaults. Not submitted.
2026-09-03: Obyte Friends AA leftover (45019f9)
Immunefi program obyte
($50,000, kyc: false).
3 Mar 2026 leftover
byteball/friend-aa
(Autonomous Agent for
Obyte Friends). Official
clone /tmp/obyte-friend-aa
at 45019f9 (“higher
limit when resetting
votes”). Custom OOS:
fund-loss under $1,000;
attacker expense ≥ 50%
of damage. No mainnet
interaction.
Files: friend.oscript
(deposit, connect /
followup, withdraw,
replace, ghost admin),
rewards.oscript /
rewards2.oscript
(library-only getters),
governance.oscript.
Checked for: friendship
handshake that mints
against another user’s
principal; followup that
pays twice; deposit-asset
oracle that overvalues
and inflates rewards;
withdraw that leaves
total_locked high;
governance commit of a
malicious rewards_aa
without a challenge;
user2 always-eligible
path that drains the AA.
Result: no user-exploitable finding. Not submitted.
- Deposit requires
messaging attestation
plus real-name or
min_balance_instead_of_real_name(default 5e9 FRD). AAs are refused. Term 365–3650 days, cannot move backward. Max 3 extra deposit assets. Referrer deposit-share is issued-by-definer and requires unlock ≥ 1 year. - Connect is a two-sided
handshake inside a
10-minute window. One
new friend per address
per calendar day. Both
unlock dates must be
≥ 1 year (ghosts
excepted). Rewards are
1% locked / 0.1%
liquid of
reducer-adjusted
balance (
rewards2doubles those shares). Non-new-user balances cap at 200e9. New-user and referral bonuses aremin(10e9, balances). Followups use the friendship’s frozenfollowup_reward_share(default 0.1) and a 10-day claim window. $are_eligibletreats user2 as eligible whenin_friend_price > 0(commented: they will not complete if they do not want to pay). That is issuance policy, not a drain of other users’ deposits.- Hardcoded
$ghost_admincan add ghost accounts with 100e9 FRD not intotal_locked(admin trust). Ghost connect resets the caller’s streak. - Withdraw after unlock
pays FRD, all bytes,
and up to 3 deposit
assets, then zeroes
balances.total_lockedonly tracks FRD. - Replace uses
ceiling_pricefor bytes andexchange_rates.maxfor deposit assets (conservative out). Pool rates come from an oswap AA’srecent.current/prevpmin/pmax. - Governance names are
a fixed list.
rewards_aamust be an AA.commitneeds the 3-daychallenging_period. Permissionlessupdate_user_balanceonly rescales support.
Next leftover: remaining
Obyte
prediction-markets-aa /
counterstake-bridge, or
Mux leftover
(mux-protocol / aggregator
/ degen / staking), or
Twyne Sourcify-404
vaults. Not submitted.
2026-09-03: Obyte prediction-markets AA leftover (1292a09)
Immunefi program obyte
($50,000, kyc: false).
19 Aug 2025 leftover
byteball/prediction-markets-aa
(Prophet / prophet.ooo).
Official clone
/tmp/obyte-prediction at
1292a09 (“solvency
checks”). Custom OOS:
fund-loss under $1,000;
attacker expense ≥ 50%
of damage. No mainnet
interaction.
Files: agent.oscript
(define / mint / redeem /
add_liquidity / commit /
claim_profit),
aa-lib.oscript
(library-only LMSR-style
math), factory.oscript.
Checked for: redeem that
pays more reserve than
the curve holds; claim
that pays losing tokens;
commit before
event_date; mint after
result; first-LP ratio
that inflates supply
above reserve; factory
that overwrites another
market’s params;
to that redirects a
stranger’s tokens.
Result: no user-exploitable finding. Not submitted.
- Market reserve is
coef * hypot(yes, no, draw). Issue / redeem fees and a 90% arb-profit tax stay in the reserve and raisecoef. Soft bounce returns reserve on curve errors; sending outcome tokens on error hard-bounces so they come back. - Trading is closed from
event_date - quiet_perioduntilevent_date + waiting_period(default 5 days). After a committed result, mint / redeem refuse (result already exists). After the wait with no result, trading reopens (by design). - End-of-trade solvency:
new_reserve <= balance[reserve] - payoutand reserve growth cannot exceed the added reserve (the named solvency commit). add_liquiditymints pro-rata yes/no/draw. First LP sets weights viasqrt(ratio)sohypotequals the deposited reserve.commitis permissionless afterevent_dateand reads the creator-chosen oracle feed. Draw wins only when the yes comparison is false and the feed equalsdatafeed_draw_value. Oracle choice is market-creator trust.claim_profitpaysfloor(winner_amount / winner_supply * reserve)and requires a positive winner amount. Losing tokens sent in the same unit are burned without payout (self-loss). Last winner gets the remaining reserve (winner_amount == supply).- Factory
chash160s params so a duplicate market is refused. Asset definition is sequential via the factory bounce. Fees must be in[0, 1).
Next leftover: remaining Obyte Counterstake (logged below), Mux leftover (mux-protocol / degen / staking; aggregator logged below), or Twyne Sourcify-404 vaults. Not submitted.
2026-09-03: Obyte Counterstake bridge leftover (530fb8b)
Immunefi program obyte
($50,000, kyc: false).
10 May 2022 leftover
byteball/counterstake-bridge
(Counterstake.org
Obyte↔EVM/BSC). Official
clone /tmp/obyte-counterstake
at 530fb8b. Custom OOS:
fund-loss under $1,000;
attacker expense ≥ 50%
of damage. No mainnet
interaction.
This pass: EVM
Counterstake /
CounterstakeLibrary /
Export / Import and
Obyte aas/export.oscript
aas/import.oscriptclaim / challenge / withdraw. Remaining: assistants, factories, governance,evm-v1.0.
Checked for: double-claim
of the same transfer;
withdraw of a losing
stake; third-party claim
that spends other users’
locked reserve before
stake is posted; challenge
after expiry; Import mint
without a matching burn;
withdraw(to) that
redirects another
staker’s winnings.
Result: no user-exploitable finding beyond the documented optimistic-verification model (watchdogs must challenge fraudulent claims). Not submitted.
- Claim id is
sender_recipient_txid_txts_amount_reward_data(underscores banned in sender/txid). Same underlying tx with a different reward is a new id — watchdogs challenge the unmatched one. claimisnonReentrant. Stake must covermax(amount * ratio, min_stake)(Export) or oracle*ratiofloored bymin_price20(Import).txts + min_tx_agemust be in the past. Negative reward forbids third-party claiming.- Third-party claim
deposits
stake + (amount - reward)then immediately pays the recipient the prepaid amount (assistant float). Net contract change is +stake. A successful withdraw then paysamountfrom the locked/minted pool. - Challenge must flip the
current outcome and
meet
current * coef/100(default 1.5x). Excess is refunded. Periods are ≥ 12h and non-decreasing. finishafter expiry pays each winning staker(yes+no) * my / win. Only the claimant additionally receivesamount, and only once (withdrawn).withdraw(to)looks upto’s stake and paysto(permissionless harvest, not theft).- Import mints on
successful claim /
withdraw and burns on
transferToHomeChain. Export locks ontransferToForeignChainand unlocks on a winning repatriation claim. - Obyte AAs use the same hash, stake, and period rules (periods in hours).
Next leftover: Counterstake assistants / factories / governance, or Mux leftover (mux-protocol / degen / staking; aggregator logged below), or Twyne Sourcify-404 vaults. Not submitted.
2026-09-03: Mux aggregator proxyFactory + GmxV2 leftover (0f36131)
Immunefi program mux
($100,000, kyc: false,
smart-contract rewards
are critical-only). Whole
mux-aggregator-protocol
repo listed 28 Aug 2024;
leftover folders
contracts/proxyFactory
and
contracts/aggregators/gmxV2
added 28 Aug 2025. Local
clone /tmp/mux-agg at
0f36131 (“distribute
gmx2 ETH when not debt”).
In-repo README: keeper
never calls
GmxV2Adapter.liquidate
since Dec 2023; GMX1
adapter unsupported since
Mar 2025; GMX2 borrowing
disabled since Mar 2025.
Program OOS: test /
oracle / reader
folders; listed ConsenSys
/ OpenZeppelin /
Quantstamp audit issues.
No mainnet interaction.
Files:
proxyFactory/{ProxyFactory, DebtManager,ProxyBeacon, Storage,ProxyConfig}.sol,
aggregators/gmxV2/{GmxV2Adapter, libraries/{LibGmxV2,LibDebt, LibSwap,LibConfig,LibUtils}}.sol,
lendingPool/LendingPool.sol
(2024 whole-repo asset).
Checked for: factory calldata that places a mux / mux3 order for a stranger; CREATE2 proxy that binds a victim key; borrow that skips the created-proxy check; GmxV2 callback that pays the caller; swapPath that drains another account; lending-pool share inflation; permissionless liquidate of a solvent account.
Result: no user-exploitable critical. Not submitted.
- Proxy id is
keccak(projectId, account, collateral, asset, isLong).proxyFunctionCall2/transferToken2/muxFunctionCall/mux3PositionCall/ cancel requiremsg.sender == accountor an owner-setDELEGATOR. mux3positionIdowner is the high 160 bits (address || uint96, same as Mux3). - Beacon
create2writes_proxyProjectIds[predicted] = projectIdbefore deploy soimplementation()works duringinitialize. Salt includes the owner._isCreatedProxyisprojectId != 0(ids are 1 = GMX1, 2 = GMX2). borrowAsset/repayAssetrequire a created proxy and a matching projectId. FactorytotalDebtis tracked, not raw ERC20 on the factory._getLiquiditySourcewrites_liquiditySource[projectId]but reads_liquiditySource[sourceId]. For live ids 1 and 2 this coincides whensourceId == projectId(GMX2 + lending = 2). Do not file without a live project that setssourceId != projectIdand a proven fund path. GMX2 borrow is disabled.- GmxV2
placeOrderis owner or factory. Callbacks accept keeper or GMXCONTROLLER. After a decrease fill, leftover adapter collateral refunds toaccount.ownerif the GMX position is still IM-safe; if size is 0, debt is repaid from adapter balance (and the secondary token). Keeper-supplied liquidate prices are privileged (default OOS). - UniV3
swapPathis user-chosen;tokenIncannot be the position collateral. Tokens must already sit on that adapter. - LendingPool
depositincrementssupplyAmountafter the pull. Withdraw is owner. Borrow / repay areonlyBorrower. Donations that skipdepositdo not inflate withdrawable supply.
Not submitted. Remaining
Mux: mux-protocol
components / core /
governance /
libraries / orderbook
(28 Aug 2025 leftover),
mux-degen (logged
below), mux-staking.
Aggregator
aggregators/gmx is the
unsupported GMX1
adapter.
2026-09-03: Obyte Counterstake assistants leftover (530fb8b)
Same Immunefi program
obyte and clone
/tmp/obyte-counterstake
at 530fb8b. Remaining
listed Solidity / AAs
after the claim path:
EVM ExportAssistant /
ImportAssistant /
AssistantFactory /
CounterstakeFactory /
Governance /
VotedValue, plus Obyte
aas/export-assistant.oscript
(import-assistant AA is
the same LP + manager
pattern). evm-v1.0 is
the prior deployment
tree, not re-reviewed.
No mainnet interaction.
Checked for: LP redeem
that spends
balance_in_work;
manager claim that
over-stakes past net
balance; recordLoss on
a winning claim;
recordWin that mints
unearned profit; Import
swap that drains the
in-work reserve;
factory re-init of a
live clone.
Result: no user-exploitable finding beyond manager-trust (the assistant bot is supposed to stake LP funds). Not submitted.
- Both assistants are
manager-gated for
claim/challenge. Stake is capped by current net balance (gross − MF − success fee − network-fee reserve). Infinite approve is to the paired bridge only. - Shares: first mint
requires ≥ 1e6 units.
Later mints use
balance^(1/exponent)(1/2/4). Redeem pays only risk-free net (net − unavailable profit − balance_in_work) and chargesexit_fee. Profit diffuses over 10 days by default (governance-capped at 365 days). onReceivedFromClaimisonlyBridge.recordLossis permissionless after expiry and requires a losing stake and zero winning stake.recordWinrebuilds the missed payout; Export assumes a 1% claimant reward (documented accounting slack, not a drain).- Import assistant is a
two-asset CPMM. Swaps
use risk-free balances
and
min_amount_out. Redeem also chargesswap_feeso buy+redeem is not a free swap. - Factories
Clones+init*+setupGovernance. Init is once (governance == 0/governedContract == 0). Default challenge periods are 72h+. - Governance: 10-day
challenge + 30-day
freeze before a vote
can move. Withdraw
requires untying every
vote.
addVotedValueis governed-contract only.
Listed Counterstake
GitHub leftover is
exhausted (evm-v1.0 is
the old pin). Next
leftover: Mux leftover
(mux-protocol /
staking; degen logged
below), or Twyne
Sourcify-404 vaults.
Not submitted.
2026-09-03: Mux degen pool leftover (c5bfe81)
Immunefi program mux
($100,000, kyc: false,
smart-contract rewards
are critical-only).
mux-degen-protocol
listed 28 Aug 2024 (same
day as the aggregator
repo). Local clone
/tmp/mux-degen at
c5bfe81 (“add
comment”). Program OOS:
test / oracle /
reader. No mainnet
interaction.
Files:
facets/{Trade,Liquidity, Account}.sol,
orderbook/OrderBook.sol,
libraries/{LibOrderBook, LibPoolStorage,LibAsset, LibSubAccount, LibReferenceOracle}.sol.
Checked for: deposit into
a stranger’s
subAccountId; first-LP
MLP inflation; remove
that spends reserved
spot; liquidate of a
solvent account;
broker-less fill.
Result: no user-exploitable critical. Not submitted.
subAccountIdisaccount || collateralId || assetId || isLong. Place / deposit / withdraw-all requireowner() == msg.senderor an owner-setDELEGATOR. Fills, liquidate, ADL, and broker rebate areBROKER_ROLE. Pool facets areonlyOrderBook.- Deposit: OrderBook
_transferInto the pool, thendepositCollateralcredits wad. Pool does not pull ERC20. - First MLP mint uses
nav
1e18. AUM is trackedspotLiquidity± capped trader PnL, not raw ERC20.donateincreases spot without minting. Remove burns MLP held by the OrderBook and refuses if reservation USD > pool USD without PnL. - Open/close size must be a lot multiple. Fees come from collateral. Close requires MM safe after the fill. Liquidate requires MM unsafe including pending funding (mark prices are broker-supplied, then Chainlink- truncated when a reference oracle is set).
- Funding is permissionless on the interval; traders pay LP, never each other.
Not submitted. Remaining Mux: mux-protocol folders (logged below) and mux-staking.
2026-09-03: Mux protocol v1 core leftover (0f70a70)
Immunefi program mux
($100,000, kyc: false,
smart-contract rewards
are critical-only).
Listed leftover folders
added 28 Aug 2025:
contracts/components,
core, governance,
libraries,
orderbook. Local clone
/tmp/mux-v1 at
0f70a70 (“a better
protection to asset
price”). Program OOS:
test / oracle /
reader. No mainnet
interaction.
Files:
core/{Trade,Liquidity, Account,LiquidityPool}.sol,
orderbook/OrderBook.sol,
libraries/{LibOrderBook, LibAsset,LibSubAccount, LibReferenceOracle}.sol,
components/NativeUnwrapper.sol,
governance/{Vault,POL, MuxTimelock}.sol.
Checked for: aggregator or owner bypass that places a stranger’s order; MLP add that mints against a broker-chosen zero nav; remove that over-pays spot; liquidate of a solvent account; unwrapper that sends ETH to the caller.
Result: no user-exploitable critical. Not submitted.
placePositionOrder3anddepositCollateralrequiregetSubAccountOwner == msg.senderunlessaggregators[msg.sender](owner-set, the Mux aggregator factory). Fills / liquidate / rebate areonlyBroker. Pool hops areonlyOrderBook.- Deposit: OrderBook
_transferInfrom the owner to the pool, then credits wad. - Add liquidity
transfers pre-minted
MLP from the pool at a
broker
mlpPriceclamped tomlpPriceLowerBound/UpperBound. Token price is Chainlink-truncated with bid/ask spread. Spot is trackedspotLiquidity, not raw ERC20. Remove refuseswad > spotLiquidity. - Open requires IM safe. Close requires MM safe. Liquidate requires MM unsafe including funding.
NativeUnwrapper.unwrapis whitelist-only (the pool). Failed ETH send re-wraps WETH to the trader.- Vault / POL transfers
are
onlyOwner. Timelock is standard OZ-style.
Not submitted. Remaining
Mux listed Solidity:
mux-staking only
(GitHub 404 as of 3 Sep
2026; cannot open).
2026-09-03: Threshold tBTC BOB cross-chain leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Unique GitHub leftover
added 24 Oct 2025:
threshold-network/tbtc-v2
cross-chain/bob/contracts.
Local clone /tmp/tbtc-v2
at 502cd39. Do not
refile known issues 1308
(rebate timestamp), 1494
(closeable wallets),
1320 (relayer
reimbursement), 1496
(cross-chain redemption
timeout), 1426 (Sui
minter cap), 1410
(TOB-TBTCACEXT-30).
No mainnet interaction.
Files:
TokenPoolUpgradeable.sol,
BurnFromMintTokenPoolUpgradeable.sol,
LockReleaseTokenPoolUpgradeable.sol,
canonical/L2TBTC.sol,
OptimismMintableUpgradableTBTC.sol,
libraries/RateLimiter.sol,
Timelock.sol.
Checked for: permissionless
mint on L2; CCIP
releaseOrMint that
skips the source-pool
check; lock that does
not require an onRamp;
decimal scale that mints
more than burned;
legacy OP-bridge burn
of CCIP-minted supply;
rebalancer drain by a
stranger.
Result: no user-exploitable finding. Not submitted.
- Pool
lockOrBurn/releaseOrMintrequire the CCIP router onRamp / offRamp for that chain, a configured remote pool, and an uncursed RMN. Inbound / outbound token- bucket rate limits apply when enabled. - Burn-mint burns from
the pool after the
ramp has already
transferred in.
Lock-release only
emits
Locked(same CCIP pattern) and releases from tracked pool balance. _calculateLocalAmountrounds down when the dest has fewer decimals and reverts on overflow. EmptysourcePoolDatafalls back to local decimals (documented backwards-compat).L2TBTC.mintis owner-listed minters only. Guardians pause mint/burn.recover*is owner.- OP-mintable v2
legacyCapRemainingstarts attotalSupply. Bridge mints increase it; other minters do not. While the cap is > 0, onlyBRIDGEcanburnFrom/ legacyburn(from, amount), so the OP bridge cannot burn CCIP-minted tokens. - Lock-release
withdrawLiquidityis the owner-set rebalancer. Timelock is OZTimelockControllerwith adminaddress(0).
Not submitted. Remaining
Threshold listed assets
are explorer addresses
plus
keep-network/tbtc-v2
typescript (not a
Solidity money path).
Next leftover: Pancake
V3 MasterChef / LmPool
- V2 periphery (logged below), remaining V3 core / NPM fork, or Twyne Sourcify-404 vaults.
2026-09-03: Pancake V3 MasterChef/LmPool + V2 periphery (9868479 / d769a6d)
Immunefi program
pancakeswap. Listed
leftover after Infinity:
pancake-v3-contracts
and
pancake-swap-periphery.
Local clones
/tmp/pancake-v3 at
9868479 (“chore:
Remove router”) and
/tmp/pancake-periphery
at d769a6d. Local
static read of
projects/masterchef-v3/contracts/MasterChefV3.sol,
projects/v3-lm-pool/contracts/PancakeV3LmPool.sol,
PancakeRouter.sol,
PancakeLibrary.sol.
No mainnet interaction.
No finding.
MasterChefV3 holds the
V3 NFT. onERC721Received
requires a listed pid
and a live LM pool.
Harvest / withdraw /
decrease / collect
require
positionInfo.user == msg.sender. Permissionless
updateLiquidity only
accrues rewards to the
position (_to == 0)
and resyncs LM ticks
from the NFT.
increaseLiquidity is
also unscoped on owner
(anyone may gift tokens
into a staked NFT).
Boost is clamped to
[1x, 2x]. LM pool
accumulateReward /
updatePosition are
pool-or-MC only.
crossLmTick is
pool-only. V2 router is
the UniV2 pattern with
Pancake 0.2% fee
(998/1000) and a
CREATE2 init-code hash;
deadline + amountMin
protect swaps. sweepToken
/ unwrapWETH9 are the
usual leftover-balance
helpers; CAKE sweep
subtracts
cakeAmountBelongToMC.
Keeper V2
performUpkeep is
onlyRegister.
Emergency flag is
owner-only and skips
LM updates so users
can still withdraw
the NFT. Do not
refile Infinity known
issues 1291 / 1298 /
1493.
Not submitted. Remaining
Pancake listed Solidity:
v3-core pool/factory
and v3-periphery NPM
(same 9868479 tree;
logged below).
2026-09-03: Pancake V3 core pool/factory + v3-periphery leftover (9868479)
Immunefi program pancakeswap
($1,000,000, kyc: false).
MasterChef / LmPool + V2
periphery leftover is already
logged. Remaining listed
Solidity on the same pin:
v3-core pool / factory and
v3-periphery (SwapRouter
removed in 9868479). Local
clone /tmp/pcs-v3 at
9868479. No mainnet
interaction. Infinity known
issues 1291 / 1298 / 1493
do not apply here.
Files:
projects/v3-core/contracts/PancakeV3Pool.sol,
PancakeV3Factory.sol,
projects/v3-periphery/contracts/NonfungiblePositionManager.sol,
base/PeripheryPayments.sol.
Checked for: stranger collect of an NFT; protocol-fee siphon via factory; leftover ETH / token sweep of user funds; LM attach that steals swap fees.
Result: no user-exploitable critical. Not submitted.
- Pool is Uniswap V3 plus
protocol fee
(
feeAmount * feeProtocol / PROTOCOL_FEE_DENOMINATOR) andlmPool.accumulateReward/crossLmTickon swap.setLmPool/setFeeProtocol/collectProtocolareonlyFactoryOrFactoryOwner.collectProtocolleaves 1 wei in the slot. - Factory
setFeeProtocol/collectProtocolareonlyOwner.setLmPoolisonlyOwnerOrLmPoolDeployer. - NFT manager
decreaseLiquidity/collect/burnuseisAuthorizedForToken.increaseLiquidityis unscoped (gift into any position — self-loss, not theft). PeripheryunwrapWETH9/sweepToken/refundETHare the usual leftover-balance helpers;receiveis WETH-only.
Not submitted. Listed Pancake GitHub leftover is exhausted (Infinity + MasterChef / LmPool + V2
- v3-core + v3-periphery).
2026-09-03: Obyte City AA leftover (4a0a53f)
Immunefi program obyte
($50,000, kyc: false).
19 Aug 2025 leftover
byteball/city-aa
(Autonomous Agent for
Obyte City). Local clone
/tmp/obyte-city-aa at
4a0a53f (“renounce
replicator”). Custom OOS:
fund-loss under $1,000;
attacker expense ≥ 50% of
damage. No mainnet
interaction.
Files: city.oscript,
city-lib.oscript,
governance.oscript,
random.oscript.
Checked for: leave that
refunds a stranger’s plot;
p2p buy that underpays
the seller; build that
self-matches after a
transfer; followup that
credits a third party;
replicator drain after
renounce; governance
commit before the
challenge window.
Result: no user-exploitable finding. Not submitted.
- Buy requires attestation
and exact
plot_price * (1+buy_fee).buy_from_balancespends the caller’s followupbalance_. Mayor plots are amount-0 and become mayor houses. - Leave / sell / transfer /
rent / edit are
owner-gated. P2P buy
pays
sale_price - feeto the old owner. Transfer after matching is refused (later plot any transfer; earlier plot if after plot2.ts). Rental expansion after plot2.ts is refused. - Build is a two-sided
10-minute handshake.
Reward mints four new
plots of
min(plot1, plot2)(designed inflation; houses cannot be left). - Followup is the same
handshake; reward is
frozen at first request
(
followup_reward_share * house1.amount) and credited to both house owners’ internal balances. - Replicator
(
GAFNBCPR…) can copy vars and restore outputs untilrenounce. After$constants.renounced,$is_replicator_requestis false. - Governance names are a
fixed list;
commitneeds a 3-day challenge. New city needs 75% oftotal_land. Randomness allocation israndomness_aa-only.
Not submitted. Remaining
Obyte listed AAs:
perpetual-aa (logged
below), oswap-token-aa,
token-registry-aa,
obyte-cascading-donations.
2026-09-03: Obyte perpetual AA leftover (126cdd0)
Immunefi program obyte
($50,000, kyc: false).
19 Aug 2025 leftover
byteball/perpetual-aa
(Pythagorean perpetual
futures). Local clone
/tmp/obyte-perpetual-aa
at 126cdd0 (“require VP
to vote and check leader
before committing”).
Custom OOS: fund-loss
under $1,000; attacker
expense ≥ 50% of damage.
No mainnet interaction.
Files: perpetual.oscript,
factory.oscript,
staking.oscript,
staking-lib.oscript,
price.oscript.
Checked for: redeem that
pays more reserve than the
invariant; presale withdraw
of a stranger’s
contribution; staking AA
that drains
total_staker_fees; claim
that mints above the
launched supply; hop that
forwards into staking.
Result: no user-exploitable finding. Not submitted.
- Trade is the Pythagorean
invariant
r'^2 - r^2 = a c^2 (s'^2 - s^2) * (1 - fee). Sell payout isr - new_r_gross(fees stay in reserve / staker pot). Buy mintsfloortokens after arb-profit tax. Sameinitial_addresscan merge trades within 1s (designed). - Presale add/withdraw is
per-address
contribution_. Claim after launch mintsfloor(contribution / initial_price)and clears the slot. withdraw_staker_feeson the perp AA is staking-AA-only and decrementstotal_staker_fees. Staking paysfloor(user rewards.r)afterdistribute_emissions. Unstake is after expiry and requires a full asset0 exit.- Parameter / asset adds come only from staking governance (fixed name list; 5-day default challenge). Factory clamps swap_fee / min_s0_share < 1.
- Hops refuse
address == staking_aa. Price AAs are governance-set (oracle trust, not a theft path).
Not submitted. Remaining
Obyte listed AAs:
oswap-token-aa (logged
below), token-registry-aa,
obyte-cascading-donations.
2026-09-03: Obyte OSWAP token AA leftover (461e860)
Immunefi program obyte
($50,000, kyc: false).
19 Aug 2025 leftover
byteball/oswap-token-aa
(OSWAP token). Local clone
/tmp/obyte-oswap-token-aa
at 461e860
(“replication”). Custom
OOS: fund-loss under
$1,000; attacker expense
≥ 50% of damage. No
mainnet interaction.
Files: oswap.oscript,
oswap-lib.oscript,
initial-sale-pool.oscript.
Checked for: redeem that pays more reserve than the invariant; unstake of a stranger’s stake; LP withdraw of another address’s tokens; reward claim that double-mints emissions; replicator drain after renounce.
Result: no user-exploitable finding. Not submitted.
- Trade is the same Pythagorean curve as perpetual (swap fee + arb-profit tax). Appreciation uses a TVL data-feed oracle (oracle trust).
- Stake is
term-locked (≥14 days).
Unstake after expiry
pays the caller’s
user.balanceand forfeits unclaimed rewards. Staking rewards arefloor(user.reward)afterdistribute_stakers_emissions. - LP withdraw is capped
at the caller’s recorded
balance. A third party
can pass
forto update another LP’s accrual without paying them (anti-share-gaming). - Replicator
(
OKQFTRCE…) can copy vars (notconstants/lp_*/pool_asset_balance_*) and restore outputs untilrenounce.
Not submitted. Remaining
Obyte listed AAs:
token-registry-aa,
obyte-cascading-donations
(logged below).
2026-09-03: Obyte cascading-donations AA leftover (2f48482)
Immunefi program obyte
($50,000, kyc: false).
Listed leftover
byteball/obyte-cascading-donations
(kivach.org). Official
clone /tmp/obyte-cascading
at 2f48482 (“doc and
banner”). Local static
read of agent.aa. No
mainnet interaction.
No finding.
Donate credits
repo*pool*asset after a
storage fee (1000 bytes
or 100 to an optional
notification AA).
trigger.data.donor may
attribute ranking to
another address (display
only). Distribute is
permissionless once
rules exist: each dest
repo gets
floor(pool * pct/100)
as pool credit inside
this AA; remainder is
$to_self. Only a
GitHub-attested owner
is paid $to_self + unclaimed; otherwise
remainder stays
unclaimed. Rules sum
must be ≤ 100, ≤ 10
dests, dest ≠ self.
Repo strings are
owner/project with
\w/.- only. The
published tree hardcodes
the testkit attestor AA
(mainnet IDs are
commented). That is a
deploy-time constant,
not a user drain of a
live kivach AA that
uses the mainnet
attestor.
Not submitted.
2026-09-03: Obyte token-registry AA leftover (8d37f20)
Immunefi program obyte
($50,000, kyc: false).
Listed leftover
byteball/token-registry-aa.
Official clone
/tmp/obyte-token-registry
at 8d37f20 (“numbers
are now stored as
numbers”). Local static
read of
token-registry.oscript.
No mainnet interaction.
No finding.
Support deposits
(≥ 1e8 bytes) vote for
a symbol↔asset link.
Withdraw pays only
trigger.address from
that address’s drawer
and only after a locked
drawer’s expiry.
Permissionless move
shifts an expired drawer
to the same address’s
drawer 0 (no payout).
Symbol/asset flips need
a 30-day challenge
unless a new asset is
still in the 30-day
grace window and the
challenger has 5×
support. Description /
decimals votes use the
voter’s existing
balance, not new
payments. Reserved
GBYTE/BYTE names bounce.
Not submitted. Remaining
Obyte listed AAs:
exhausted
(token-registry-aa +
obyte-cascading-donations).
2026-09-03: MtPelerin bridge-v2 leftover (1126cfc)
Immunefi program
mtpelerin ($5,000,
kyc: false). Listed
MtPelerin/bridge-v2
token / rules /
operating / sale files.
Official clone
/tmp/mtpelerin at
1126cfc (“Bumped
version”). Local static
read of
operating/{Processor, RuleEngine,ComplianceRegistry}.sol,
token/abstract/{BridgeERC20, SeizableBridgeERC20}.sol,
rules/{Soft,Hard}TransferLimitRule.sol,
sale/TokenSale.sol,
utils/TokenDispenserQueue.sol,
tokenbridge/Mediator.sol.
No mainnet interaction.
No finding.
Balances live in the
Processor keyed by
_msgSender() (the
token). A stranger
calling Processor
directly only writes
their own unregistered
slot. Token
transferFrom checks
allowance, then
Processor runs each
rule; beforeTransferHook
may rewrite to /
amount (Soft AML hold
sends tokens to the
ComplianceRegistry).
Hooks are
onlyOperator on the
rule (the Processor must
be an operator). Seize /
mint / burn require
token-level seizer /
supplier roles. On-hold
release is keyed by
msg.sender as the
trusted intermediary.
Mediator
transferFroms the
caller then AMB-passes
to a mapped token.
Sale / dispenser are
operator-gated.
Not submitted. Remaining MtPelerin listed files (logged below).
2026-09-03: MtPelerin leftover wrappers + KYC rules (1126cfc)
Immunefi program
mtpelerin ($5,000,
kyc: false). Same
MtPelerin/bridge-v2
tree at 1126cfc. Local
static read of
token/{BridgeToken, CoinBridgeToken, ShareBridgeToken, BondBridgeToken}.sol
and
rules/{UserValidRule, UserKycThresholdFromRule, UserFreezeRule, AddressThresholdLockRule}.sol.
No mainnet interaction.
No finding.
Coin / Bond wrappers
only call
BridgeToken.initialize.
Share adds admin-set
tokenizedShares /
board-resolution
metadata (no money
path). Mint / burn are
onlySupplier. EIP-2612
/ EIP-3009 use typed
hashes, expiry, and
one-time
authorizationStates.
KYC / valid / freeze
rules are view-only
registry lookups
(TRANSFER_VALID_WITH_NO_HOOK
or reject). Address lock
refuses a send that
would leave the sender
below an admin-set
threshold.
Not submitted. Listed MtPelerin GitHub Solidity leftover is exhausted.
2026-09-03: Orderly Vault leftover (462e129)
Immunefi program
orderlynetwork
($100,000, kyc: false).
Listed leftover
OrderlyNetwork/contract-evm
src/ except tUSDC.sol.
Local clone /tmp/orderly-evm
at 462e129 (“Merge
branch 'staging' into
'main'”). This slice is
src/vaultSide/Vault.sol
only. No mainnet
interaction.
Checked for: deposit that credits a stranger’s accountId; permissionless withdraw; withdraw that pays after a failed transfer while the ledger already deducted; delegateSwap that drains without the operator + signer.
Result: no user-exploitable finding. Not submitted.
- Deposit pulls
tokenAmountfrommsg.senderand posts a CC deposit forreceiver. Regular callers must satisfyaccountId == keccak256(receiver, brokerHash). Allowed token / broker, amount- Deposit limit is
documented as soft
(async withdraws).
depositTois a gift.
- Deposit limit is
documented as soft
(async withdraws).
- Withdraw /
withdraw2Contract/ CCTP rebalance areonlyCrossChainManager. Payout istokenAmount - fee. Native / blacklist failures emitWithdrawFailedand leave tokens in the vault (ledger already notified — CC trust). delegateSwapisonlySwapOperator, one-timetradeId, and requiresswapSigner. Arbitraryto+ calldata is the trusted-operator path, not a user theft path.vaultAdaptermay skip accountId checks (owner-set).
Not submitted. Remaining
Orderly listed GitHub:
Ledger / Operator /
Fee / Market managers
and evm-cross-chain
contracts/ (Ledger
withdraw logged below).
2026-09-03: Orderly Ledger withdraw leftover (462e129)
Immunefi program
orderlynetwork
($100,000, kyc: false).
Vault leftover is already
logged. This slice is
Ledger withdraw + deposit
notify on the same pin
462e129. Local clone
/tmp/orderly-evm. No
mainnet interaction.
Files: Ledger.sol,
LedgerImplA.sol
(executeWithdrawAction,
accountWithDrawFinish,
accountWithdrawFail,
accountDeposit),
VaultManager.sol
freeze helpers,
library/Signature.sol,
library/typesHelper/AccountTypeHelper.sol.
Checked for: operator withdraw without a valid user sig; finish that credits a stranger; unfreeze that inflates balance; deposit that registers a hijacked userAddress.
Result: no user-exploitable finding. Not submitted.
executeWithdrawActionisonlyOperatorManager. Requires allowed broker / chain token, accountId matching sender (or strategy-vault id), increasing nonce, ledger balance minus escrow, vault chain balance, EIP-712 sig fromsender(domainOrderly/1,verifyingContractis the Ledger via delegatecall), fee ≤ max, receiver ≠ 0. Bad nonce / sig / escrow emit fail and return. Then freezestokenAmounton the account andtokenAmount - feeon the vault and CCs the vault.- Finish is
onlyCrossChainManager. Clears the nonce freeze (must match exactly) and credits the withdraw-fee collector. Fail (onlyOwner) unfreezes the same amounts. accountDepositisonlyCrossChainManager. First deposit registersuserAddress/brokerHashfrom the CC payload (CC trust).- VaultManager freeze /
add / sub are
onlyLedger.
Not submitted. Remaining
Orderly listed GitHub:
Operator / Fee / Market
managers, LedgerImpl B/C/D
trade / Sol withdraw
paths, and
evm-cross-chain.
2026-09-03: Yearn yCRV token + Boosted Staker leftover (Sourcify)
Immunefi program
yearnfinance
($200,000, kyc: false).
Listed leftover that was
never logged: yCRV token
0xFCc5c47bE19d06BF83eB04298b026F81069ff65b
(22 Feb 2022), yCRV
Boosted Staker
0xE9A115b77A1057C918F997c32663FdcE24FB873f
(22 Oct 2024), and yCRV
Reward Distributor
0xB226c52EB411326CdB54824a88aBaFDAAfF16D3d
(22 Oct 2024). Sourcify
match on all three
(staker / distributor
verified 2024-08-08;
token verified
2025-01-13). Extract
/tmp/yearn-ycrv/{token, staker,distributor}.
Jan 2026 yYB leftover
already logged the same
YearnBoostedStaker /
SingleTokenRewardDistributor
sources on different
addresses. No mainnet
interaction.
Files: Sourcify
Vyper_contract.vy
(yCRV 0.3.7),
YearnBoostedStaker.sol,
SingleTokenRewardDistributor.sol.
Checked for: permissionless
yCRV mint without a CRV /
yveCRV pull; sweep /
sweep_yvecrv of locked
backing; stranger
unstakeFor / claimFor;
distributor pushRewards
that steals a live week's
rewards; stakeAsMaxWeighted
without the owner role.
Result: no user-exploitable finding. Not submitted.
mintpulls CRV to the hardcoded YearnVOTERand mints yCRV 1:1. Donations are non-redeemable. Default_amountismax_valueand uses the caller's CRV balance.burn_to_mintpulls yveCRV to this contract, incrementsburned, and mints 1:1.sweep_yvecrvcan only takebalance - burned.sweepissweep_recipientand cannot take YVECRV.- Staker
stake/unstakeuse even amounts and checkpoint.stakeAsMaxWeightedisapprovedWeightedStaker.stakeFor/unstakeForneedapprovedCaller. OwnersweepsubtractstotalSupplyof the stake token. - Distributor
claim/claimWithRangepay the account or its configured recipient.claimForneedsapprovedClaimer. Skipping weeks in a ranged claim is a documented self-lockout.pushRewardsonly moves a past week with zero adjusted global weight. First-week deposits are excluded from shares viaweightPersistent.
Not submitted. Remaining
Yearn listed leftover:
yvUSD
0x696d02Db93291651ED510704c9b286841d506987
(Sourcify 404; yearn.fi
vault URL, not an impl
this pass can open) and
the 2023 YFI / Woofy
token rows. Do not treat
the already-logged yYB
staker / distributor as
a second finding.
2026-09-03: Hermetica hBTC vault leftover (Hiro)
Immunefi program
hermetica
($100,000, kyc: false).
Listed Clarity (11 Feb
and 31 Mar 2026): HQ,
blacklist, token, state,
reserve, reserve-fund,
controller, fee-collector,
hermetica / zest
interfaces, trading, and
vault vault-hbtc-v1-1.
Hiro
extended/v1/tx/{txid}
source extract under
/tmp/hermetica. Principal
SP1S1HSFH0SQQGWKB69EYFNY0B1MHRMGXR3J1FH4D.
No GitHub tree. Primacy of
Impact row is the marketing
site, not extra code. No
mainnet interaction.
Files: vault.clar,
state.clar,
token.clar,
controller.clar,
hq.clar,
reserve.clar,
trading.clar,
hermetica-interface.clar,
zest-interface.clar,
blacklist.clar.
Checked for: first-depositor
inflation via reserve
donation; share mint
without an sBTC pull;
permissionless
fund-claim that
finalizes a stranger's
claim at a crashed PPS;
redeem that pays the
caller instead of the
claim user; trader
sweep off-reserve;
update-state from a
non-protocol contract.
Result: no user-exploitable finding. Not submitted.
depositpulls sBTC to the reserve, thenupdate-stateaddstotal-assetsand mints shares. PPS isnet-assets * 1e8 / supply(accounting, not the reserve ERC-20 balance). A donation into the reserve does not mint shares and does not change PPS.- Empty vault mints 1:1.
convert-to-sharesdivides bynet-assetswhen supply > 0; a zero-net book would DoS deposits, not inflate. request-redeemmoves shares to the vault.fund-claimafter cooldown is permissionless and snapshots the current accounting PPS, pulls sBTC reserve → vault, and burns the vault's shares.redeempays the claimuser(minus the recorded fee). Express claims cannotcancel-redeem.- Trading / mint / unstake
/ Zest borrow-repay are
check-is-traderplus allowlisted externals.reserve.transferrequires both caller and recipient to be PROTOCOL. Token mint/burn is protocol-only. log-rewardis rewarder-only and is capped bymax-rewardandmax-deviation.settle-pendingis manager-only.
Not submitted. Listed Hermetica Clarity is exhausted. Next leftover: Yearn yvUSD (Sourcify 404) / YFI / Woofy, Twyne Sourcify-404 vaults, or another unreviewed no-KYC slug (beanstalk / cowprotocol / staderforeth have older trees).
2026-09-03: Orderly evm-cross-chain leftover (9a8ba76)
Immunefi program
orderlynetwork
($100,000, kyc: false).
Listed leftover
OrderlyNetwork/evm-cross-chain
/contracts/ except
contracts/test and the
vendored contracts/layerzero
UA copy. Local clone
/tmp/orderly-xchain at
9a8ba76 (“init”). Vault
and Ledger withdraw on
contract-evm 462e129
are already logged. No
mainnet interaction.
Files:
VaultCrossChainManagerUpgradeable.sol,
LedgerCrossChainManagerUpgradeable.sol,
CrossChainRelayUpgradeable.sol,
utils/OrderlyCrossChainMessage.sol,
proxies.
Checked for: a forged LZ
payload that credits a
deposit or pays a
withdraw; srcChainId
spoof that inflates
convertDecimal;
permissionless
receiveMessage on the
managers; relay
onlyCaller that includes
a stranger.
Result: no user-exploitable finding. Not submitted.
- Relay
lzReceiveis endpoint-only and requires the owner-settrustedRemoteLookup._blockingLzReceiveremaps the LZ chain id and forwards the innerMessageV1to_managerAddress. It does not re-bindmessage.srcChainIdto the LZ source; a lying inner id still needs a trusted remote relay (owner-set callers: owner, endpoint, manager). - Vault CCM
receiveMessageisonlyRelayanddstChainId == chainId. Withdraw decodesEventTypesWithdrawDataand callsvault.withdraw. Rebalance burn/mint forward to the vault.deposit/depositWithFee/withdraw/ burn/mint finish areonlyVault. - Ledger CCM
receiveMessageisonlyRelay. Deposit / withdraw-finish / rebalance finish convert amounts with owner-settokenDecimalMapping(unset both sides is 1:1; one-sided zeros are owner misconfig, not a user path) and callledger.accountDeposit/accountWithDrawFinish. Outbound withdraw / burn / mint areonlyLedger. CrossChainManagerTesttoken hash is a ping that does not pay. OwnersendTestWithdraw/ native + ERC20 sweep are privileged.
Not submitted. Remaining Orderly listed GitHub: Operator / Fee / Market managers and LedgerImpl B/C/D trade / Sol withdraw paths.
2026-09-03: Orderly Operator / Fee / Market + LedgerImpl B/C/D (462e129)
Immunefi program
orderlynetwork
($100,000, kyc: false).
Vault, Ledger withdraw,
and evm-cross-chain
are already logged. This
slice is the remaining
listed contract-evm
src/ at 462e129.
Local clone
/tmp/orderly-evm. No
mainnet interaction.
Files: OperatorManager.sol,
OperatorManagerImplA.sol,
OperatorManagerImplB.sol,
FeeManager.sol,
MarketManager.sol,
LedgerImplB.sol,
LedgerImplC.sol,
LedgerImplD.sol,
plus the Ledger.sol
wrappers for those
selectors.
Checked for: a stranger uploading trades / settlements / fees; engine-sig skip on batch id; deposit or Sol withdraw that registers a hijacked pubkey; withdraw2Contract to an arbitrary receiver; swap upload that credits without the operator.
Result: no user-exploitable finding. Not submitted.
- OperatorManager
onlyOperator(or the owner-set zip) gates every upload. Impl A verifies the engine perp / market / rebalance signer and requires a matching sequentialfuturesUploadBatchId. Impl B does the same for events (eventUploadBatchIdengineEventUploadAddress) thenledger.calls the owner-initedbizTypeToSelectors. Unknown bizType reverts. Engine keys are owner-set.
- FeeManager collectors
are owner-set;
setBrokerAccountIdis owner orBROKER_MANAGER_ROLE. Getters only. - MarketManager price /
funding writes are
onlyOperatorManager.setLastFundingUpdatedisonlyLedger. Cfg is owner-set. - Ledger wrappers:
trades / settlement /
liq / ADL / fee /
delegate / balance
transfer / swap /
withdraw2Contract are
onlyOperatorManager. Sol deposit isonlyCrossChainManagerV2. - Impl B batch trades apply the same symbol allowlist and position math as Impl A, using transient storage for gas. Operator-only.
- Impl C Sol deposit
requires
accountId == keccak256(pubkey, brokerHash)then credits that id. Sol withdraw requires Ed25519 (EOA memo or ledger tx) fromsender, then freeze+finish in one tx (no async finish, documented). Balance transfer is a two-sided debit/credit keyed bytransferId(engine trust). - Impl D
withdraw2Contract
pays only a Ceffu
prime wallet mapped
to the account, or a
protocol vault whose
accountId matches.
Swap
applyDeltais operator-only; vault deltas apply only whenswapStatus == 1.
Not submitted. Listed Orderly GitHub leftover is exhausted.
2026-09-03: Compound Finance PR 127 / 2.9 (ae4388e)
Immunefi program
Compound Finance
($1,000,000, kyc: true).
The only listed GitHub
smart-contract asset is
compound-finance/compound-protocol
pull 127 (merge
ae4388e, “Compound/2.9”).
Remaining Compound assets
are explorer addresses +
Primacy of Impact. Local
worktree
/tmp/compound-pr127-merge
at that merge (do not use
/tmp/compound-protocol
HEAD #152). No mainnet
interaction.
Files:
contracts/Comptroller.sol
(liquidateBorrowAllowed,
isDeprecated,
seizeAllowed),
contracts/CToken.sol
(liquidateBorrowFresh,
seize /
seizeInternal),
contracts/CTokenInterfaces.sol
(protocolSeizeShareMantissa).
Checked for: a
non-deprecated market
that can be fully
liquidated without
shortfall; seize that
inflates the exchange
rate or steals extra
collateral; permissionless
seize from a stranger
cToken.
Result: no user-exploitable finding. Not submitted.
isDeprecatedrequires CF = 0, borrow paused, and reserve factor = 100%. Only then doesliquidateBorrowAllowedskip shortfall and close-factor (repay ≤ stored borrow). All three knobs are governance. Intended SAI/REP wind-down.- Otherwise liquidate
still needs shortfall
and
repay ≤ closeFactor * borrow. Both markets listed. Freshness on both cTokens. Liquidator ≠ borrower.repayAmountnot 0 / uint-max. seizeisnonReentrantand passesmsg.senderas the seizer. Comptroller requires both markets listed and the same comptroller.- Protocol share is
2.8% of seize tokens:
burn that supply and
add
tokens * rateto reserves. Rate stays invariant: `(cash+borrows-reserves- amount) / (supply - tokens)` equals the prior rate. Liquidator gets the remaining 97.2%.
Not submitted. Listed Compound GitHub leftover (PR 127) is exhausted.
2026-09-03: Raydium CLMM leftover (ed7c84a)
Immunefi program
raydium ($505,000,
kyc: false). Listed
leftover is per-file
GitHub URLs under
raydium-io/raydium-amm-v3
programs/amm/src
(instructions +
libraries + states +
lib.rs / error.rs,
added 24 Apr 2023).
Local clone
/tmp/raydium-amm-v3 at
ed7c84a (“Feat/position
nft freeze (#197)”).
Program id
CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK.
No mainnet interaction.
This slice is the listed swap / liquidity / fee / reward / admin money path at current HEAD (tree has later limit- order and Token-2022 helpers that are not in the 2023 file list).
Files:
instructions/swap.rs,
increase_liquidity.rs,
decrease_liquidity.rs,
close_position.rs,
open_position.rs,
create_pool.rs,
initialize_reward.rs,
collect_remaining_rewards.rs,
admin/collect_protocol_fee.rs,
admin/collect_fund_fee.rs,
admin/update_amm_config.rs.
Checked for: swap that pulls the wrong vault or skips slippage; increase that credits a stranger’s NFT; decrease that pays without burning liquidity; close that burns a live position; remaining-reward collect that takes unclaimed LP rewards; permissionless protocol / fund fee collect.
Result: no user-exploitable finding. Not submitted.
- Swap
exact_internalbinds input/output vaults topool.token_vault_0/1by mint direction. Input ATA must be payer-owned and match the input vault mint. Tick arrays must belong to the pool. Exact-in/out amounts are checked againstother_amount_threshold. Zero limit price forbids a partial fill. Fees split into LP / protocol / fund from the trade fee; LP growth ismul_div_floor. - Increase liquidity
requires the position
NFT (amount 1,
authority =
nft_owner) and pulls only from the signer’s token accounts into the pool vaults. Position ticks come from the PDA, not the caller. - Decrease requires the
same NFT. Liquidity
burned cannot exceed
the position.
Payout is burned
amounts plus zeroed
token_fees_owed_*. Recipients need only the vault mint (gift). Rewards pay recordedreward_amount_owedand never more than the reward vault. - Close requires zero
liquidity, fees, and
reward owed, then
burns the NFT. Frozen
NFT thaws with the
pool PDA after the
remaining account is
checked against
personal_position.pool_id. - Create pool is a PDA
(
config, mint0 < mint1) and creates vault PDAs; it does not take user tokens. update_amm_configisadmin::IDonly. Protocol / fund fee collect is admin or config owner / fund_owner and caps at the recorded balances.- Remaining rewards:
funder must be the
reward authority,
emissions must have
ended
(
last_update_time == end_time), and the payout is vault minus unclaimed (emitted - claimed).
Not submitted. Remaining
Raydium listed GitHub:
raydium-amm (classic)
and raydium-cp-swap.
2026-09-03: Marinade liquid-staking leftover (b8fe3f8)
Immunefi program
marinade ($250,000,
kyc: false). Listed
leftover is
marinade-finance/liquid-staking-program
(whole tree, added
11 Feb 2022). Local clone
/tmp/marinade-lsp at
b8fe3f8 (“[trivial]
[GEN-8081] Update
README.md (#89)”). This
slice is the user SOL /
mSOL / LP money path.
No mainnet interaction.
Files:
instructions/user/deposit.rs,
deposit_stake_account.rs
(stake-account gates),
liq_pool/liquid_unstake.rs,
liq_pool/add_liquidity.rs,
liq_pool/remove_liquidity.rs,
delayed_unstake/order_unstake.rs,
delayed_unstake/claim.rs.
Checked for: mSOL minted without a matching SOL pull; liquid unstake that pays more SOL than the burned mSOL; claim of a stranger’s ticket; LP mint without a SOL deposit; remaining-ticket reuse.
Result: no user-exploitable finding. Not submitted.
- Deposit pulls SOL from
the signer into the
liq-pool SOL leg and/or
reserve PDA, then
transfers existing
liq-pool mSOL and/or
mints the rest via the
mint-authority PDA.
mint_tois any mSOL ATA (gift). Supply cannot exceed the recordedmsol_supply. - Liquid unstake requires
a token source check
(owner or delegate)
and pays
msol_to_sol(amount - fee)from the SOL-leg PDA, capped by available liquidity minus rent. Fee mSOL stays in the pool; treasury cut goes to the state treasury. SOL destination is unconstrained (gift). order_unstakeburns the caller’s mSOL and writes a zeroed ticket with beneficiary = token-account owner and lamports =msol_to_sol - delay fee. Claim requirestransfer_sol_to == ticket.beneficiary, matchingstate_address, non-zero lamports, one epoch + 30 minutes, and reserve SOL above rent. Anyone may trigger claim; payout is only to the beneficiary. Ticket closes to that account.- Add liquidity pulls
signer SOL into the
SOL leg and mints LP
shares from
shares_from_valueafter syncinglp_supplyto the real mint (must not exceed recorded). Remove burns LP and pays pro-rata SOL + mSOL from the legs.
Not submitted. Remaining
Marinade: crank
(stake_reserve /
deactivate / merge /
update), admin pause /
config, and validator
management /
withdraw_stake_account
split.
2026-09-03: Rocket Pool v1.4 deposit / rETH / megapool queue (fb7d9c4)
Immunefi program
Rocket Pool
($150,000, kyc: true).
Listed leftover
rocket-pool/rocketpool
blob/v1.4 (added 17 Feb
2026). Local clone
/tmp/rocketpool at
fb7d9c4 (“Insert
correct mainnet genesis
block time”). This slice
is the user + node ETH
path into the deposit
pool and megapool queue.
No mainnet interaction.
Files:
contracts/contract/deposit/RocketDepositPool.sol,
contracts/contract/token/RocketTokenRETH.sol,
contracts/contract/node/RocketNodeDeposit.sol,
contracts/contract/megapool/RocketMegapoolDelegate.sol
(newValidator,
dequeue,
assignFunds,
reduceBond),
contracts/contract/network/RocketNetworkBalances.sol.
Checked for: minting
rETH without ETH;
exitQueue underflowing
nodeBalance so excess
can be drained;
applyCredit to a
stranger; dequeue that
credits twice; burn that
pulls more than excess.
Result: no user-exploitable finding. Not submitted.
- User
depositisonlyThisLatestContract, min size, pool cap (plus queue capacity when assign is on). Fee comes out ofmsg.value; rETH is minted on the net amount via the oracle rate. ETH is split to the rETH buffer then the vault. mint/depositExcess/withdrawExcessBalanceare deposit-pool-only.burnpaysgetEthValueand pulls onlygetExcessBalancefrom the vault.- Node bond hits the
vault via
nodeDeposit(onlyrocketNodeDeposit) which incrementsnodeBalanceby the full bond (credit may covermsg.value).requestFundsis only a registered megapool; it enqueues and raises bonded / borrowed snapshots but does not touchnodeBalance— that increment already happened innodeDeposit. exitQueuesubtracts that bond fromnodeBalanceandrequestedTotal. MegapooldequeuethenfundsReturned+applyCredit(bond). The ETH stays in the vault; credit mints rETH the same way a user deposit does.assignFundsis deposit-pool-only, prestakes 1 ETH to the official deposit contract, and moves queued capital intonodeBond/userCapital.- Network totals are oracle-submitted (trusted-node threshold). Rate games need oDAO collusion.
Not submitted. Remaining Rocket Pool listed GitHub: megapool stake / dissolve / rewards, minipool delegate leftover, vault, auction, DAO settings / voting.
2026-09-03: Raydium classic AMM leftover (27f461d)
Immunefi program
raydium ($505,000,
kyc: false). Listed
leftover is per-file
URLs under
raydium-io/raydium-amm
program/src (added
27 Dec 2023): lib.rs,
entrypoint.rs,
instruction.rs,
error.rs, invokers.rs,
log.rs, math.rs,
processor.rs,
state.rs. Local clone
/tmp/raydium-amm at
27f461d (“Remove
openbook dependency
(#69)”). Program id
675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8.
No mainnet interaction.
This slice is initialize2 / deposit / withdraw / swap (v1+v2) / withdraw-pnl / admin config after OpenBook accounts became unused padding.
Checked for: LP minted without a matching vault pull; withdraw that pays more than pro-rata; swap that uses a stranger’s vault or skips slippage; permissionless pnl withdraw.
Result: no user-exploitable finding. Not submitted.
Initialize2requires a signer wallet, the AMM authority PDA, and the config PDA. Coin and PC mints must differ. Create-pool fee (if set) pays the hardcoded fee destination.- Deposit requires the
source owner signer.
Vault accounts must
match
amm.coin_vault/pc_vault; user sources cannot be the vaults. LP mint and target-orders must match the AMM. Amounts follow the pool ratio (ceiling on the other side) with max and optional min slippage. LP mintedfloor(input / reserve * lp_amount). Emptylp_amountis refused. - Withdraw requires the
LP owner signer, LP
mint match, and dest
mints = vault mints.
Cannot dest into the
vaults. Cannot redeem
>= amm.lp_amount. Payout isfloor(lp / total * reserve)per side with optional mins. LP is burned. - Swap v1/v2 require a
signer. Vaults bind to
the AMM. User ATAs
cannot be the vaults.
Direction is mint
pair. Exact-in: fee
ceil, then constant product;minimum_outand cannot take the whole reserve. Exact-out: input isceil(need / (1-fee))vsmax_amount_in. WithdrawPnlis the hardcoded amm-owner or configpnl_owner.SetParams/ create/update config are amm-owner only.
Not submitted. Remaining
Raydium listed GitHub:
raydium-cp-swap.
2026-09-03: Raydium cp-swap leftover (244e124)
Immunefi program
raydium ($505,000,
kyc: false). Listed
leftover is per-file
URLs under
raydium-io/raydium-cp-swap
programs/cp-swap/src
(added 26 Mar 2024).
Local clone /tmp/raydium-cp
at 244e124
(“Feat/permissionless
collect creator fee
(#76)”). Program id
CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C.
No mainnet interaction.
Files:
instructions/deposit.rs,
withdraw.rs,
swap_base_input.rs,
swap_base_output.rs,
admin/collect_protocol_fee.rs,
admin/collect_fund_fee.rs,
collect_creator_fee.rs,
plus states/pool.rs
get_swap_params.
Checked for: LP minted without a matching vault pull; withdraw that pays more than pro-rata; swap that uses the same vault twice or skips slippage; permissionless protocol / fund / creator fee collect.
Result: no user-exploitable finding. Not submitted.
- Deposit requires the
owner signer. User
ATAs must be
owner-owned and match
vault mints. Vaults
bind to the pool. LP
mint binds to
pool.lp_mint. Token amounts areceiling(lp / supply * reserve)plus Token- 2022 inverse transfer fees, capped by max. LP is minted by the auth PDA. - Withdraw burns the
owner’s LP and pays
floorpro-rata (capped at fee-exclusive vault) with min slippage. Dest ATAs need only the vault mint (gift). - Swap vaults must be
the pool’s two
distinct vaults
(
get_swap_paramselseInvalidVault). Exact-in deducts input transfer fee, charges trade / protocol / fund / creator fees, requiresconstant_after >= constant_beforeandminimum_amount_out. Exact-out adds the output transfer fee then checksmax_amount_in. Payer must authorize the input transfer. - Protocol / fund fee
collect is admin or
config owner /
fund_owner and caps
at recorded balances.
Creator fee collect
is
pool_creatoronly, to the creator’s ATAs.
Not submitted. Listed Raydium GitHub leftover is exhausted.
2026-09-03: Rocket Pool v1.4 megapool dissolve / rewards / exit (fb7d9c4)
Immunefi program
Rocket Pool
($150,000, kyc: true).
Deposit / rETH / queue
on the same pin
fb7d9c4 is already
logged. This slice is
megapool dissolve,
reward split, and
beacon exit notify.
Local clone
/tmp/rocketpool. No
mainnet interaction.
Files:
contracts/contract/megapool/RocketMegapoolDelegate.sol
(dissolveValidator,
distribute /
_distributeAmount,
claim,
notifyExit,
notifyFinalBalance,
_notifyFinalBalance,
challengeExit,
getPendingRewards,
_calculateCapitalDispersal).
Checked for: permissionless
dissolve that recycles
another node’s bond;
distribute treating
exit principal as
rewards; claim to a
stranger; final-balance
that sends user capital
to the node.
Result: no user-exploitable finding. Not submitted.
dissolveValidatorrequiresinPrestake. Anyone may call aftertimeBeforeDissolve; the manager may skip the wait. Penalty is debt. Recycle is32 ETH - prestakesplit by the new bond requirement. User share returns to the deposit pool; node share goes torefundValue. Lost prestake is the dissolve cost.getPendingRewardsisbalance - refundValue - assignedValue.distributeis public but reverts whilenumExitingValidatorsornumLockedValidatorsis non-zero, so an in-progress exit’s withdrawal is not treated as rewards. The window beforenotifyExitis oDAO timing, not a stranger extract.- Reward split uses
oDAO revenue shares
and the time-weighted
capital ratio. Node
share can repay debt;
the rest is
refundValue. User share goes to rETH; voter / pDAO shares to those contracts. claimis megapool-owner only and pays the node withdrawal address.notifyExit/notifyFinalBalanceare manager-only. Shortfall of user capital becomes debt. Node share takes the first loss. Permissionless final-balance waits a configured delay (longer if shortfall).
Not submitted. Remaining Rocket Pool listed GitHub: minipool delegate leftover, vault, auction, DAO settings / voting, smoothing / rewards pool.
2026-09-03: Beanstalk Basin leftover (Sourcify + ecf6923)
Immunefi program
beanstalk
($1,100,000, kyc: false).
Listed leftover this
slice is Basin +
Pipeline / Depot, not
the L1/L2 Beanstalk
diamond. Sourcify
Arbitrum exact_match:
Pipeline
0xb1bE…91B0, Depot
0xDEb0…20c3, Aquifer
0xBA51…7521, Well
Upgradeable impl
0xBA51…e50B, Constant
Product 2
0xBA15…72b4, Multi
Flow Pump
0xBA15…5b13. Official
tree /tmp/basin at
ecf6923. No mainnet
interaction.
Program text: unexpected
outcomes from misuse of
Pipeline and/or Depot
do not qualify. Do not
file leftover Pipeline
balances or user-signed
Depot farm calls.
Files: Sourcify
Pipeline.sol /
LibFunction.sol,
Depot.sol /
DepotFacet.sol /
TokenSupportFacet.sol,
Well.sol /
WellUpgradeable.sol,
Aquifer.sol,
functions/ConstantProduct2.sol,
functions/Stable2.sol,
pumps/MultiFlowPump.sol.
Checked for: Pipeline
call that spends a
stranger’s approval;
Depot farm that
moves a stranger’s
Silo deposit; Well
swap / remove that
pays without a pull or
burn; Aquifer bore that
rewrites an existing
well; upgrade that
swaps tokens; CP2
rounding that drains
the other reserve;
Pump update that
writes another well’s
slot.
Result: no user-exploitable finding. Not submitted.
- Pipeline is a
documented sandbox.
pipe/multiPipe/advancedPipecalltargetfrom Pipeline. Assets left between txs are permissionless. Clipboard paste is caller-controlled. - Depot
farmis a self-delegatecallmulticall. ERC-20 / deposit transfers requiremsg.senderas the source.INTERNALuses BeanstalktransferInternalTokenFromfrom the caller.pipe*forwards to the listed Pipeline. - Well
swapFrompulls then updates reserves via the immutable well function.swapTocomputes then pulls.removeLiquidity*burns the caller’s LP.shift/sync/skimextract or mint against excess balances (documented rebase / donation helpers)._setReservesrequiresbalance >= reserve. - Aquifer
boreWellclones and requiresisInitializedplusaquifer() == this. CREATE2 salt iskeccak256(sender, salt). - WellUpgradeable
upgrade is
onlyOwner. New impl must already be an Aquifer-bored well with the same token order. - CP2
calcLpTokenSupplyissqrt(b0*b1*1e12).calcReserverounds up (pool-favorable on swap-out). - MultiFlowPump
storage is keyed by
msg.sender. Wells ignore a failingupdate. Zero-reserve updates reset that well’s pump.
Not submitted. Remaining Beanstalk listed: L1/L2 diamond, Bean / Unripe / Fertilizer tokens, LSD oracle, Shipment Planner, Junctions, Unwrap ETH.
2026-09-03: Beets leftover (stS 877087b + token Sourcify)
Immunefi program
beets
($200,000, kyc: false).
Listed leftover: Beets
Staked Sonic
0xE5DA…3955 (Sonic
Sourcify 404; official
beethovenxfi/sonic-staking
/tmp/beets-lst
877087b), Beets token
0x2D0E…e4f0
(Sourcify
exact_match
Beets.sol), Token
Migrator
0x5f9a…E386
(Sourcify 404). No
mainnet interaction.
Files:
src/SonicStaking.sol,
Sourcify
src/token/Beets.sol.
Checked for: stS minted
without adding S to
totalPool; undelegate
that burns a stranger’s
shares; withdraw that
pays a stranger; donate
that inflates PPS for
a first depositor;
owner mint above the
yearly cap.
Result: no user-exploitable finding. Not submitted.
depositrequiresmsg.value >= 1e16, adds it tototalPool, and mintsconvertToShares(1:1 when supply or assets are 0). README says burn 1e18 on first deposit; not enforced on-chain.totalAssetsistotalPool + totalDelegated + pendingClawBackAmount(accounting, not raw balance).receiveis SFC-only; a stranger cannot donate native to inflate shares. OperatordonateisOPERATOR_ROLE.- Undelegate burns the
caller’s shares and
writes a withdraw
ticket.
withdrawrequiresmsg.sender == request.userandkind != CLAW_BACK. Emergency path can pay less after an SFC slash (user-opted). - Operator clawback can
drop the rate
(documented).
protocolFeeBIPSandwithdrawDelayare admin. UUPS isonlyOwner. - BEETS
mintisonlyOwnerand is capped at 10% of supply per year (incrementYearrequired after the window).
Not submitted. Remaining Beets listed: Token Migrator (Sourcify 404).
2026-09-03: Yearn YFI token leftover (Sourcify)
Immunefi program
yearnfinance
($200,000, kyc: false).
Listed leftover row YFI
Token
0x0bc5…d93e. Sourcify
Ethereum match
(YFI.sol, Solidity
0.5.16). Woofy
0xD066…57f1 is still
Sourcify 404. yvUSD
vault URL is still
Sourcify 404. No
mainnet interaction.
Checked for: permissionless mint; governance transfer without the current governor.
Result: no user-exploitable finding. Not submitted.
mintrequiresminters[msg.sender].addMinter/removeMinter/setGovernancearegovernanceonly. Transfers are standard OpenZeppelin 2-era ERC-20.
Not submitted. Remaining
Yearn listed leftover:
yvUSD
0x696d…6987
(Sourcify 404) and
Woofy (Sourcify 404).
2026-09-03: Benqi Dual Oracle leftover (Sourcify)
Immunefi program
benqi
($500,000, kyc: false).
Listed leftover this
slice is Benqi Dual
Oracle
0x926C…73A
(Avalanche Sourcify
exact_match,
Oracle/BenqiDualOracle.sol).
Second Dual Oracle row
0xf81B…F15e is the
same type. No mainnet
interaction.
Checked for: a non-owner that can set feeds or a direct price; dual mode that returns a stale or zero price as live; fallback that prefers the higher of two manipulated feeds.
Result: no user-exploitable finding. Not submitted.
setAssetOracles,setOracleMode,setDirectPrice,setUnderlyingPrice, andtransferOracleAdminsareonlyOwner. Manual prices withoutmanualOverrideAllowedmust stay within 10x of a live feed.- Unconfigured assets revert. Dual mode reverts if both feeds are stale or if fresh prices deviate past the asset threshold (default 5%, cap 20% / hard 50%). One stale feed falls back to the other. Edge is primary when both are fresh.
- Zero prices revert
inside
getOraclePriceWithFreshness. This is an oracle, not a vault.
Not submitted. Remaining Benqi listed: qiToken markets, unitrollers, sAVAX, gauges, Maximillion, Ignite, veQI, distributors.
2026-09-03: Rocket Pool v1.4 vault + RPL auction leftover (fb7d9c4)
Immunefi program
Rocket Pool
($150,000, kyc: true).
Deposit / megapool
slices on the same pin
fb7d9c4 are already
logged. This slice is
ETH/token custody and
slashed-RPL auctions.
Local clone
/tmp/rocketpool. No
mainnet interaction.
Files:
contracts/contract/RocketVault.sol,
contracts/contract/auction/RocketAuctionManager.sol.
Checked for: a stranger
withdrawing another
contract’s ETH or RPL;
depositToken crediting
a fake balance that can
be withdrawn as real
RPL; auction claim of
someone else’s bid;
recover that steals
allotted RPL.
Result: no user-exploitable finding. Not submitted.
- Vault ETH deposit /
withdraw is
onlyLatestNetworkContractand keys the ledger bygetContractName (msg.sender). Withdraw deducts that name’s balance then callbacksreceiveVaultWithdrawalETH. Token withdraw / transfer / burn use the same gate and the caller’s own token slot. depositTokenis permissionless: the callertransferFroms themselves and credits a named network contract. That is a gift. Fee-on-transfer would over-credit a slot; the token in scope is RPL, and only the named contract can later withdraw it.createLotallots unallotted vault RPL up to the DAO max ETH value / oracle price.placeBidcaps ETH at remaining RPL * current price, sends the accepted ETH to the deposit pool (recycleLiquidatedStake), and refunds the rest.claimBidrequires the lot cleared and pays onlymsg.sender’s bid / clearing price, then zeros that bid. Rounding is clamped to allotted RPL.recoverUnclaimedRPLafter the lot ends only un-allots the remainder so a later lot can use it. RPL stays in the vault.
Not submitted. Remaining Rocket Pool listed GitHub: minipool delegate leftover, DAO settings / voting.
2026-09-03: Rocket Pool v1.4 smoothing / rewards leftover (fb7d9c4)
Immunefi program
Rocket Pool
($150,000, kyc: true).
Deposit / megapool /
vault slices on the
same pin fb7d9c4 are
already logged. This
slice is the smoothing
pool, rewards
consensus, merkle
distributor, and pDAO
treasury claim. Local
clone /tmp/rocketpool.
No mainnet interaction.
Files:
contracts/contract/rewards/RocketSmoothingPool.sol,
contracts/contract/rewards/RocketRewardsPool.sol,
contracts/contract/rewards/RocketMerkleDistributorMainnet.sol,
contracts/contract/rewards/RocketClaimDAO.sol.
Checked for: a stranger
draining the smoothing
pool; a lying snapshot
that pays unearned ETH
or RPL; double-claim of
a merkle leaf; claiming
another node’s parked
ETH; pDAO spend /
newContract without a
proposal.
Result: no user-exploitable finding. Not submitted.
- SmoothingPool
receive()is open (anyone can gift ETH).withdrawEtherisonlyLatestNetworkContractand can send the entire SP balance to an arbitrary_to. That is the trusted network-contract path; the intended caller is RewardsPool when a snapshot executes. depositVoterShareis permissionless: a gift of ETH into the rewards vault slot.submitRewardSnapshotisonlyTrustedNode. Totals must be ≤ pending RPL and pending ETH (from inflation + SmoothingPool balance). Trusted-node consensus then_executeRewardSnapshot.executeRewardSnapshotis permissionless after consensus. An oDAO majority can submit a lying merkle root; that is the trusted-oracle model, not a stranger extract.- MerkleDistributor
relayRewardsis rewards-pool-only and one root per interval index.claim/claimAndStakerequire a merkle proof and thatmsg.senderis the node, withdrawal, or RPL-withdrawal address for that node. Double-claim is a bitmap. A failed ETH send parks underrewards.eth.balance [addr];claimOutstandingEthpays onlymsg.sender’s parked balance. - ClaimDAO
spend/newContract/updateContractare DAO-proposals-only.withdrawBalanceis permissionless but pays the recipient’s own accrued balance.receive()ETH is forwarded to the vault with the comment that there is no way to spend that ETH from this contract.
Not submitted. Remaining Rocket Pool listed GitHub: minipool delegate leftover, DAO settings / voting.
2026-09-03: Harvest vault / controller leftover (0364901)
Immunefi program
harvest ($100,000,
kyc: false). Listed
leftover is whole trees
harvestfi/harvest-strategy
(added 7 Apr 2022),
harvest-strategy-polygon
(3 Apr 2023), and
harvest-strategy-arbitrum
(3 Apr 2023, re-added
15 Mar 2024). This
slice is the Ethereum
base vault / controller
only. Local clone
/tmp/harvest-strategy
at 0364901 (“Merge
pull request #20 from
CryptJS13/claude/inactive-vault-yield-fee-69b38a”).
No mainnet interaction.
Files:
contracts/base/VaultV1.sol,
VaultV2.sol,
Controller.sol,
upgradability/BaseUpgradeableStrategy.sol,
upgradability/BaseUpgradeableStrategyStorage.sol,
noop/NoopStrategyUpgradeable.sol,
interface/IStrategy.sol.
Checked for: share mint without a matching underlying pull; withdraw that pays more than pro-rata or skips the owner / allowance check; strategy switch that leaves funds on the old strategy; permissionless salvage of underlying; controller fee change without the queued delay.
Result: no user-exploitable finding. Not submitted.
VaultV1is an upgradeable ERC20.initializeVaultcaps the invest fraction at 100%. Share decimals match the underlying.defensegreylists only contracts (EOA always passes);Controller.greyListis true unless the address or codehash is whitelisted.- Empty-vault deposit
mints 1:1 then
transferFrom. That is the known Yearn- style first-depositor inflation if someone donates after a 1-wei first mint. Not treated as a new finding. - Later deposits mint
amount * supply / AUM. Withdraw burns the owner’s shares (allowance ifmsg.sender != owner) then pays pro-rata of vault cash plusinvestedUnderlyingBalance. A shortfall pulls from the strategy and recaps to vault cash. setStrategyis controller / governance plus the announce timelock (first strategy is immediate). The new strategy must matchunderlyingandvault. The old strategywithdrawAllToVaultbefore the pointer moves.doHardWork/rebalance/withdrawAllare controller or governance.VaultV2is the ERC-4626 wrapper over the same_deposit/_withdraw. Empty convert is 1:1 after the shared decimals.mintconverts then_deposit.- Controller fees start
at 10% profit-sharing,
5% platform, 0%
strategist, max 30% /
10_000. Changes queue
until
nextImplementationDelay.salvage/salvageStrategyare governance only. The interface namessalvageToken; live strategies implementsalvage. That is a governance-ops ABI mismatch, not a third-party theft path. BaseUpgradeableStrategyrestrictedis vault / controller / governance. Fee notify approves the controller’srewardForwarder.NoopStrategyUpgradeableholds idle underlying, withdraws only onrestricted, and refuses salvage of underlying / reward.
Not submitted. Remaining
Harvest is
contracts/strategies/*
(dolomite / fluid /
euler / sky / morpho /
yel / stakeDao / convex /
aave / penpie / notional /
zerolend / aura /
compoundV3 / idle /
inactive) plus the
polygon and arbitrum
trees.
Rechecked ~06:10 UTC
3 Sep: Superteam still
28 open listings,
AGENT_ALLOWED still
only Steve Arena and
ZNS; Sherlock page 1
still only contest
1234 (Tare) in
SHERLOCK_JUDGING;
KeeperHub #2105 still
open + PR #2275;
#2240 still open +
1 design comment, search
hit PR #2277 is #2247;
Uniswap/sdks#720 and
Hedera Harness #8 still
open, 0 comments;
CreditPassport deployer
still 0 Sepolia ETH /
0 tCTC; no Immunefi
programs launched Sep
2026; no new GitHub SC
assets since 2026-09-02
(246 programs).
2026-09-03: Harvest 4626 / Dolomite lend leftover (0364901)
Immunefi program
harvest ($100,000,
kyc: false). Vault /
controller on the same
pin 0364901 is already
logged. This slice is
the 4626-style lend
strategies. Local clone
/tmp/harvest-strategy.
No mainnet interaction.
Files:
contracts/strategies/morpho/MorphoLendStrategy.sol,
MorphoVaultStrategy.sol,
fluid/FluidLendStrategy.sol,
euler/EulerLendStrategy.sol,
dolomite/DolomiteLendStrategy.sol.
Checked for: a stranger redeeming the strategy’s 4626 shares; withdraw that pays the vault more than idle plus supplied minus reserved fee; permissionless salvage of underlying; fee accrual that lets governance or a keeper pull user principal.
Result: no user-exploitable finding. Not submitted.
- Each 4626 lend
strategy requires the
market
asset()to matchunderlying. Supply deposits toaddress(this). Redeem / withdraw also pays this strategy.restrictedwithdraws sendmin(requested, idle)to the vault. investedUnderlyingBalanceis idle + stored supplied −pendingFee. SafeMath reverts if the reserved fee exceeds that sum (grief, not theft).- Fee is a slice of
current − storedusing the controller numerators. Morpho lend / Fluid update stored inside_accrueFee. Euler / Dolomite / Morpho vault update stored after the withdraw or hard-work. They redeem only the fee, then_notifyProfitInRewardTokenon the reconstructed yield so the forwarder pulls the fee legs. Dust thresholds skip a collect. - Fluid
claimRewardis permissionless but always claims toaddress(this). Extra reward tokens swap through the controller liquidator withminOut = 1(keeper sandwich, known Harvest pattern). Salvage is governance and refuses underlying / reward / receipt tokens. - Dolomite supplies
through
depositWeiaftergetMarketIdByTokenAddressmatches. Withdraw uses the same market id.hardhat/consoleis still imported; not a money path.
Not submitted. Remaining Harvest is Convex / Aura / Aave fold / Penpie / Notional / StakeDAO / Yel / ZeroLend / CompoundV3 / Idle / inactive plus MorphoVault V2 and the polygon / arbitrum trees.
2026-09-03: CoW GPv2 leftover (6ebbd81)
Immunefi program
cowprotocol
($1,000,000, kyc: false).
All 19 listed assets are
GitHub blobs at
cowprotocol/contracts
6ebbd810ff2da635fb6f88e9a15fde196f8c852a.
Local clone
/tmp/cow-contracts at
6ebbd81. No mainnet
interaction.
Files:
GPv2Settlement.sol,
GPv2VaultRelayer.sol,
mixins/GPv2Signing.sol,
GPv2AllowListAuthentication.sol,
libraries/GPv2Transfer.sol,
GPv2Order.sol,
GPv2Trade.sol,
GPv2Interaction.sol,
plus the listed mixins /
SafeMath / IERC20 /
IVault interfaces.
Checked for: unsigned
settle; a solver
interaction that spends
a stranger’s Vault
Relayer approval; limit-
price bypass; EIP-1271 /
pre-sign owner spoof.
Result: no user-exploitable finding. Not submitted.
settle/swapareonlySolver+nonReentrant. AuthenticatoraddSolver/removeSolverare manager-gated.- Interactions cannot
target
vaultRelayer(GPv2: forbidden interaction). RelayertransferFromAccounts/batchSwapWithFeeareonlyCreator(the settlement contract). - Limit:
sellAmount * sellPrice >= buyAmount * buyPrice. Sell FOK:executedBuy = sellAmount * sellPrice / buyPriceand must still clear that floor. Partial fills are tracked infilledAmount. - Signing: EIP-712 /
eth_sign ECDSA;
EIP-1271 owner is the
first 20 bytes of the
signature and must
return magic;
pre-sign owner is the
20-byte signature and
preSignature[uid] == PRE_SIGNEDset by that owner. invalidateOrder/setPreSignaturerequireowner == msg.sender.freeFilledAmountStorageisonlyInteractionand only expired UIDs.- Solver interactions
can use settlement
balances
(documented;
misbehaving solvers
are slashed). User
buy amounts still go
out via
vault.transferToAccounts (outTransfers)afterinteractions[1].
Do not file “solver can steal via interactions” without a path that bypasses the signed limit and the out-transfers.
Not submitted. Listed CoW GitHub leftover is exhausted.
2026-09-03: Stader ETHx user deposit / withdraw leftover (9d4a921)
Immunefi program
staderforeth
($1,000,000, kyc: false).
Listed leftover is 2023
etherscan addresses
(proxies). This slice is
the user money path:
Stake Pool Manager
0xcf5EA1b38380f6aF39068375516Daf40Ed70D299,
User Withdrawal Manager
0x9F0491B32DBce587c50c4C43AB303b06478193A7,
ETHx
0xA35b1B31Ce002FBF2058D22F30f95D405200A15b.
Official tree
stader-labs/ethx.
Local clone
/tmp/stader-ethx at
9d4a921. No mainnet
interaction.
Files:
StaderStakePoolsManager.sol,
UserWithdrawalManager.sol,
ETHx.sol.
Checked for: ETHx minted without ETH; a withdraw claim that pays a stranger; a donation that inflates PPS for a first depositor; permissionless burn.
Result: no user-exploitable finding. Not submitted.
depositrequires min/max,previewDeposit(round down), and mints viaETHx.mint(MINTER_ROLE). Rate is the oracletotalETHBalance / totalETHXSupply, not rawaddress(this).balance. Accidentalreceive/fallbackon SPM revert (UnsupportedOperation).receiveExecutionLayerRewardsis permissionless payable — it increases raw balance only; the rate updates when the oracle reports. Not a finding.transferETHToUserWithdrawManageris UWM-only.requestWithdrawpulls ETHx frommsg.sender; ticketownercan be a gift.finalizeUserWithdrawalRequestis permissionless, blocked in oraclesafeModeor an unhealthy vault, paysmin(ethExpected, lockedEthX * currentRate), burns ETHx from UWM, and pulls ETH from SPM.claimrequiresmsg.sender == request.owner.ETHx.mintisMINTER_ROLE;burnFromisBURNER_ROLE.
Do not file oracle-rate / permissionless EL- reward donation as inflation.
Not submitted. Remaining Stader listed: oracle, node registries, validator / node EL vaults, SD collateral, socializing pool, auction, permissioned / permissionless pools, insurance, VaultFactory.
2026-09-03: Rocket Pool v1.4 minipool leftover (fb7d9c4)
Immunefi program
Rocket Pool
($150,000, kyc: true).
Deposit / megapool /
vault / smoothing
slices on the same pin
fb7d9c4 are already
logged. This slice is
classic minipool
create / distribute /
dissolve / bond
reduction. Local clone
/tmp/rocketpool. No
mainnet interaction.
Files:
contracts/contract/minipool/RocketMinipoolDelegate.sol,
contracts/contract/minipool/RocketMinipoolBase.sol,
contracts/contract/minipool/RocketMinipoolFactory.sol,
contracts/contract/minipool/RocketMinipoolManager.sol,
contracts/contract/minipool/RocketMinipoolQueue.sol,
contracts/contract/minipool/RocketMinipoolBondReducer.sol,
contracts/contract/minipool/RocketMinipoolPenalty.sol.
Checked for: a stranger taking a minipool’s ETH or rETH share; user-distribute that skips the wait window; vacant promote that mints credit without oDAO scrub; bond reduce that steals user capital; factory init race; queue dequeue of someone else’s minipool.
Result: no user-exploitable finding. Not submitted.
- Factory deploy is
manager-only. The
clone is initialised
in the same
transaction
(
Undefined→Uninitialised→ delegateinitialise). No front-run ofinitialise. preDepositisrocketNodeDepositonly.deposit/userDepositarerocketDepositPoolonly. CurrentRocketNodeDepositno longer callscreateMinipool/createVacantMinipool(megapool path). Remaining minipools are legacy.stake/promote/close/reduceBondAmountare owner-only. Promote still waits the promotion scrub period. Bond reducer mutators all revert (“no longer available”), soreduceBondAmountcannot change balances.distributeBalancewhile staking: ≥ 8 ETH is treated as capital. The owner may finalise immediately; anyone else must havebeginUserDistributewait the DAO window. User share goes to rETH. Node share is refunded only to the withdrawal address. < 8 ETH is skimmed rewards split by capital ratio + commission. Dissolved distribute is owner-only and pays the whole balance to the withdrawal address.dissolveis permissionless after launch timeout in prelaunch. Scrub is trusted-node quorum. Penalty 2.4 ETH is recycled with user capital; if the contract is short the vote reverts (oDAO liveness, not a stranger extract).- Queue enqueue is
rocketNodeDeposit. Dequeue isrocketDepositPool. Remove is the registered minipool. - Penalty max rate is
guardian-only.
Per-minipool rate is
onlyLatestNetworkContractand clamped to the max. Zero max short-circuits to 0. - Manager
eth.matcheddecrements on finalise / destroy use 0.8 checked math. This tree never increments that snapshot (legacy state / megapool uses a different key). Underflow would revert finalise for a vacant that never had matched ETH; vacant create is not reachable from current NodeDeposit.
Not submitted. Remaining Rocket Pool listed GitHub: DAO settings / voting.
2026-09-03: Stader oracle / factory / insurance / auction / socializing leftover (9d4a921)
Immunefi program
staderforeth
($1,000,000, kyc: false).
User deposit / withdraw
on the same pin
9d4a921 is already
logged. This slice is
the remaining listed
control / reward path:
StaderOracle
0xF64bAe65f6f2a5277571143A24FaaFDFC0C2a737,
VaultFactory
0x03ABEEC03BF39ac5A5C8886cF3496326d8164E1E,
StaderInsuranceFund
0xbe3781CE437Cc3fC8c8167913B4d462347D11F20,
Auction
0x85A22763f94D703d2ee39E9374616ae4C1612569,
and both socializing
pools
0x9d4C3166c59412CEdBe7d901f5fDe41903a1d6Fc
/
0x1DE458031bFbe5689deD5A8b9ed57e1E79EaB2A4.
Local clone
/tmp/stader-ethx. No
mainnet interaction.
Files:
StaderOracle.sol,
factory/VaultFactory.sol,
VaultProxy.sol,
StaderInsuranceFund.sol,
Auction.sol,
SocializingPool.sol.
Checked for: a single node or a stranger pushing a fake ETHx rate; factory clones that a stranger can re-init; insurance withdraw that is not manager / pool gated; auction claim of someone else’s bid or SD; socializing claim that pays a stranger.
Result: no user-exploitable finding. Not submitted.
- Oracle
submitExchangeRateDataistrustedNodeOnly, needstrustedNodesCount/2+1matching attestations, a past aligned reporting block, andupdateWithInLimitER(default 5%). Over the cap enters inspection mode.closeERInspectionModeapplies the inspected rate only after the 7-day cooldown unless the caller is manager. ManagerdisableERInspectionModeduring the window drops the update without applying it. Trusted-node add / remove is manager-gated with cooldown and a min of - POR ER is a manager
toggle
(
togglePORFeedBasedERData). Do not file a negative-answerwrap on the PORint256cast without proving that feed is the live source and can returnanswer < 0. - VaultFactory deploy
is
NODE_REGISTRY_CONTRACTonly. The implementation constructor setsisInitialized. Clonesinitialiseonce. Fallbackdelegatecalls the config implementation (admin of config, not a stranger). - Insurance
depositFundis a gift.withdrawFundis manager-only.reimburseUserFundis the permissioned pool only and pays that pool. - Auction
createLotpulls SD from the caller.claimSDis the highest bidder after end.transferHighestBidToSSPMsends ETH to SPM. Losing bidders withdraw their own bids. Unbid SD goes to the treasury. - Socializing
handleRewardsis oracle-only and caps splits against idle ETH / SD minus reserved operator leftovers.claimverifieskeccak256(operator, amountSD, amountETH)against that cycle’s root and paysgetOperatorRewardAddress (msg.sender).
Do not file majority- oracle misreport as user theft. That is a trusted-node assumption.
Not submitted. Remaining Stader listed: node registries, validator / node EL vaults, SD collateral, permissioned / permissionless pools.
2026-09-03: ICHI oneToken leftover (4873873)
Immunefi program
ichi ($50,000,
kyc: false). Listed
leftover is
ichifarm/ichi-oneToken
plus four Etherscan
factory / V1 addresses.
Local clone
/tmp/ichi-onetoken at
4873873 (“updated
readme”). No mainnet
interaction.
Files:
contracts/OneTokenFactory.sol,
version/v1/OneTokenV1.sol,
version/v1/OneTokenV1Base.sol,
oracle/pegged/ICHIPeggedOracle.sol,
mintMaster/legacy/Incremental.sol,
strategy/StrategyCommon.sol.
Checked for: mint that credits oneTokens without pulling member
- collateral; redeem
that pays more than the
oracle’s
amountRequiredafter the fee; factory deploy that skips module checks; strategytoVault/fromVaultcallable by a stranger.
Result: no user-exploitable finding. Not submitted.
- Factory
deployOneTokenProxyisonlyOwner. Version / controller / mintMaster / oracle must be admitted modules of the right type. Member token is a registered foreign token; collateral must be marked collateral and have ≤18 decimals. The new proxy is admitted as collateral, theninit+ ownership transfer to governance. - Mint updates the
collateral and member
oracles, reads
updateMintingRatio, and requiresoneTokens <= maxOrderVolume. It pullsamountRequiredmember + collateral (more collateral if the member allowance is short) then_mints the requested amount. - Redeem burns the
caller’s oneTokens
and pays
amountRequired (collateral, amount * (1 - fee)). Pegged oracle is 1:1 after decimal normalize. Uniswap / composite oracles are governance-chosen; a bad oracle is trusted, not a third-party theft path. - Strategy assignment,
toStrategy/fromStrategy/executeStrategy, and allowance changes are owner or controller. The strategy must recognize this vault and share its owner.StrategyCommontoVault/fromVaultarestrategyOwnerTokenOrController. liabilitiesis unused on mint / redeem. Dead accounting, not a drain.
Not submitted. Remaining ICHI listed: live Etherscan factory / V1 addresses if a later pass wants bytecode vs this tree; Incremental ratio step logic is owner-parameterized.
2026-09-03: Rocket Pool v1.4 DAO settings / voting leftover (fb7d9c4)
Immunefi program
Rocket Pool
($150,000, kyc: true).
Deposit / megapool /
vault / smoothing /
minipool slices on the
same pin fb7d9c4 are
already logged. This
slice is pDAO
proposals, optimistic
fraud-proof verifier,
settings, voting
snapshots, and
security-council
proposals. Local clone
/tmp/rocketpool. No
mainnet interaction.
Files:
contracts/contract/dao/protocol/RocketDAOProtocol.sol,
contracts/contract/dao/protocol/RocketDAOProtocolProposal.sol,
contracts/contract/dao/protocol/RocketDAOProtocolProposals.sol,
contracts/contract/dao/protocol/RocketDAOProtocolVerifier.sol,
contracts/contract/dao/protocol/settings/RocketDAOProtocolSettings.sol
plus Network / Node /
Minipool / Megapool /
Deposit / Rewards /
Inflation / Auction /
Proposals / Security
settings,
contracts/contract/network/RocketNetworkVoting.sol,
contracts/contract/dao/security/RocketDAOSecurityProposals.sol.
Checked for: a stranger executing a treasury spend; a lying merkle root that steals RPL bonds; double-claim of a challenge or proposal bond; voting-power inflation after the snapshot; settings writes outside a passed proposal.
Result: no user-exploitable finding. Not submitted.
proposeis a registered node only and locks an RPL proposal bond. The pollard is stored for challenge duringPending(vote delay).executerequiresSucceededand runs the payload only onrocketDAOProtocolProposals.destroyis verifier-only.- Phase-1
votechecks a merkle witness against the submitted root. Phase-2overrideVoteuses on-chaingetVotingPowerand can reverse a delegate. A lying root that is not challenged inPendingis the optimistic-oracle model, not a stranger extract. - Verifier
createChallengelocks the challenger’s bond and requires a witness under aRespondedparent.defeatProposalneeds the challenge period and then destroys. Claims mark each indexPaidand requiremsg.senderis the challenger or proposer. Reward isproposalBond * rewardedIndices / totalDefeatingIndiceswith a 20% burn. Double-claim reverts on state. - Settings writes are
onlyDAOProtocolProposalafter deploy, with per-path bounds (fees, quorums, timeouts, inflation). Network share adders also accept an allow-listed controller; the list is a DAO address setting and rETH commission is capped at 100%. - Voting power is
sqrtof RPL stake clamped by bonded ETH × max-percent / price at a past snapshot block.setDelegateis registered-node to registered-node. - Bootstrap is
guardian + bootstrap
mode. Security
propose/vote is
council-member only
and can only change
allow-listed
setting paths.
Treasury
spend/newContract/updateContractareonlyExecutingContracts.
Not submitted. Listed Rocket Pool GitHub leftover is exhausted.
2026-09-03: Stader registries / vaults / SD / pools leftover (9d4a921)
Immunefi program
staderforeth
($1,000,000, kyc: false).
User path and oracle /
factory / insurance /
auction / socializing
on the same pin
9d4a921 are already
logged. This slice is
the remaining listed
operator / validator
path:
PermissionedNodeRegistry
0xaf42d795A6D279e9DCc19DC0eE1cE3ecd4ecf5dD,
PermissionedPool
0x09134C643A6B95D342BdAf081Fa473338F066572,
PermissionlessNodeRegistry
0x4f4Bfa0861F62309934a5551E0B2541Ee82fdcF1,
PermissionlessPool
0xd1a72Bd052e0d65B7c26D3dd97A98B74AcbBb6c5,
SDCollateral
0x7Af4730cc8EbAd1a050dcad5c03c33D2793EE91f,
OperatorRewardsCollector
0x84ffDC9De310144D889540A49052F6d1AdB2C335,
NodeELRewardVault
0x97c92752DD8a8947cE453d3e35D2cad5857367af,
ValidatorWithdrawalVault
0x3073cC90aD39E0C30bb0d4c70F981FbD00f3458f.
Local clone
/tmp/stader-ethx. No
mainnet interaction.
Files:
PermissionlessNodeRegistry.sol,
PermissionedNodeRegistry.sol,
PermissionlessPool.sol,
PermissionedPool.sol,
SDCollateral.sol,
OperatorRewardsCollector.sol,
ValidatorWithdrawalVault.sol,
NodeELRewardVault.sol.
Checked for: a stranger settling a vault and taking user ETH; SD slash that is not the withdraw vault; pool deposit that sends ETH to a fake credential; collector claim that pays a stranger; permissionless EL / reward withdraw that inflates ETHx.
Result: no user-exploitable finding. Not submitted.
- Withdraw-vault
settleFundsis the node registry only.distributeRewardsis permissionless under the rewards threshold (manager above it). User share goes to SPM, protocol to treasury, operator to the collector. - Node-EL
withdrawis permissionless and splits the same way. User share isreceiveExecutionLayerRewards(raw balance only). Not a finding. - Registry
markValidatorReadyToDeposit/withdrawnValidatorsare oracle-only. Front-run sends 3 ETH of the 4 ETH bond to insurance and deactivates the operator. Invalid signature refunds the leftover 3 ETH to the operator collector. - Pool
stakeUserETHToBeaconChainis SPM-only. Pre / full deposits go to the official deposit contract with the factory withdraw credential for that vault.receive/fallbackrevert. Permissioned defective-key refund is registry-only and pays SPM from insurance + pool ETH. - SD
slashValidatorSDrequiresmsg.senderto be that validator’s withdraw vault.withdrawOnBehalfis permissionless but only excess above threshold and pays the operator reward address (or utility repay). A gift, not theft. - Collector
claim/claimWithAmountdebitmsg.senderand paygetOperatorRewardAddress (msg.sender).depositForis a gift.
Do not file permissionless vault reward split or oracle-gated front-run as user theft.
Not submitted. Remaining Stader listed: StaderConfig, Penalty, PoolSelector, PoolUtils.
2026-09-03: Harvest Convex / Aura / Aave fold leftover (0364901)
Immunefi program
harvest ($100,000,
kyc: false). Vault /
controller and 4626
lend on the same pin
0364901 are already
logged. This slice is
the Convex / Aura
farms and the Aave
fold. Local clone
/tmp/harvest-strategy.
No mainnet interaction.
Files:
contracts/strategies/convex/ConvexStrategy.sol,
ConvexLendStrategy.sol,
aura/AuraStrategy.sol,
aave/AaveFoldStrategy.sol.
Checked for: a stranger unstaking Convex / Aura LP; withdraw that pays more than staked plus idle; flash-loan callback that is not the Balancer vault; fold that borrows above the collateral factor.
Result: no user-exploitable finding. Not submitted.
- Convex booster
poolInfoLP must matchunderlying.depositAllstakes.withdrawAllToVault/withdrawToVaultarerestricted. Partial unwrap is capped at the reward pool balance; the later transfer of the requested amount reverts if unwrap was short.investedis staked plus idle. Curveadd_liquiditymin = 0runs only on hard-work (keeper sandwich, known Harvest pattern). - Aura matches the
Balancer pool LP and
the Aura booster LP
to
underlying. Withdraw / salvage / hard-work follow the same Convex gates. - Convex lend supplies
the 4626 lending
vault (
asset= underlying), then stakes the vault shares in Convex (poolInfoLP = lending vault). Withdraw redeemsmin(requested, idle)after a partial unwrap. - Aave fold requires
aToken and variable
debt
UNDERLYING_ASSET_ADDRESS= underlying. Borrow target is strictly below the collateral factor.receiveFlashLoanrequiresmsg.sender == bVaultand exactly one ofmakingFlashDeposit/makingFlashWithdrawal. Deposit supplies the flash amount then borrows the repay. Withdraw repays then redeems, then pays Balanceramount + fee.investedis idle + stored net −pendingFee.
Not submitted. Remaining Harvest is Penpie / Notional / StakeDAO / Yel / ZeroLend / CompoundV3 / Idle / inactive + MorphoVault V2 + polygon / arbitrum.
2026-09-03: Harvest Penpie / Notional / StakeDAO / Yel leftover (0364901)
Immunefi program
harvest ($100,000,
kyc: false). Vault /
4626 lend / Convex
slices on the same pin
0364901 are already
logged. This slice is
the Pendle/Penpie,
Notional nToken,
StakeDAO, and Yel
MasterChef strategies.
Local clone
/tmp/harvest-strategy.
No mainnet interaction.
Files:
contracts/strategies/penpie/PenpieStrategy.sol,
notional/NotionalStrategy.sol,
stakeDao/StakeDaoStrategy.sol,
yel/YelStrategy.sol.
Checked for: a stranger unstaking Penpie / StakeDAO / Yel LP; withdraw that pays the vault more than idle plus staked; permissionless salvage of underlying.
Result: no user-exploitable finding. Not submitted.
- Penpie
depositMarket/withdrawMarketgo through the fixed helper. Withdraw and hard-work arerestricted. Salvage refuses underlying / reward. Extra rewards swap through the liquidator withminOut = 1(known Harvest keeper sandwich). - Notional holds
nTokens as
underlyingon the strategy. Withdraw is arestrictedtransfer of that balance.doHardWorkclaims nToken incentives then mints more nTokens viabatchBalanceAction. - StakeDAO stakes the
Curve LP in the
StakeVault. Partial
withdraw unstakes
min(staked, need)then transfers the requested amount (reverts if short). Claim is accountanttry/catch. - Yel uses
MasterChef
withdraw(poolId, amount). Same restricted withdraw / salvage pattern.
Not submitted. Remaining Harvest is ZeroLend / CompoundV3 / Idle / inactive + MorphoVault V2 + polygon / arbitrum.
2026-09-03: Harvest ZeroLend / CompoundV3 / Idle leftover (0364901)
Immunefi program
harvest ($100,000,
kyc: false). Prior
Harvest slices on pin
0364901 are already
logged. This slice is
ZeroLend fold wrappers,
Compound III Comet,
and Idle. Local clone
/tmp/harvest-strategy.
No mainnet interaction.
Files:
contracts/strategies/zerolend/ZerolendFoldStrategyMainnet_*.sol,
ZerolendFoldStrategyFIXMainnet_WBTC.sol,
compoundV3/CompoundStrategy.sol,
idle/IdleStrategy.sol.
Checked for: a stranger redeeming Comet / idleTokens; withdraw that pays more than supplied minus fee; fold callback that is not Balancer; salvage of aTokens / idle receipts.
Result: no user-exploitable finding. Not submitted.
- ZeroLend Mainnet
contracts inherit
AaveFoldStrategy(already logged). They only set ZeroLend aToken / debtToken / ZERO reward and fold factors (e.g. 870 / 899 / 1000). The FIX WBTC variant inheritsAaveFoldStrategyFIX. No new money path. - Compound III
baseTokenmust matchunderlying. Supply / withdraw go to that Comet. Fee is a slice ofcurrent − storedsupplied. Withdraw and hard-work arerestricted. Salvage refuses underlying / reward / market. - Idle mints
idleTokenwhosetoken()must matchunderlying. Redeem uses helpergetRedeemPrice+ 1 wei. Whenprotected, a rising redeem price reverts (virtual- price guard). Withdraw / hard-work arerestricted. Salvage refuses idle receipts.
Not submitted. Remaining Harvest is inactive + MorphoVault V2 + polygon / arbitrum trees.
2026-09-03: Harvest inactive / MorphoVault V2 leftover (0364901)
Immunefi program
harvest ($100,000,
kyc: false). Prior
Harvest slices on pin
0364901 are already
logged. This slice is
the inactive-vault
ERC4626 parking
strategy, Morpho vault
V2 (including
morpho/v2), the Morpho
reward pre-pay helper,
and the leftover
mainnet extras on the
same tree (sDAI,
StakeDAO lend, cvxCRV).
Local clone
/tmp/harvest-strategy.
No mainnet interaction.
Files:
contracts/strategies/inactive/InactiveVaultERC4626Strategy.sol,
InactiveVaultERC4626StrategyMainnet_USDC.sol,
morpho/MorphoVaultStrategyV2.sol,
morpho/v2/MorphoVaultV2Strategy.sol,
base/RewardPrePayMorpho.sol,
sky/SavingsDaiStrategy.sol,
stakeDao/StakeDAOLendStrategy.sol,
convex/ConvexStrategyCvxCRV.sol.
Checked for: a stranger
redeeming the parked
4626 / Morpho / sDAI
shares; withdraw that
pays the vault more
than idle plus supplied
minus reserved fee;
permissionless
morphoClaim that
forwards arbitrary
calls; salvage of
receipt tokens by a
third party.
Result: no user-exploitable finding. Not submitted.
- Inactive
IERC4626.asset()must matchunderlying. The whole 4626 increase is fee (depositors keep a flat share price). A dip nets against unpaid fee so a later recovery cannot mint fee from principal. User_redeemuses 4626withdrawand reverts if short. Fee redeem usesmaxWithdraw.investedis idle + stored − pending fee. Withdraw / hard-work arerestricted. Salvage refuses underlying / fToken. - Morpho V2 /
MorphoVaultV2Strategyrequire Morphoasset()=underlying.currentSuppliedisconvertToAssetsof this strategy’s shares. Fee is a slice ofcurrent − stored.withdrawToVaulttransfers the requested amount (reverts if short). Reward swaps useminOut = 1(known Harvest keeper sandwich). Streaming only delays sale; it does not move principal. morphoClaimis an arbitrary call todistrthat then forwards the MORPHO delta tomorphoPrePay. Callers aremorphoPrePayor governance.RewardPrePayMorhpowraps that behindonlyHardWorkerOrGovernanceand only adjusts its own earned / claimed ledger. Not a third-party drain.- sDAI requires
IERC4626.asset()=underlying. Same stored / pending-fee 4626 pattern. Withdraw isrestricted. - StakeDAO lend
requires the lending
vault
asset()=underlyingand the StakeDAO vaultasset()= lending vault LP. Unwrap previews the LP amount, withdraws that + 1 from the stake vault, then 4626-withdraws underlying. Restricted;minOut = 1on reward swaps. - cvxCRV requires the
Convex reward pool
stakingToken=underlying. Partial unwrap + transfer of the requested amount reverts if short. CRV is either Curve-swapped to cvxCRV withmin = crvInor deposited viacrvDeposit.
Not submitted. Remaining
Harvest is the polygon
(f24a06a) and
arbitrum trees.
2026-09-03: Harvest polygon CompoundBlue / chef leftover (f24a06a)
Immunefi program
harvest ($100,000,
kyc: false). Listed
GitHub tree
harvestfi/harvest-strategy-polygon
(3 Apr 2023). Local
clone
/tmp/harvest-strategy-polygon
at f24a06a
(Add merkl toggle).
No mainnet interaction.
Files:
contracts/strategies/compound-blue/CompoundBlueStrategy.sol,
base/masterchef-base/MasterChefStrategy.sol,
base/sushi-base/MiniChefV2Strategy.sol,
base/ape-base/MiniApeV2Strategy.sol,
base/noop/NoopStrategy.sol.
Checked for: a stranger
redeeming MetaMorpho /
chef LP; withdraw that
pays more than idle
plus staked; chef
deposit to a
mismatched LP; salvage
of receipt tokens by a
third party.
Result: no user-exploitable finding. Not submitted.
- Compound Blue
(MetaMorpho)
asset()must matchunderlying. Supply deposits toaddress(this). Fee is a slice ofcurrent − storedpreviewRedeem. Withdraw / hard-work arerestricted. Transfer of the requested amount reverts if short. Salvage refuses underlying / reward / market. Reward swaps useminOut = 1(known Harvest keeper sandwich). - MasterChef
poolInfo(poolId)LP must equalunderlying. MiniChef / MiniApelpToken(poolId)must equalunderlying. Deposit / withdraw go toaddress(this). Partial unwrap is capped at the chef balance; transfer of the requested amount reverts if short. RouteramountOutMin = 1andaddLiquiditymins of 1 are the same trusted-keeper path. Routes start empty and are governance-set. - Noop holds idle
underlying only.
Withdraw requires
balance >= amountand isrestricted. Salvage mapping marks underlying unsalvageable.
Not submitted. Remaining
Harvest polygon is
Aave / Aura /
Balancer / Convex /
Gamma / Idle / Quick
Gamma / Pearl /
Meshswap / Jarvis /
Complifi / compound-v2
wrappers. Remaining
Harvest listed tree is
harvest-strategy-arbitrum
125270d.
2026-09-03: Harvest polygon Aave / Aura / Balancer / Convex / Idle leftover (f24a06a)
Immunefi program
harvest ($100,000,
kyc: false). Listed
GitHub tree
harvestfi/harvest-strategy-polygon
(3 Apr 2023). CompoundBlue
/ chef leftover on pin
f24a06a is already
logged. Local clone
/tmp/harvest-strategy-polygon.
No mainnet interaction.
Files:
contracts/strategies/aave/AaveSupplyStrategy.sol,
aura/AuraStrategy.sol,
balancer/BalancerStrategyV3.sol,
convex/base/ConvexStrategy.sol,
idle/IdleFinanceStrategy.sol.
Checked for: a stranger
redeeming aTokens /
Aura BPT / Idle
receipts; withdraw that
pays more than idle
plus staked; booster
or Balancer pool that
does not match
underlying.
Result: no user-exploitable finding. Not submitted.
- Aave supply requires
aToken.UNDERLYING_ASSET_ADDRESS()=underlying. Supply / withdraw go toaddress(this)viaaToken.POOL(). Fee is a slice ofcurrent − storedaToken balance. Withdraw / hard-work arerestricted. Transfer of the requested amount reverts if short. Salvage refuses underlying / aToken. - Aura requires
Balancer
getPoolLPT and AurapoolInfoLPT both equalunderlying. Deposit usesbooster.depositAll. Partial unwrap is capped at the Aura balance; transfer of the requested amount reverts if short. Reward swaps and Balancer join useminOut = 1(known Harvest keeper sandwich). - Balancer V3
getPool(poolId)LPT must equalunderlying. Same restricted unwrap + exact transfer. Swap routes and Balancer hop pool IDs are governance-set. - Convex booster
poolInfoLP must equalunderlying. Same restricted unwrap + exact transfer. - Idle is a
non-upgradeable
strategy. Withdraw
is
restricted.protectedblocks a falling Idle price. Redeem requires the underlying received ≥ requested (or ≥ idle × stored virtual price on full exit). Salvage marks underlying and idle receipts.
Not submitted. Remaining
Harvest polygon is
Gamma / Quick Gamma /
Pearl / Meshswap /
Jarvis / Complifi /
compound-v2 / Yel /
Ape wrappers. Remaining
listed tree is
harvest-strategy-arbitrum
125270d.
2026-09-03: Harvest polygon Gamma / Pearl / Meshswap leftover (f24a06a)
Immunefi program
harvest ($100,000,
kyc: false). Aave /
Aura leftover on the
same pin f24a06a is
already logged. This
slice is Gamma Merkl,
Quick Gamma (V1/V2),
Uniswap Gamma, Pearl
hodl, Caviar, and
Meshswap. Local clone
/tmp/harvest-strategy-polygon.
No mainnet interaction.
Files:
contracts/strategies/gamma-merkl/GammaMerklStrategy.sol,
quick-gamma/QuickGammaStrategy.sol,
quick-gamma/QuickGammaStrategyV2.sol,
uniswap-gamma/UniswapGammaStrategy.sol,
pearl/PearlHodlStrategy.sol,
pearl/CaviarStrategy.sol,
meshswap/MeshswapStrategy.sol.
Checked for: a stranger
redeeming hypervisor /
gauge / chef LP;
withdraw that pays
more than idle plus
staked; chef or gauge
deposit to a
mismatched LP; salvage
of receipt tokens by a
third party.
Result: no user-exploitable finding. Not submitted.
- Gamma Merkl holds
hypervisor LP idle
(no stake). Withdraw
is
restrictedand transfers the requested amount (reverts if short). Reward swaps and UniProxy deposit useminOut = 1/ zero minIn (known Harvest keeper sandwich). - Quick Gamma V1/V2
require MasterChef
lpToken(poolId)=underlying. Partial chef withdraw is capped; transfer of the requested amount reverts if short. - Uniswap Gamma
requires the
staking-rewards
stakingToken=underlying. Same restricted unwrap + exact transfer. - Pearl hodl requires
gauge
TOKEN()=underlying. Rewards are swapped and deposited into a separate hodl vault, then notified to a PotPool (not returned as vault principal). Partial gauge withdraw is capped. - Caviar requires
chef
underlying()= strategyunderlying. Same restricted unwrap + exact transfer. Only the claimed underlying slice is treated as reward. - Meshswap holds the
Mesh pair LP idle
and claims on the
pair. Withdraw is
restricted.addLiquiditymins of 1 are keeper- trusted. Token0 / token1 are read from the pair.
Not submitted. Remaining
Harvest polygon is
Jarvis / Complifi /
compound-v2 / Yel /
Ape wrappers. Remaining
Harvest listed tree is
harvest-strategy-arbitrum
125270d.
2026-09-03: Harvest polygon Jarvis / Complifi / Compound / Yel leftover (f24a06a)
Immunefi program
harvest ($100,000,
kyc: false). Gamma /
Pearl leftover on the
same pin f24a06a is
already logged. This
slice is Jarvis V3 +
hodl, Complifi +
derivative, Compound
Comet, Yel, and Ape
wrappers. Local clone
/tmp/harvest-strategy-polygon.
No mainnet interaction.
Files:
contracts/strategies/jarvis/JarvisStrategyV3.sol,
jarvis/JarvisHodlStrategyV3.sol,
complifi/ComplifiStrategy.sol,
complifi/ComplifiDerivStrategy.sol,
compound/CompoundStrategy.sol,
yel/YelStrategy.sol,
ape/ApeStrategyMainnet_*.sol.
Checked for: a stranger
redeeming chef / Comet
/ derivative positions;
withdraw that pays
more than idle plus
staked; chef deposit
to a mismatched LP;
salvage of receipt
tokens by a third
party.
Result: no user-exploitable finding. Not submitted.
- Jarvis V3 requires
ElysianFields
poolInfoLP =underlyingand one DMM token = reward. Partial chef withdraw is capped; transfer of the requested amount reverts if short. Kyber zap usesminLpQty = 1(known keeper sandwich). Hodl zaps rewards into a separate LP, deposits a hodl vault, and notifies a PotPool (not vault principal). - Complifi requires
poolInfoLP =underlying. Same restricted unwrap + exact transfer. Router mins of 1 are keeper-trusted. - Complifi derivative
stakes underlying +
up/down tokens.
investedUnderlyingBalancecounts only the underlying pid + idle (up/down are extra). Partial withdraw unwraps only the underlying pid.redeemDerivativesis governance-only. - Compound Comet
baseTokenmust matchunderlying. Fee is a slice ofcurrent − stored. Withdraw / hard-work arerestricted. Salvage refuses underlying / reward / market. - Yel requires
MasterChef
poolInfoLP =underlying. Same restricted unwrap + exact transfer. - Ape Mainnet files only set MiniApe pool + routes (chef leftover already logged). Genomes are Noop wrappers (already logged).
Not submitted. Listed
Harvest polygon GitHub
leftover is exhausted.
Remaining Harvest
listed tree is
harvest-strategy-arbitrum
125270d.
2026-09-03: Harvest Arbitrum Camelot / Silo / Venus leftover (125270d)
Immunefi program
harvest ($100,000,
kyc: false). Listed
GitHub tree
harvestfi/harvest-strategy-arbitrum
(3 Apr 2023; re-added
15 Mar 2024). Local
clone
/tmp/harvest-strategy-arbitrum
at 125270d
(Merge pull request #29 from Crypto-One-dev/stakedao-llama-vaults).
No mainnet interaction.
Files:
contracts/strategies/camelot/CamelotV3Strategy.sol,
silo/SiloLendStrategy.sol,
silo/SiloVaultStrategy.sol,
venus/VenusFoldStrategy.sol.
Aave / Aura / Dolomite /
Euler / Fluid / Morpho /
Notional / StakeDAO on
this tree reuse the
already-logged mainnet
money paths.
Checked for: a stranger redeeming Silo shares or hypervisor LP; Venus flash callback that is not Balancer; withdraw that pays more than idle plus supplied minus fee.
Result: no user-exploitable finding. Not submitted.
- Camelot holds Gamma
hypervisor LP idle
(
underlyingis the LP). Withdraw / hard-work arerestricted. Transfer of the requested amount reverts if short. Reward swaps useminOut = 1. xGRAIL is deposited to a configured vault and notified topotPool(extra reward, not principal). - Silo lend / vault
require 4626
asset()=underlying. Supply / redeem payaddress(this). Fee is a slice ofcurrent − stored. Withdraw isrestricted. Transfer usesmin(requested, idle)after redeem. - Venus fold requires
cToken.underlying()=underlying. Borrow target is strictly below the collateral factor.receiveFlashLoanrequiresmsg.sender == bVaultand XOR ofmakingFlashDeposit/makingFlashWithdrawal. Deposit supplies then borrows the repay. Withdraw repays then redeems, then pays Balanceramount + fee.investedis idle + stored net −pendingFee.
Not submitted. Listed Harvest GitHub leftover (mainnet + polygon + Arbitrum unique bases) is exhausted.
2026-09-03: Marinade crank / withdraw-stake leftover (b8fe3f8)
Immunefi program
marinade ($250,000,
kyc: false). User /
LP leftover on the same
pin b8fe3f8 is
already logged. This
slice is the crank and
withdraw_stake_account
path. Local clone
/tmp/marinade-lsp.
No mainnet interaction.
Files:
instructions/crank/stake_reserve.rs,
deactivate_stake.rs,
merge_stakes.rs,
user/withdraw_stake_account.rs,
admin/emergency_pause.rs.
Checked for: a crank
that stakes reserve
SOL to a stranger’s
stake account; merge
that sends active
stake to
operational_sol;
withdraw-stake that
pays more SOL than the
burned mSOL; pause
without the pause
authority.
Result: no user-exploitable finding. Not submitted.
stake_reserveis permissionless. The new stake is initialized with the deposit / withdraw PDAs. Reserve transfers only to that account and only when the validator is under target and inside the epoch stake- delta window. Extra same-epoch runs consumeextra_stake_delta_runs.deactivate_stakechecks the stake list entry, vote, and last-update delegation. Split / deactivate is signed by the deposit PDA.merge_stakesmerges two listed accounts for the same validator. Rent / leftover SOL on the source goes tooperational_sol_account(the documented ops wallet), not a caller-chosen destination.withdraw_stake_accountis feature-gated. It checks the token source, burns the caller’s mSOL (fee slice to treasury), splitsmsol_to_sol − feewith min-stake remainder, then authorizes the split account’s staker and withdrawer tobeneficiary.- Pause / resume
require
pause_authority.
Not submitted. Remaining
Marinade is admin
config / authority,
validator add-remove /
score / emergency
unstake, crank
update /
create_canonical_stake
/ delinquent upgrade.
2026-09-03: Marinade admin / validator / update leftover (b8fe3f8)
Immunefi program
marinade ($250,000,
kyc: false). User /
LP and crank /
withdraw-stake leftovers
on pin b8fe3f8 are
already logged. This
slice is admin config,
validator management,
and the remaining crank
update / delinquent
paths. Local clone
/tmp/marinade-lsp.
No mainnet interaction.
Files:
instructions/admin/change_authority.rs,
config_marinade.rs,
config_lp.rs,
config_validator_system.rs,
initialize.rs,
management/add_validator.rs,
remove_validator.rs,
set_validator_score.rs,
emergency_unstake.rs,
partial_unstake.rs,
crank/update.rs,
create_canonical_stake.rs,
finalize_delinquent_upgrade.rs.
Checked for: a stranger changing admin / fees / authorities; validator add that skips the manager; emergency unstake that sends SOL to the caller; update that mints mSOL to a stranger or withdraws rewards off the reserve PDA.
Result: no user-exploitable finding. Not submitted.
change_authority,config_marinade, andconfig_lprequireadmin_authority. Reward / delayed- unstake / withdraw- stake / deposit fees are capped.config_lpre-validates min ≤ max.min_depositmay be 0 oru64::MAX(deposit stop), documented.- Validator manager
(not a stranger)
adds / removes /
scores / emergency-
unstakes / partial-
unstakes.
Add creates a
0-space PDA flag.
Remove sends the
flag’s rent to
operational_sol_account(has_one). Emergency unstake requires score 0, listed stake + vote, and deactivates via the deposit PDA. Partial unstake is capped at the validator’s score target; unused split rent returns to the payer. initializetakes a zeroed state, empty mSOL mint with PDA mint authority, and reserve PDA bump.- Crank
updateis permissionless. Extra / deactivated lamports withdraw to the reserve PDA via the withdraw PDA. Protocol fee mints mSOL to the configured treasury at the pre-update price. Deactivated rent goes tooperational_sol_accountonly. finalize_delinquent_upgradeonly walks the upgrade cursor and writes validator active balances back from the snapshot. No SOL leaves the program.
Not submitted. Remaining
Marinade listed GitHub
is create_canonical_stake
split / list-realloc
details if a later
tree adds them.
2026-09-03: Marinade create-canonical / realloc leftover (b8fe3f8)
Immunefi program
marinade ($250,000,
kyc: false). Admin /
validator / update
leftover on pin
b8fe3f8 is already
logged. This slice is
the remaining crank
split and list realloc.
Local clone
/tmp/marinade-lsp.
No mainnet interaction.
Files:
instructions/crank/create_canonical_stake.rs,
admin/realloc_stake_list.rs,
admin/realloc_validator_list.rs.
Checked for: a crank that splits listed stake to a caller- chosen account; leftover SOL on the canonical PDA going to the caller; realloc that shrinks a list and deletes records.
Result: no user-exploitable finding. Not submitted.
create_canonical_stakeis permissionless but the destination must be the PDAfind_canonical_stake_address(state, validator). Source must be listed, delegated, not deactivating, andlast_update_delegated_lamportsmust equal the live delegation. The vote must match the validator index. Extra lamports on the canonical system account go tooperational_sol_account(has_one). Split is signed by the deposit PDA and moves the whole source (stake + rent) onto that PDA. The list then adds the canonical account and removes the source. No SOL leaves to the caller.realloc_stake_list/realloc_validator_listrequireadmin_authority. Capacity cannot shrink below the current count.
Not submitted. Listed Marinade GitHub leftover is exhausted.
2026-09-03: Instadapp DSA leftover (fef062a)
Immunefi program
instadapp ($500,000,
kyc: false). Listed
smart-contract trees
are dsa-contracts,
avocado-contracts-public,
fluid-contracts-public,
and inst-governance.
This slice is DSA.
Local clone
/tmp/instadapp-dsa at
fef062a
(Merge pull request #87 from Instadapp/security/harden-ci-pull-request-target).
No mainnet interaction.
Files:
contracts/registry/index.sol,
v2/accounts/module1/Implementation_m1.sol,
v2/accounts/default/implementation_default.sol,
v2/proxy/accountProxy.sol,
v2/registry/implementations.sol,
v2/registry/connectors.sol.
Checked for: a stranger
cast on another
user’s DSA; adding a
malicious implementation
or connector; enable
that grants a stranger
auth.
Result: no user-exploitable finding. Not submitted.
castrequires_auth[msg.sender]ormsg.sender == instaIndex. Spellsdelegatecallonly connectors returned byisConnectors(name → address must be registered and non-zero).enableisselforinstaIndex.disable/toggleBetaareselfonly.- Implementations
add / remove /
default are
instaIndex.master. Connectors add / update / remove are chief or master. buildclones the versioned account module,list.inits it, andenables the requested owner.buildWithCastonly casts on the new account.
Not submitted. Remaining
Instadapp is Avocado,
Fluid, and
inst-governance.
2026-09-03: Instadapp Avocado leftover (0bc1dd9)
Immunefi program
instadapp ($500,000,
kyc: false). DSA on
the same program is
already logged. This
slice is Avocado.
Local clone
/tmp/instadapp-avocado
at 0bc1dd9. No
mainnet interaction.
Files:
contracts/AvoDepositManager.sol,
AvocadoMultisig/AvocadoMultisig.sol,
AvocadoMultisig/AvocadoMultisigCore.sol,
AvoForwarder.sol,
AvoFactory.sol.
Checked for: a stranger
cast on another
user’s Avocado;
withdraw of pooled
deposit-token without
auth; flashloan
callback that runs
unsigned actions;
forwarder execute that
targets the wrong
wallet.
Result: no user-exploitable finding. Not submitted.
castrequiresmsg.sender == avoForwarder. Signatures recover allowed signers (ordered, enough forrequiredSigners). Digest includes chain salt. Nonce −1 occupies a non-sequential slot.castAuthorizeduses the same verifier without the forwarder.executeOperationrequires a transient hash of the callback data +initiator == this._callTargetsrequires its own transient hash.- Forwarder
executeV1isonlyBroadcasterand deploys / calls the Avocado forfrom_+index_. - Deposit manager
depositOnBehalfonly pulls tokens in.requestWithdrawisonlyAvocado. Source / referral request is permissionless butprocessWithdrawisonlyAuthsand pays the storedto. Balances are off-chain by design. Auths are trusted operators.systemWithdrawisonlyAuths.
Not submitted. Remaining
Instadapp is Fluid and
inst-governance.
2026-09-03: Stader Penalty / PoolSelector / PoolUtils / Config leftover (9d4a921)
Immunefi program
staderforeth
($1,000,000, kyc: false).
User path, oracle /
factory / insurance /
auction / socializing,
and registries / vaults
/ SD / pools on the
same pin 9d4a921 are
already logged. This
slice is the last
listed etherscan
leftover:
StaderConfig
0x4ABEF2263d5A5ED582FC9A9789a41D85b68d69DB,
Penalty
0x84645f1B80475992Df2C65c28bE6688d15dc6ED6,
PoolSelector
0x62e0b431990Ea128fe685E764FB04e7d604603B0,
PoolUtils
0xeDA89ed8F89D786D816F8E14CF8d2F90c6BF763f.
The last listed row is
Primacy of Impact
(immunefi.com). Local
clone /tmp/stader-ethx.
No mainnet interaction.
Files:
Penalty.sol,
PoolSelector.sol,
PoolUtils.sol,
StaderConfig.sol.
Checked for: a stranger zeroing another validator’s penalty before settle; reward share math that pays the operator the user leg; pool allocation that a stranger can redirect; config setters that are not role-gated.
Result: no user-exploitable finding. Not submitted.
- Penalty
updateTotalPenaltyAmountis permissionless accounting from Rated MEV strikes plus oracle missed- attestation counts plus manageradditionalPenaltyAmount.markValidatorSettledrequiresmsg.senderto be that validator’s withdraw vault (getPubkeyForValidSender) and zeros that pubkey’s total. Additional / per- strike / Rated address updates are manager-only. - PoolUtils
processValidatorExitListis operator-role and only emitsExitValidator.processOperatorExitis SD utility pool only and also only emits.calculateRewardShareis view: user share is remainder after protocol fee on the user-ETH fraction and operator collateral + operator fee.addNewPool/updatePoolAddressare admin. - PoolSelector
computePoolAllocationForDepositis view.poolAllocationForExcessETHDepositis SPM-only and walks pools frompoolIdArrayIndexForExcessDeposit. Weights update is manager and must sum to 10000. - StaderConfig
address / token /
implementation
setters are
DEFAULT_ADMIN_ROLE. Amount / threshold setters are MANAGER or admin. Batch-size is OPERATOR.
Do not file permissionless penalty refresh or operator- role exit events as user theft.
Not submitted. Listed Stader leftover is exhausted (remaining row is Primacy of Impact).
2026-09-03: Symbiosis MetaRouter leftover (Sourcify)
Immunefi program
symbiosis
($100,000, kyc: false).
Listed leftover is
MetaRouter +
MetaRouterGateway on
Ethereum, BSC,
Avalanche, and Polygon
(2022 explorer rows).
Ethereum Sourcify
exact_match on
MetaRouter
0xf621Fb08BBE51aF70e7E0F4EA63496894166Ff7F
and Gateway
0xfCEF2Fe72413b65d3F393d278A714caD87512bcd
(solc 0.8.7, verified
2024-08-08). Other
chains returned
Sourcify 400; same
type labels. Extract
/tmp/symbiosis. No
mainnet interaction.
Files:
contracts/synth-core/metarouter/MetaRouter.sol,
MetaRouterGateway.sol,
MetaRouteStructs.sol.
Checked for: a stranger using someone else’s Gateway approval; arbitrary DEX / relay calldata that spends a victim’s tokens; leftover on the router that a stranger can take as user funds at rest.
Result: no user-exploitable finding. Not submitted.
- Gateway
claimTokensisonlyMetarouterandtransferFroms_from.metaRoutealways claims_msgSender(). A Gateway approval cannot be spent by a third party. metaRoutethencalls user-chosen DEX / relay contracts (not the Gateway) and patches swap / other-side amounts from this contract’sbalanceOf. That is the caller’s own route.externalCall,returnSwap, andmetaMintSwapare permissionless and only move tokens already on the router. Comments say Portal / Synthesis call them; there is no caller gate. FailedexternalCallrefunds_amountto_to. That can sweep leftover sitting on the router. Do not file without a proven official flow that parks user funds on MetaRouter across transactions.metaMintSwapleftover of the lastswapTokensentry is sent toto.
Do not file leftover sweep or user-supplied router calldata as theft of funds at rest.
Not submitted. Listed Symbiosis leftover is exhausted.
2026-09-03: Benqi core markets leftover (Sourcify + e0cfd24)
Immunefi program
benqi
($500,000, kyc: false).
Dual Oracle leftover
is already logged.
This slice is the
core money path:
Unitroller
0x486Af39519B4Dc9a7fCcd318217352830E8AD9b4,
qiAVAX
0x5C0401e81Bc07Ca70fAD469b451682c0d747Ef1c,
qiUSDC
0xBEb5d47A3f720Ec0a390d04b4d41ED7d9688bC7F,
and Maximillion
0xd78DEd803b28A5A9C860c2cc7A4d84F611aA4Ef8.
Avalanche Sourcify
match (solc 0.5.17,
verified 2024-08-08).
Official tree
Benqi-fi/BENQI-Smart-Contracts
e0cfd24. Extract
/tmp/benqi. No
mainnet interaction.
Files:
lending/QiToken.sol,
Comptroller.sol,
QiAvax.sol,
QiErc20Delegator.sol,
Maximillion.sol,
Unitroller.sol.
Checked for: a stranger minting to themselves from a victim’s tokens; redeem that pays more underlying than the burned qiTokens; liquidation / seize that pulls collateral without a listed shortfall; Maximillion that keeps excess AVAX; Unitroller implementation swap without admin.
Result: no user-exploitable finding. Not submitted.
- Empty-market
exchangeRateStoredInternalreturnsinitialExchangeRateMantissa. Live listed markets have supply. Do not file vanilla Compound first- depositor inflation without proving a listed market is empty. mintFreshpulls from the minter and mints to the minter.redeemFreshburns the redeemer’s qiTokens and pays the redeemer.mintAllowedrequires the market listed and not mint-paused.- QiAvax fallback
mints.
getCashPriorsubtractsmsg.valueso the incoming mint is not in the rate.doTransferInrequiresmsg.sender == fromandmsg.value == amount. - Liquidate requires
both markets listed,
borrower shortfall,
and repay ≤ close
factor.
seizeusesmsg.senderas seizerToken.seizeAllowedrequires both markets listed and the same comptroller. Protocol seize share goes to reserves. - Maximillion
repayBehalfrefunds excess AVAX tomsg.sender. Delegator_setImplementationis admin. Unitroller_setPendingImplementationis admin;_acceptImplementationis the pending implementation.
Do not file Compound first-depositor inflation, Maximillion excess refund, or seize-via-msg.sender as a finding.
Not submitted. Other
listed qiToken markets
(qiLINK / qiETH
Sourcify match,
same 0.5.17 type) are
the same QiAvax /
QiErc20Delegator
path. Remaining Benqi
listed: isolated
unitroller
0xD7c4006d…763F
(Sourcify 404), QI
token, gauges, sAVAX,
Ignite, veQI,
distributors, token
sale, staking proxies,
JumpRateModel
(Sourcify 404), Pause
Guardian.
2026-09-03: Benqi QI token leftover (Sourcify + e0cfd24)
Immunefi program
benqi
($500,000, kyc: false).
Core markets leftover
is already logged.
This slice is QI
0x8729438EB15e2C8B576fCc6AeCdA6A148776C0F5.
Avalanche Sourcify
match (solc 0.5.16,
verified 2024-08-08,
Qi.sol:Qi). Official
tree
lending/Governance/Qi.sol
at e0cfd24 matches
aside from line
endings. Extract
/tmp/benqi/src/QI.sol.
No mainnet
interaction.
Files:
lending/Governance/Qi.sol.
Checked for: a mint after construct; a transfer / transferFrom that credits more than it debits; permit or delegateBySig that moves another user’s tokens without their signature.
Result: no user-exploitable finding. Not submitted.
- Constructor mints
the constant
totalSupply(7.2e9 × 1e18) to one account. There is no later mint. Balances areuint96; supply fits. transfer/transferFromusesafe96/sub96/add96. Zero address is blocked. Infinite allowance isuint96(-1).permithashesrawAmountand increments the nonce beforeecrecover. Invalid signatures burn the nonce (COMP-token griefing). Do not file.delegateBySigbinds chain id and consumesnonces[signatory]. Votes follow balances via_moveDelegates.
Do not file COMP-style permit nonce griefing or missing mint as a finding.
Not submitted.
Remaining Benqi
listed: isolated
unitroller (Sourcify
404), gauges / sAVAX /
veQI (Sourcify is the
proxy only), Ignite /
MultiReward /
JumpRateModel / Pause
Guardian / sAVAX
timelock (Sourcify
404), token sale
(proxy exact_match),
staking proxies.
2026-09-03: Benqi token-sale distributor leftover (e0cfd24)
Immunefi program
benqi
($500,000, kyc: false).
QI token leftover is
already logged. This
slice is
QiTokenSaleDistributorProxy
0x77533A0b34cd9Aa135EBE795dc40666Ca295C16D.
Avalanche Sourcify
exact_match (solc
0.6.12, verified
2024-08-08). Official
tree
token_sale/ at
e0cfd24. No mainnet
interaction.
Files:
token_sale/QiTokenSaleDistributor.sol,
QiTokenSaleDistributorProxy.sol,
QiTokenSaleDistributorStorage.sol.
Checked for: a stranger claiming another recipient’s vested QI; claim that pays more than vested minus already claimed; proxy implementation swap without admin.
Result: no user-exploitable finding. Not submitted.
claimisnonReentrantand only walksmsg.senderrounds. It adds the newly claimable amount toclaimedTokensthentransfers QI tomsg.sender.- Vesting uses
constant
vestingScheduleEpochand monthlyreleasePeriodLength. Claimable is vested-to-date minus claimed. AdminsetPurchasedTokensByUserpre-marks the initial-release slice as claimed (bookkeeping, not a stranger path). setPurchasedTokensByUser/resetPurchasedTokensByUserareadminOrDataAdminOnly.withdrawQiandsetQiContractAddressareadminOnly.- Proxy
setPendingImplementationis admin;acceptPendingImplementationis the pending implementation.
Do not file admin
withdrawQi or
data-admin allocation
as a user finding.
Not submitted.
Remaining Benqi
listed: isolated
unitroller (Sourcify
404), gauges / sAVAX /
veQI (proxy-only),
Ignite / MultiReward /
JumpRateModel / Pause
Guardian / sAVAX
timelock / JLP staking
(Sourcify 404), PGL
staking proxy
(match).
2026-09-03: Benqi PGL staking leftover (e0cfd24)
Immunefi program
benqi
($500,000, kyc: false).
Token-sale leftover is
already logged. This
slice is
PglStakingContractProxy
0x784DA19e61cf348a8c54547531795ECfee2AfFd1.
Avalanche Sourcify
match (solc 0.5.17,
PglStakingContractProxy.sol).
Official tree
pgl_staking/ at
e0cfd24. No mainnet
interaction.
Files:
pgl_staking/PglStakingContract.sol,
PglStakingContractProxy.sol,
PglStakingContractStorage.sol.
Checked for: a stranger redeeming another staker’s PGL; claim that pays more reward than accrued; deposit that credits more shares than tokens received.
Result: no user-exploitable finding. Not submitted.
depositmeasuresbalanceOfbefore / aftertransferFromand creditsmsg.senderwith the received amount.redeemrequirespglAmount <= supplyAmount[msg.sender]and transfers PGL tomsg.sender.claimRewardsonly paysaccruedReward[msg.sender][QI]viaclaimErc20. AVAX claimable is hardcoded 0 (comment: erroneously emitted AVAX). Do not file stuck AVAX as theft.- Reward speeds and
token addresses are
adminOnly. Proxy implementation swap is admin / pending implementation.
Do not file admin token-address changes or the AVAX-zero view as a user finding.
Not submitted. Remaining Benqi listed: isolated unitroller (Sourcify 404), gauges / sAVAX / veQI (proxy-only), Ignite / MultiReward / JumpRateModel / Pause Guardian / sAVAX timelock / JLP staking (Sourcify 404). Listed Sourcify-open Benqi leftover is exhausted.
2026-09-03: Beanstalk L2 diamond + tokens leftover (8e22cd2)
Immunefi program
beanstalk
($1,100,000, kyc: false).
Basin leftover
(Pipeline / Depot /
Well / Aquifer / CP2 /
MFP) is already
logged. This slice is
the L2 diamond and
listed tokens.
Arbitrum Sourcify
exact_match: L2
Beanstalk
0xD1A0060b…15FB70
(Diamond.sol, solc
0.8.25), Bean /
Unripe Bean / Unripe
LP
(BeanstalkERC20.sol),
Fertilizer impl
0xFEFEFE2c…5f1490,
Shipment Planner
0x55555598…EEef5.
L1 diamond
0xC1E088fC…5624C5
is Ethereum Sourcify
match (Diamond.sol
0.7.6). Fertilizer
proxy Sourcify 404.
Official tree
BeanstalkFarms/Beanstalk
8e22cd2. No mainnet
interaction.
Files:
contracts/beanstalk/Diamond.sol,
silo/SiloFacet/SiloFacet.sol,
TokenSilo.sol,
ConvertFacet.sol,
field/FieldFacet.sol,
barn/FertilizerFacet.sol,
UnripeFacet.sol,
farm/TractorFacet.sol,
tokens/ERC20/BeanstalkERC20.sol,
tokens/Fertilizer/Fertilizer.sol,
ecosystem/ShipmentPlanner.sol.
Checked for: a
stranger withdrawing
or transferring
another farmer’s Silo
deposit without
allowance; harvest of
another account’s
plots; Fertilizer mint
or rinse that pays
the caller someone
else’s Beans; chop
that burns a victim’s
Unripe; Tractor that
runs without a valid
publisher signature;
Bean mint without
MINTER_ROLE.
Result: no user-exploitable finding. Not submitted.
- Silo
deposit/withdrawDepositmove tokens forLibTractor._user().transferDepositspends deposit allowance unlesssender == _user(). - Field
sow/harvestcredit_user(). Harvest deletess.accts[account].plotsfor_user()only. - Fertilizer
claimFertilized/mintFertilizeruse_user().payFertilizerrequiresmsg.sender == fertilizer. ImplbeanstalkMint/beanstalkUpdateareonlyOwner. chopburns Unripe from_user()and sends ripe to_user().- Tractor
activePublisheris set only after EIP-712 recover of the blueprint publisher._user()is that publisher, elsemsg.sender. - Bean / Unripe
mintisMINTER_ROLE. Planner getters are view. Diamondcutis owner. - Anti-lambda convert is same-token BDV restem, documented as permissionless. Do not file as theft.
Do not file Tractor operator paste or anti-lambda restem without a signed- slot / token-move bypass.
Not submitted. Remaining Beanstalk listed: Junctions, Unwrap-and-Send-ETH, LSD Chainlink Oracle, Fertilizer proxy (Sourcify 404), marketplace / season / pipeline-convert facets.
2026-09-03: Beanstalk Junctions / UnwrapETH / LSD / marketplace leftover (8e22cd2)
Immunefi program
beanstalk
($1,100,000, kyc: false).
Basin and L2 diamond
- tokens leftovers
are already logged.
This slice is the
remaining listed
Sourcify-open
contracts plus the
diamond marketplace /
pipeline-convert /
season leftover.
Arbitrum Sourcify
exact_match: Junctions0x5A5A5ADe…E2cD(src/Junction.sol, solc 0.8.26, verified 2026-01-20), UnwrapAndSendETH0xD6Fc4a63…A4749, LSDChainlinkOracle0xCCCCCC35…5626. Official tree8e22cd2. No mainnet interaction.
Files:
ecosystem/junction/Junction.sol,
MathJunction.sol,
LogicJunction.sol,
pipeline/junctions/UnwrapAndSendETH.sol,
ecosystem/oracles/LSDChainlinkOracle.sol,
libraries/Oracle/LibChainlinkOracle.sol,
market/MarketplaceFacet/MarketplaceFacet.sol,
silo/PipelineConvertFacet.sol,
sun/SeasonFacet/SeasonFacet.sol.
Checked for: Junction math that mints or moves tokens; UnwrapETH that takes a victim’s WETH approval; oracle that treats a stale or zero feed as live; marketplace fill that spends another farmer’s Beans or plots; pipeline convert that withdraws a stranger’s deposit; sunrise that pays user funds.
Result: no user-exploitable finding. Not submitted.
- Junctions are
pureadd/sub/mul/ div/cmp/check. No storage, no tokens. - UnwrapAndSendETH
unwraps WETH
already on this
helper and sends
ETH to
to. Same leftover-on-helper pattern as Pipeline. Do not file without a proven official park. - LSD oracle
multiplies two
Chainlink feeds
from caller
data.LibChainlinkOraclereturns 0 on revert, round 0, future/zero timestamp, timeout, oranswer <= 0. This is an oracle, not a vault. - Marketplace
listings / orders
require
lister/orderer == _user(). Fill transfers Beans from_user()to the lister. Plot transfer spends pod allowance unlesssender == _user(). pipelineConvertwithdraws and redeposits_user()only. Pipe calls are the already-logged Pipeline sandbox.sunriseis permissionless andnoOutFlow.
Do not file UnwrapETH leftover sweep or caller-supplied oracle feeds as theft of funds at rest.
Not submitted. Listed Beanstalk leftover is exhausted aside from Fertilizer proxy (Sourcify 404).
2026-09-03: Flux Finance leftover (Sourcify)
Immunefi program
fluxfinance
($550,000, kyc: false).
Unique no-KYC listed
slice not previously
logged. Ethereum
Sourcify exact_match:
Unitroller
0x95Af143a…3A51
(solc 0.5.17, verified
2026-02-14), fUSDC /
fDAI / fOUSG
CErc20DelegatorKYC
(solc 0.5.17),
OndoPriceOracleV2
0xba9b10f9…7ef2
(solc 0.8.16),
GovernorBravoDelegator,
Timelock. Extract
/tmp/flux. No mainnet
interaction.
Files:
contracts/lending/compound/Unitroller.sol,
tokens/cToken.sol,
tokens/cErc20ModifiedDelegator.sol,
OndoPriceOracleV2.sol,
compound/governance/GovernanceBravoDelegator.sol,
Timelock.sol.
Checked for: a stranger minting from a victim’s tokens; oracle that treats a stale or zero Chainlink tick as live; Unitroller implementation swap without admin.
Result: no user-exploitable finding. Not submitted.
CErc20DelegatorKYCmint/redeem/seizedelegate._setImplementationis admin. Constructor inits KYC registry + group on the implementation.- Extracted
cTokenmintFreshpulls from the minter and mints to the minter. Empty-market rate isinitialExchangeRateMantissa. Do not file vanilla Compound first- depositor inflation without an empty listed market. - OndoPriceOracleV2
setPrice/setOracle/setFTokenToOracleType/ caps areonlyOwner. Chainlink mode reverts if stale (answeredInRound/ timeout) oranswer < 0. Compound mode requires matching underlyings. Cap ismin. - Unitroller
_setPendingImplementationis admin;_acceptImplementationis the pending implementation.
Do not file owner
setPrice or
Compound first-
depositor inflation
as a finding.
Not submitted. Remaining Flux: Comptroller implementation (not in this Sourcify slice), KYC cToken implementation behind the delegator, Governor Bravo implementation.
2026-09-03: Instadapp Fluid liquidity + fToken leftover (a9949b4)
Immunefi program
instadapp ($500,000,
kyc: false). DSA
and Avocado leftovers
are already logged.
This slice is
fluid-contracts-public
liquidity + lending.
Local clone
/tmp/instadapp-fluid
at a9949b4
(Merge pull request #825 from Instadapp/main).
515 Solidity files.
No mainnet
interaction. DeFi
Saver Fluid leftovers
are DFS integrations,
not this tree.
Files:
liquidity/userModule/main.sol,
liquidity/adminModule/main.sol,
liquidity/interfaces/iLiquidity.sol,
protocols/lending/fToken/main.sol,
protocols/lending/lendingFactory/main.sol.
Checked for: a
stranger operate
that withdraws or
borrows another
protocol’s
accounting; skip /
net-transfer flags
that send tokens to
a caller-chosen
address; fToken
withdraw that burns
a victim’s shares
without allowance;
callback that pulls
from an arbitrary
from.
Result: no user-exploitable finding. Not submitted.
- Liquidity
operateis public but_userSupplyData/_userBorrowDataare keyed bymsg.sender. Undefined users revertUserNotDefined. Auths mustupdateUserSupplyConfigs/ borrow configs first. Withdraw / borrow send to the caller-chosenwithdrawTo_/borrowTo_from that protocol’s own balance. - Transfers in go
through
liquidityCallbackonmsg.senderand require the contract balance increase to match (1% slack). Skip transfers needSKIP_TRANSFERS,from == msg.sender == receiver, and amounts that leave Liquidity even or better. Net transfers needNET_TRANSFERSand the same receiver match. - Admin: governance
sets auths /
guardians /
revenue.
Auths set rates,
user configs, and
collectRevenue. Guardians pause class-0 users only. - fToken deposit
encodes
msg.senderas callbackfrom.liquidityCallbackrequiresmsg.sender == LIQUIDITY, matching asset, and reentrancy entered, thentransferFromthatfrom. Withdraw burnsowner_shares first, thenoperates a withdraw toreceiver_. Non-owner withdraw/redeem spends allowance. FactorycreateTokenis deployer/owner.
Not submitted.
Remaining Instadapp
is Fluid vault /
dex / dexLite /
steth and
inst-governance.
2026-09-03: Instadapp Fluid vault T1 leftover (a9949b4)
Immunefi program
instadapp ($500,000,
kyc: false). Fluid
liquidity + fToken
leftover on pin
a9949b4 is already
logged. This slice is
VaultT1 operate /
liquidate / factory
mint. Same clone
/tmp/instadapp-fluid.
No mainnet
interaction.
Files:
protocols/vault/vaultT1/coreModule/main.sol,
vaultT1/adminModule/main.sol,
factory/main.sol,
factory/ERC721/ERC721.sol.
Checked for: a stranger withdraw or borrow from another user’s NFT; factory mint of a position NFT to the attacker; callback that pulls tokens from a victim; admin fallback that anyone can hit.
Result: no user-exploitable finding. Not submitted.
operatemints a new NFT tomsg.senderwhennftId == 0. Withdraw or borrow on an existing id requiresownerOf == msg.sender. Deposit / payback on someone else’s NFT is a gift, not a drain. Payback callback encodesmsg.sender. Withdraw / borrowoperates Liquidity toto_(ormsg.sender).liquidateis permissionless for underwater ticks and pays the liquidator collateral for repaid debt at the oracle + penalty. Dead-address dry-run reverts with amounts.liquidityCallbackrequiresmsg.sender == LIQUIDITYand reentrancy bit set, thentransferFromthe decodedfrom.- Factory
mintis only the vault for thatvaultId. Fallback admin delegatecall requires global or per-vault auth. Admin module is_verifyCaller(delegatecall only).
Not submitted.
Remaining Instadapp
is Fluid vault T2–T4
/ dex / dexLite /
steth and
inst-governance.
2026-09-03: Instadapp Fluid vault T2–T4 leftover (a9949b4)
Immunefi program
instadapp ($500,000,
kyc: false). Fluid
liquidity / fToken
and vault T1 leftovers
on pin a9949b4 are
already logged. This
slice is T2 (smart
col), T3 (smart debt),
T4 (both) plus the
shared operate /
secondary path. Same
clone
/tmp/instadapp-fluid.
No mainnet
interaction.
Files:
vaultT2/coreModule/main.sol,
mainOperate.sol,
vaultT3/coreModule/main.sol,
vaultT4/coreModule/main.sol,
vaultTypesCommon/coreModule/mainOperate.sol,
helpers.sol,
main.sol,
main2.sol.
Checked for: a
stranger withdraw of
DEX shares before the
NFT owner check;
_dexFromAddress
impersonation;
dexCallback pull
from a victim;
permissionless
rebalance that
drains reserve.
Result: no user-exploitable finding. Not submitted.
- T2–T4
operate/operatePerfectdelegatecallOPERATE_IMPLEMENTATION. Shared_operatestill requiresownerOf == msg.senderfor withdraw or borrow. New NFT mints tomsg.sender. - T2 withdraw burns
DEX supply shares
before
_operate; T2 perfect withdraw burns after. Either way the call is atomic: a failed owner check reverts the DEX move. T3/T4 wrap smart debt the same way. _dexFromAddressstoresmsg.senderand reverts if already set.dexCallbackrequiresmsg.senderis SUPPLY or BORROW and the reentrancy bit, thentransferFromdexFromAddress.liquidityCallbackis LIQUIDITY-only as on T1.rebalanceismsg.sender == rebalancer.absorb/ secondary admin are_verifyCaller(delegatecall). Liquidate remains permissionless for underwater ticks.
Not submitted.
Remaining Instadapp
is Fluid dex /
dexLite / steth and
inst-governance.
2026-09-03: Instadapp Fluid DEX T1 leftover (a9949b4)
Immunefi program
instadapp ($500,000,
kyc: false). Fluid
liquidity / fToken
and vault leftovers
on pin a9949b4 are
already logged. This
slice is DexT1 swap
and col / debt
operations. Same
clone
/tmp/instadapp-fluid.
No mainnet
interaction.
Files:
protocols/dex/poolT1/coreModule/core/main.sol,
colOperations.sol,
debtOperations.sol,
protocols/dex/factory/main.sol.
Checked for: a callback swap that pulls a victim’s tokens; withdraw / borrow of another user’s DEX shares; admin fallback without auth.
Result: no user-exploitable finding. Not submitted.
swapIn/swapOutare permissionless AMM paths withamountOutMin/amountInMax. Liquidityoperatefor the in-leg encodes(amount, isCallback, msg.sender).liquidityCallbackis LIQUIDITY-only, reentrancy-on, 96 bytes: callback hitsfrom_.dexCallbackortransferFromfrom_. Out-leg withdraw / borrow goes toto_(msg.sender if unset).- Col deposit /
withdraw and debt
borrow / payback
delegatecall
implementations.
_userSupplyData/_userBorrowDatafirst bit must be on (allow-listed protocols, e.g. vaults). Withdraw / borrow send to caller-chosento_from that caller’s shares. - Admin fallback requires factory global or per-dex auth. Factory deploy / deployer / auth writes are owner.
Not submitted.
Remaining Instadapp
is Fluid dexLite /
steth and
inst-governance.
2026-09-03: Instadapp Fluid dexLite leftover (a9949b4)
Immunefi program
instadapp ($500,000,
kyc: false). Fluid
DEX T1 leftover on
pin a9949b4 is
already logged. This
slice is DexLite
swap + admin
fallback. Same clone
/tmp/instadapp-fluid.
No mainnet
interaction.
Files:
protocols/dexLite/core/main.sol,
core/coreInternals.sol,
core/helpers.sol,
adminModule/main.sol.
Checked for: a
callback that pulls
a victim’s tokens;
extraData that
skips paying the
in-leg; fallback
delegatecall by a
stranger.
Result: no user-exploitable finding. Not submitted.
swapSingle/ path swaps takeamountLimit_._transferTokenssends the out-leg first, then pulls the in-leg frommsg.sender(transferFromordexCallbackonmsg.senderwith a balance check). Native path requiresmsg.valueor a callback that increases ETH balance. Unsetto_ismsg.sender.- Non-empty
extraData_skips the default transfer and delegatecallsEXTRA_DATA_SLOT. Unset slot revertsZeroAddress. That hook is admin-configured. - Fallback
delegatecall
requires
_isAuthor Liquidity governance.updateAuth/initializeare_onlyDelegateCall.
Not submitted.
Remaining Instadapp
is Fluid steth and
inst-governance.
2026-09-03: Instadapp Fluid stETH leftover (a9949b4)
Immunefi program
instadapp ($500,000,
kyc: false). Fluid
DEX T1 and dexLite
leftovers on pin
a9949b4 are already
logged. This slice is
the stETH queue.
Same clone
/tmp/instadapp-fluid.
No mainnet
interaction.
Files:
protocols/steth/main.sol,
variables.sol,
proxy.sol.
Checked for: a
stranger claim that
pays leftover ETH to
the caller instead of
claimTo_; queue that
borrows against another
user’s stETH; ERC721
callback that hijacks
the Lido NFT.
Result: no user-exploitable finding. Not submitted.
queuepulls stETH frommsg.sender(allow list if active), queues Lido NFTs to this contract, borrows ETH toborrowTo_, and stores the claim underclaimTo_. LTV is checked againstmaxLTV.claimis permissionless but leftover ETH after Liquidity repay goes toclaimTo_, then the mapping is deleted. A stranger can only pay gas to settle someone else’s claim.liquidityCallbackalways reverts (native repay only).onERC721Receivedaccepts only the Lido queue.
Not submitted.
Remaining Instadapp
is inst-governance.
2026-09-03: Instadapp inst-governance leftover (3fc54af)
Immunefi program
instadapp ($500,000,
kyc: false). DSA,
Avocado, and Fluid
leftovers are already
logged. This slice is
the last listed tree:
inst-governance.
Local clone
/tmp/instadapp-gov
at 3fc54af. No
mainnet interaction.
Files:
contracts/GovernorBravoDelegate.sol,
GovernorBravoDelegator.sol,
Timelock.sol,
TokenDelegate.sol,
TokenDelegator.sol,
payloads/common/main.sol,
payloads/IGP139/PayloadIGP139.sol.
Checked for: a
stranger execute
of an unqueued
payload; payload
propose that
bypasses the
threshold; Timelock
executePayload
callable without a
queued admin tx;
token mint by a
non-master.
Result: no user-exploitable finding. Not submitted.
- Governor Bravo
proposerequires prior votes aboveproposalThreshold.queuerequires Succeeded.executerequires Queued, marks executed, thentimelock.executeTransaction.cancelis the proposer or a proposer now below threshold. - Timelock
queueTransaction/executeTransactionareadminonly (the Governor).executePayloadismsg.sender == thisanddelegatecalls the payload soaddress(this)is the Timelock. - Payload
proposeis proposer / team / Avo multisigs.executerequiresaddress(this) == TIMELOCKandisProposalExecutable. Team can skip actions or toggle executable on the payload; that is operator privilege, not a stranger drain. IGP139withdrawFundsof 155 stETH runs only aftersuper.execute(). - Token
mintisisMaster, aftermintingAllowedAfter, with a percent cap and a mint cooldown.
Not submitted. Listed Instadapp GitHub leftover is exhausted.
2026-09-03: Gnosis Chain tokenbridge + Omnibridge leftover (908a481 / c814f68)
Immunefi program
gnosischain
($2,000,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Four listed
addresses, all
Sourcify match on
EternalStorageProxy
only (solc 0.4.24):
XDaiForeignBridge
Ethereum
0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016,
HomeBridgeErcToNative
Gnosis
0x7301CFA0e1756B71869E93d4e4Dca5c7d0eb0AA6,
ForeignOmnibridge
Ethereum
0x88ad09518695c6c3712AC10a214bE5109a655671,
HomeOmnibridge Gnosis
0xf6A78083ca3e2a662D6dd1703c939c8aCE2e268d.
Extract
/tmp/gnosis-bridge.
Official trees
/tmp/tokenbridge
omni/tokenbridge-contracts
908a481 and
/tmp/omnibridge
omni/omnibridge
c814f68. Do not
treat proxy-only
Sourcify as
exhausting the
implementation.
No mainnet
interaction.
Files:
upgradeability/EternalStorageProxy.sol,
OwnedUpgradeabilityProxy.sol,
erc20_to_native/XDaiForeignBridge.sol,
ForeignBridgeErcToNative.sol,
HomeBridgeErcToNative.sol,
BasicForeignBridge.sol,
BasicHomeBridge.sol,
Validatable.sol,
libraries/Message.sol,
omnibridge BasicAMBMediator.sol,
BasicOmnibridge.sol,
components/common/TokensRelayer.sol,
FailedMessagesProcessor.sol.
Checked for: a
stranger
executeSignatures
that unlocks DAI
without validator
quorum; Home mint
without a matching
Foreign lock;
Omnibridge
handleBridgedTokens
callable by anyone;
owner
claimTokens
sweeping the
bridged DAI /
native lock.
Result: no user-exploitable finding. Not submitted.
- Proxy
upgradeTo/upgradeToAndCallareonlyProxyOwner. Fallbackdelegatecalls the current implementation. - Foreign
executeSignaturesrequiresMessage.hasEnoughValidSignaturesagainstvalidatorContract(),contractAddress == this, and a freshtxHash. ThenonExecuteMessagetransfers DAI afterensureEnoughTokens(may withdraw cDAI interest). - Home
executeAffirmationisonlyValidator. Quorum marks the hash processed andblockReward.addExtraReceivermints. HomerelayTokens/ fallback burns native xDAI (address(0).transfer) only within minted−burnt and daily limits. PayablerelayTokensis the native lock, not a free mint. - Foreign
relayTokenstransferFroms the caller’s DAI into the lock. Receiver cannot be0,this, or the other-side bridge. - Omnibridge
handleBridgedTokens/AndCall/fixFailedMessageareonlyMediator:msg.senderis the AMB andmessageSender()is the other-side mediator.onTokenTransfer/relayTokenspull the caller’s tokens. claimTokensisonlyIfUpgradeabilityOwner. XDaiForeign refuses DAI / cDAI / COMP when interest is on.upgradeTo530ismsg.sender == this.
Do not file owner
claimTokens, the
DAI / cDAI / COMP
restriction,
upgradeTo530
self-call, or
payable Home
relayTokens as
theft.
Not submitted. Listed leftover is the four proxies plus the official erc-to-native and Omnibridge money paths. Remaining Gnosis: AMB / other tokenbridge trees if Immunefi lists them later; implementation bytecode is not independently Sourcify-matched on these rows.
2026-09-03: Ankr ETH pool + liquid tokens leftover (Sourcify)
Immunefi program
ankr ($500,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
Sourcify: ETH Pool
0x84db6eE82b7Cf3b47E8F19270abdE5718B936670
AdminUpgradeabilityProxy
(match) impl
GlobalPool_R46
0xEcce8778214Fd9fe37C141a00cFf19853Ef5Bc4A
(solc 0.6.11);
aETHc
0xE95A203B1a91a908F9B9CE46459d101078c2c3cb
proxy + AETH_R21
0xE672E0E0101A7F58d728751E2a5e6Da5Ff1FDa64;
aETHb
0xd01ef7c0a5d8c432fc2d1a85c66cf2327362e5c6
proxy + FETH_R20
0x518d26405Ca06435227BB3E8de567a16fA8F8125.
BSC Sourcify:
ankrBNB
0x52F24a5e03aee338Da5fd9Df68D2b6FAe1178827
TransparentUpgradeableProxy
(exact_match) impl
aBNBc_R1
0x2c00CE1A935FF8c9e78580533e2E17c36281c26E.
Extract /tmp/ankr.
BNB Pool and
BNBStakingConfig
Sourcify 404. No
mainnet interaction.
Files:
GlobalPool_R46.sol,
AETH_R21.sol,
FETH_R20.sol,
aBNBc_R1.sol,
CertificateToken.sol.
Checked for: a stranger burn of another user’s aETH / aETHb; claim of another staker’s shares; unstake that queues more ETH than the burned shares; certificate mint without the pool.
Result: no user-exploitable finding. Not submitted.
stakeAndClaimAethC/Bmint aETH shares to the pool then credit_claimableShares [msg.sender].claimAETH/claimFETHzero that mapping formsg.senderfirst.unstakeAETHburnsmsg.sendervia pool-gatedAETH.burn.unstakeFETHunlockSharesFor(pool/owner) then burns the unlocked aETH. Queue amount uses FETHsharesToBonds, which readsAETH.ratio().distributeRewardsisonlyOperator. Failed or marked claims stash ETH forclaimManually, which paysreceiverAddress.receiveis the withdrawal pool only.AETH.mint/burnare global pool or BSC bridge.updateRatiois operator and cannot increase;repairRatiois owner.aBNBcmint / burn are the liquid staking pool or the stored Binance pool. Airdrop is one-shot governance.
Do not file owner
updateClaimableShares,
operator fee on
distributeRewards,
owner refundPool,
or operator
claimTokens on
AETH as theft.
Not submitted.
Listed leftover is
the ETH pool +
aETHc / aETHb +
ankrBNB token
paths. Remaining
Ankr: BNB Pool
0x9e347Af3…E86E and
BNBStakingConfig
Sourcify 404.
2026-09-03: UTIX crowdsale leftover (Sourcify)
Immunefi program
utix ($500,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Single
Ethereum asset
0xc9d7bd1Fad7D5621DdA20335818E9575Ae07Ea03
Sourcify
exact_match
MintedTokenCappedCrowdsaleExtv1
(solc 0.7.6, TokenMarket
ICO tree). Extract
/tmp/utix. No mainnet
interaction.
Files:
MintedTokenCappedCrowdsaleExtv1.sol,
MintedTokenCappedCrowdsaleExt.sol,
CrowdsaleExt.sol,
MintableTokenExt.sol,
TokenVesting.sol,
Allocatable.sol.
Checked for: a stranger mint of sale tokens; buy that mints without paying; withdraw of raised ETH to the caller; vesting release to the wrong wallet.
Result: no user-exploitable finding. Not submitted.
buy/investrun only in Funding. Tokens come frompricingStrategy. calculatePriceandassignTokens→ mint-agentmint. ETH goes to the EOA multisig after the min goal (extcodesize == 0).allocateisonlyAllocateAgent(owner-set).finalize/ whitelist / schedule / pricing writes are owner.- Token
mintisonlyMintAgent canMint.setMintAgentis owner. - Vesting
releaseAllVestedTokensis owner and pays each_adron its schedule. Set / freeze / token pointer are allocate agents.
Do not file owner
rate / cap updates,
allocate-agent
preallocation, or
the unused
investorCount.plus
return as theft.
Not submitted. Listed UTIX leftover is this crowdsale row (exhausted).
2026-09-03: 1inch token-plugins + farming leftover (9b6de97 / b1fca09)
Immunefi program
1inch-SmartContracts
($500,000, kyc: true). Fusion
settlement /
whitelist /
PowerPod / KycNFT
and FeeTaker are
already logged. This
slice is
token-plugins and
farming. Local
clones
/tmp/1inch-token-plugins
at 9b6de97 and
/tmp/1inch-farming
at b1fca09. No
mainnet interaction.
Files:
token-plugins/contracts/ERC20Hooks.sol,
Hook.sol,
libs/ReentrancyGuard.sol,
farming/contracts/FarmingPool.sol,
FarmingHook.sol,
MultiFarmingHook.sol,
Distributor.sol,
FarmingLib.sol,
accounting/UserAccounting.sol.
Checked for: a
stranger adding a
hook that drains
another holder;
updateBalances
callable without the
token; farming
claim of another
account’s rewards;
rescueFunds that
takes staked tokens
or the farmed
reserve.
Result: no user-exploitable finding. Not submitted.
addHook/removeHook/removeAllHooksaremsg.senderonly. The hook’sTOKEN()must be this ERC-20.updateBalancesisonlyToken. Hook calls are gas- capped; a revert is swallowed unless the caller supplied too little gas (OOG bomb). Transfers arenonReentrant.FarmingPooldeposit/withdraw/claimusemsg.sender.startFarming/stopFarming/rescueFundsareonlyDistributor. Rescue of the staking token requiresbalance >= totalSupply + amount. Rescue of the rewards token requiresbalance >= farmInfo.balance + amount.FarmingHook/MultiFarmingHookclaimuseshookBalanceOf(this, msg.sender)._updateBalancesisonlyToken. Multi-farm owner can add at most five reward tokens.
Not submitted.
Remaining 1inch
SmartContracts trees
are cross-chain-swap,
solana-crosschain-protocol,
and solana-fusion.
2026-09-03: Flux Comptroller / KYC cToken / Governor Bravo leftover (Sourcify)
Immunefi program
fluxfinance
($550,000, kyc: false).
Proxy leftover already
logged Unitroller /
CErc20DelegatorKYC /
OndoPriceOracleV2 /
GovernorBravoDelegator /
Timelock. This slice is
the live implementations
behind those proxies.
Read-only eth_call on
https://ethereum-rpc.publicnode.com
(no writes). Sourcify
exact_match extract
/tmp/flux-impls.
Resolved:
Unitroller
0x95Af143a…3A51
comptrollerImplementation()
0xdc7b9059…9719
(Comptroller, solc
0.5.17, verified
2026-01-23);
fOUSG
0x1dD7950c…E018
implementation()
0x159d359b…2d0a
(CCashDelegate,
verified 2024-08-08);
fUSDC
0x465a5a63…19e5
0xb521dcf5…fbc5
(CTokenDelegate,
verified 2026-02-14);
fDAI
0xe2bA8693…530b
0x690ef7cd…7d82
(same
CTokenModified
hash as fUSDC);
fFRAX
0x1C9A2d6b…978B
0x89ca67ec…17f6
(same hash);
fUSDT
0x81994b96…27d7
0x48a56c40…e6bf
(same hash);
GovernorBravoDelegator
0x336505EC…465A
0x8886344a…c8e
(GovernorBravoDelegate,
solc 0.5.17, verified
2024-08-08).
Files:
Comptroller.sol,
CTokenModified.sol,
CTokenDelegate.sol,
CErc20.sol,
CTokenCash.sol,
CCash.sol,
CCashDelegate.sol,
GovernorBravoDelegate.sol.
Checked for: a
stranger mint that
pulls a victim’s
underlying; Comptroller
borrowAllowed that
skips the liquidity
check; seize that
accepts a spoofed
seizer token;
Governor execute
without a queued
Succeeded proposal.
Result: no user-exploitable finding. Not submitted.
- Comptroller
enterMarketsonly addsmsg.sender.mintAllowedis listed + not paused.borrowAllowedauto-enters only whenmsg.senderis the cToken, reverts on a zero oracle price, and requires no hypothetical shortfall.liquidateBorrowAllowedneeds shortfall (unless the market is deprecated) and a close-factor cap.seizeAllowedrequires both markets listed and the same Comptroller._setPriceOracle/_supportMarket/_setCollateralFactor/_become/fixBadAccrualsare admin. CTokenModified(identical source on fUSDC / fDAI / fFRAX / fUSDT)mintFreshpullstransferFromthe minter after a sanctions check. Borrow / repay require KYC. Transfer checks sanctions + allowance.seizepassesmsg.senderas the seizer cToken. KYC registry / group setters are admin.- fOUSG
CTokenCashadditionally KYCs mint / redeem / transfer / seize. Missing KYC on stablecoin mint is the listed CASH vs USDC split, not a stranger drain. - Governor Bravo
proposeneeds prior votes above threshold or a whitelist.queuerequires Succeeded.executerequires Queued, thentimelock.executeTransaction. Voting delay / period / threshold / whitelist /_initiateare admin.
Do not file
admin setKYCRegistry
or vanilla Compound
first-depositor
inflation as a
finding.
Not submitted. Listed Flux leftover is exhausted.
2026-09-03: Mantle mETH staking leftover (Sourcify)
Immunefi program
mETH ($500,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
Sourcify proxies +
impls: Staking
0xe3cBd06D7dadB3F4e6557bAb7EdD924CD1489E8f
impl
0x01a360392c74b5b8bF4973F438FF3983507a06a2
(exact_match
Staking); mETH
token impl
0x052F52748109BAE13D6319A463D64B6a2A613e52
(exact_match
METH); Unstake
Requests Manager
impl
0x5A7b3CDe8aC8d780AF4797BF1517464aC54Ca033;
Oracle
0x7a6c874db238D7FdC84516cD940E97032271af69;
OracleQuorumManager
0x54c23E0D89DA943165c969d1AbDb65f0D64174b4;
ReturnsAggregator
0xf2Bc410fAd9Fc3140c4CDED7C6E5Bd56AC292c93;
CL/EL ReturnsReceiver
impls. Extract
/tmp/meth. Mantle L2
mETH Sourcify 404.
Pauser impl Sourcify
404. No mainnet
interaction.
Files:
Staking.sol,
METH.sol,
UnstakeRequestsManager.sol,
Oracle.sol,
OracleQuorumManager.sol,
ReturnsAggregator.sol,
ReturnsReceiver.sol.
Checked for: a stranger mint of mETH; claim of another user’s unstake; first-stake donation that steals the next depositor; oracle record anyone can push.
Result: no user-exploitable finding. Not submitted.
stakemints afterethToMETH. Bootstrap usesmETH.totalSupply == 0(nottotalControlled) so a donation to a returns receiver cannot inflate the first mint. Later rate ismulDivfloor.METH.mintis the staking contract.burnis the unstake manager and burnsmsg.sender(the manager’s locked mETH).forceMint/forceBurnare roles.unstakeRequestpulls mETH frommsg.senderinto the manager.claimis staking-only and requiresrequester == request.requester, finality, and allocated fill, then burns andsendValues to the requester.allocateETH/initiateValidators/topUpare roles.receiveReturnsis the aggregator.receive()reverts.- Oracle
receiveRecordisoracleUpdateronly. QuorumreceiveRecordisSERVICE_ORACLE_REPORTER. AggregatorprocessReturnsis the oracle. ReceivertransferisWITHDRAWER_ROLE.
Do not file
manager
setExchangeAdjustmentRate,
role
forceMint,
initiator BLS
trust, or a
donation that
improves the rate
for existing
stakers.
Not submitted. Listed leftover is the L1 staking + token + unstake + oracle + returns path. Remaining mETH: L2 token Sourcify 404, Pauser impl Sourcify 404, LiquidityBuffer (not a listed row).
2026-09-03: 1inch cross-chain-swap leftover (ada243b)
Immunefi program
1inch-SmartContracts
($500,000, kyc: true). token-plugins
- farming leftover is
already logged. This
slice is
cross-chain-swap. Local clone/tmp/1inch-ccsatada243b. No mainnet interaction.
Files:
contracts/EscrowSrc.sol,
EscrowDst.sol,
BaseEscrow.sol,
Escrow.sol,
BaseEscrowFactory.sol,
MerkleStorageInvalidator.sol,
libraries/ImmutablesLib.sol.
Checked for: a
stranger withdraw
with a wrong secret
or patched
immutables; cancel
before the
cancellation
window; createDstEscrow
that underpays;
Merkle leaf reuse
on a multi-fill
order.
Result: no user-exploitable finding. Not submitted.
- Src / dst
withdrawis taker-only in the private window, thenonlyValidSecret(keccak256of the 32-byte secret) andonlyValidImmutables(CREATE2 of the immutables hash must beaddress(this)). Public withdraw / cancel require an access-token balance and still pay the taker / maker as designed. - Src cancel after
SrcCancellationreturns tokens to the maker. Dst cancel afterDstCancellationreturns tokens to the taker (they funded dst).rescueFundsis taker-only afterRESCUE_DELAY. - Factory src
deploy is LOP
postInteraction. The clone must already hold the safety deposit and maker tokens.createDstEscrowrequiresmsg.valueequal to deposit (+ amount if native) and dst cancel not after src cancel, thentransferFromthe caller. - Merkle
invalidator is
onlyLOPand storesidx + 1plus the proven leaf.
Not submitted.
Remaining 1inch
SmartContracts trees
are
solana-crosschain-protocol
and solana-fusion.
2026-09-03: eBTC Boost leftover (c9b95ac)
Immunefi program
ebtc-boost
($200,000, kyc: false).
Listed GitHub files on
ebtc-protocol/ebtc
release-0.7. Local
clone /tmp/ebtc at
c9b95ac (“Merge pull
request #796”). No
mainnet interaction.
Files:
ActivePool.sol,
BorrowerOperations.sol,
CdpManager.sol,
LiquidationLibrary.sol,
CollSurplusPool.sol,
EBTCToken.sol,
Governor.sol,
PriceFeed.sol,
SortedCdps.sol,
EbtcFeed.sol,
ChainlinkAdapter.sol,
FixedAdapter.sol.
Checked for: a
stranger openCdpFor
that mints eBTC
without the victim’s
approval; withdrawColl
from someone else’s
CDP; liquidate of a
healthy CDP in normal
mode; ActivePool
flashloan that skips
repay; surplus claim
that sends another
account’s stETH to
the caller.
Result: no user-exploitable finding. Not submitted.
- BorrowerOperations
openCdp/ adjust /closeCdprequire the borrower or a position manager they approved. CollateraltransferFromsmsg.sender. Debt mints tomsg.sender. Close burns the caller’s eBTC then sends coll + liquidator reward shares tomsg.sender. - ActivePool
coll / debt moves
are Borrower
Operations or
CdpManager.
Flashloan is
stETH only, requires
callback success,
transferFromof principal + fee, and post-balance / share / rate invariants.sweepTokenisrequiresAuthand cannot sweep collateral. - CollSurplusPool
claimSurplusCollSharesis Borrower Operations only and pays_account.increaseTotalSurplusCollSharesis ActivePool. - EBTCToken
mint/burnare Borrower Operations, CdpManager, or authority. - Liquidation needs ICR < MCR, or recovery mode after the grace period. Redemption burns the caller’s eBTC and walks the lowest ICR ≥ MCR.
- SortedCdps
insertis Borrower Operations or CdpManager. - EbtcFeed falls
back to
lastGoodPricewhen both oracles return 0. PriceFeed can returnINVALID_PRICE. ChainlinkAdapter requiresanswer > 0. Do not file last- good-price or governorrequiresAuthas a stranger drain.
Not submitted. Listed eBTC Boost GitHub leftover is exhausted.
2026-09-03: 1inch Solana CCS + Fusion leftover (58b8a42 / 0768267)
Immunefi program
1inch-SmartContracts
($500,000, kyc: true). EVM
cross-chain-swap is
already logged. This
slice is the last
listed trees:
solana-crosschain-protocol
and solana-fusion.
Local clones
/tmp/1inch-sol-ccs
at 58b8a42 and
/tmp/1inch-sol-fusion
at 0768267. No
mainnet interaction.
Files:
programs/cross-chain-escrow-src/src/{lib,utils}.rs,
programs/cross-chain-escrow-dst/src/{lib,utils}.rs,
programs/whitelist/src/lib.rs,
solana-fusion/programs/fusion-swap/src/lib.rs.
Checked for: a
stranger withdraw
with a wrong secret;
cancel that pays
tokens to the
caller; Fusion
fill that skips
paying the maker;
whitelist
register by a
non-authority.
Result: no user-exploitable finding. Not submitted.
- Src withdraw is
taker-signed in
the private
window;
keccak256(secret)must matchescrow.hashlock. Tokens go to the taker ATA. Public withdraw / cancel award the safety deposit to the payer and still pay tokens to taker / maker. Src cancel afterSrcCancellationreturns tokens to the stored maker. - Dst
createpulls from the creator and requires dst cancel not after src cancel. Withdraw is creator-signed, secret-checked, and pays the storedrecipient. - Fusion
fillrequires a whitelistResolverAccessPDA. Escrow seeds bindorder_hash(config + mints + receiver). Src tokens go to the taker; dst tokens (minus fees) go tomaker_receiver.cancelis maker-signed and returns remaining src to the maker.cancel_by_resolveris after expiry only. - Whitelist
register/deregister/set_authorityrequire the stored authority.
Not submitted. Listed 1inch SmartContracts GitHub leftover is exhausted.
2026-09-03: Aevo deposit leftover (Sourcify)
Immunefi program
Aevo ($300,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
0x4082C9647c098a6493fb499EaE63b5ce3259c574
Sourcify match
L1ChugSplashProxy
only (solc 0.8.15).
Arbitrum
0x80d40e32fad8be8da5c6a42b8af1e181984d137c
Sourcify match
Vault (solc 0.8.13)
plus
ConnectorPlug.
Extract /tmp/aevo.
No mainnet
interaction.
Files:
L1ChugSplashProxy.sol,
Vault.sol,
ConnectorPlug.sol,
Gauge.sol.
Checked for: a
stranger
receiveInbound
that unlocks vault
tokens; pending
unlock paid to the
caller; ChugSplash
setCode by anyone.
Result: no user-exploitable finding. Not submitted.
- Vault
depositToAppChaintransferFromsmsg.senderafter a lock-limit consume, thenconnector.outbound. Unconfigured connectors havemaxLimit == 0. receiveInboundrequires_unlockLimitParams [msg.sender]. maxLimit != 0(owner-set connector). Pays the payloadreceiver.unlockPendingForis permissionless but transfers toreceiver_.ConnectorPlug. inboundis Socket-only.outboundis the hub.connect/disconnectare owner.- ChugSplash
setCode/setStorage/setOwnerrun only for the owner (elsedelegatecallimplementation).
Do not file owner rate-limit writes or Socket-trusted inbound as theft.
Not submitted. Listed leftover is the Arb Vault + Socket plug and the ETH ChugSplash proxy. ETH ChugSplash implementation leftover is logged (listed Aevo leftover exhausted).
2026-09-03: Lido core submit / withdrawal leftover (2da0f48)
Immunefi program
lido ($2,000,000,
kyc: false). Listed
tree
lidofinance/core
was not previously
logged (earlier “Lido”
mentions are DeFi
Saver / Origin
integrations). Local
sparse clone
/tmp/lido-core at
2da0f48 (“Merge pull
request #1936”). No
mainnet interaction.
Files:
contracts/0.4.24/Lido.sol,
StETH.sol,
0.6.12/WstETH.sol,
0.8.9/WithdrawalQueue.sol,
WithdrawalQueueBase.sol,
WithdrawalQueueERC721.sol,
WithdrawalVault.sol,
Accounting.sol.
Checked for: a
stranger submit that
mints stETH without
msg.value;
mintShares callable
by a non-accounting
address; withdrawal
claim that pays a
request the caller
does not own;
finalize without
FINALIZE_ROLE;
oracle report applied
by a non-oracle.
Result: no user-exploitable finding. Not submitted.
submit/_submitrequire non-zeromsg.value, mint shares tomsg.sender, and increase the buffer.mintSharesis accounting.burnSharesis burner and burnsmsg.sender.mintExternalSharesis VaultHub and capped by the external-ratio limit.receiveELRewards/receiveWithdrawalsare the EL rewards vault and withdrawal vault.withdrawDepositableEtheris StakingRouter.- WithdrawalQueue
requestWithdrawalstransferFromsmsg.sender._claimrequiresrequest.owner == msg.senderafter finalization.finalizeisFINALIZE_ROLE.onOracleReportisORACLE_ROLE. - WstETH
wraptransferFroms the caller then mints share-equivalent wstETH.unwrapburns the caller then paysgetPooledEthByShares. - WithdrawalVault
withdrawWithdrawalsis Lido-only. PermissionlessrecoverERC20sends to treasury, not the caller. - Accounting
handleOracleReportisaccountingOracle.
Do not file permissionless treasury recover or the known 1–2 wei withdrawal rounding dust as a finding.
Not submitted. Remaining Lido listed GitHub: StakingRouter / CSM / dual-governance / easy-track / L2 / circuit-breaker / oracle / 0.8.25 vaults and the other listed repos.
2026-09-03: Lido StakingRouter leftover (2da0f48)
Immunefi program
lido ($2,000,000,
kyc: false). Submit /
withdrawal leftover
already logged on the
same pin. This slice
is StakingRouter +
BeaconChainDepositor.
Local sparse clone
/tmp/lido-core at
2da0f48. No mainnet
interaction.
Files:
contracts/0.8.25/sr/StakingRouter.sol,
SRLib.sol,
SRStorage.sol,
SRUtils.sol,
lib/BeaconChainDepositor.sol.
Checked for: a
stranger deposit
that pulls buffered
ETH to an attacker
key; topUp that
sends ETH off the
official deposit
contract;
receiveDepositableEther
callable by anyone;
module add that
redirects withdrawal
credentials.
Result: no user-exploitable finding. Not submitted.
receiveDepositableEtheris Lido only (_checkAppAuth).depositis DepositSecurityModule only. It asks the active module for keys, caps count by allocation andmaxDepositsPerBlock, updates last-deposit state, pulls ETH from Lido, andmakeBeaconChainDeposits32ETHto the official deposit contract with stored withdrawal credentials. Post-balance must match pre-balance.topUpis TopUpGateway only, type-0x02 modules, allocations must be gwei-aligned and ≤ limits, thenmakeBeaconChainTopUp.addStakingModule/updateStakingModule/ fee batch / max top-up areSTAKING_MODULE_MANAGE_ROLE(share updates areSTAKING_MODULE_SHARE_MANAGE_ROLE).setWithdrawalCredentialsisMANAGE_WITHDRAWAL_CREDENTIALS_ROLEand requires a non-zero address plus a valid WC type. Reward / exit reports are their report roles.
Do not file DSM / TopUpGateway privilege as a stranger drain.
Not submitted. Remaining Lido listed GitHub: CSM / dual-governance / easy-track / L2 / circuit-breaker / oracle / 0.8.25 vaults and the other listed repos.
2026-09-03: StakeWise Mainnet leftover (Sourcify)
Immunefi program
StakeWise Mainnet
($200,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
proxies + impls
Sourcify-open:
Pool
0xC874b064f465bdD6411D45734b56fac750Cda29A
exact_match
AdminUpgradeabilityProxy
impl
0x481f28C0D733614aF87897E43d0D52C451799592
Pool (solc 0.7.5);
PoolEscrow
0x2296e122c1a20Fca3CAc3371357BdAd3be0dF079
match;
PoolValidators
0x002932e11E95DC84C17ed5f94a0439645D8a97BC
impl
0xfa00515082fe90430C80DA9B299f353929653d7B;
sETH2
0xFe2e637202056d30016725477c5da089Ab0A043A
impl
0x82FE8C78CaE0013471179e76224ef89941bAaa75;
rETH2
0x20BC832ca081b91433ff6c17f85701B6e92486c5
impl
0x01d34aeE72325F1d4A748f13C2169404523eCEE0;
SWISE
0x48C3399719B582dD63eB5AADf12A40B4C3f52FA2
impl
0xA28C2d79f0c5B78CeC699DAB0303008179815396;
Oracles
0x8a887282E67ff41d36C0b7537eAB035291461AcD
impl
0xF0C1670364d4b5c4e9dc8062cDd45068D9c678d6;
VestingEscrow
0xaE678D2A911400a55e06f4A1F0C0B363F3eE2e42
match;
VestingEscrowFactory
0x7B910cc3D4B42FEFF056218bD56d7700E4ea7dD5
impl
0xbeE3Eb97Cfd94ace6B66E606B8088C57c5f78fBf;
MerkleDistributor
0xA3F21010e8b9a3930996C8849Df38f9Ca3647c20
impl
0x1d873651c38D912c8A7E1eBfB013Aa96bE5AACBC;
Roles
0xC486c10e3611565F5b38b50ad68277b11C889623
impl
0x584E5D4bD0AE1EEF838796aEe8fb805BbB82439C;
ProxyAdmin
0x3EB0175dcD67d3AB139aA03165e24AA2188A4C22
exact_match;
Gnosis Safe
0x144a98cb1CdBb23610501fE6108858D9B7D24934
match proxy.
rETH2 ctor vault
0xac0f906e433d58fa868f936e8a43230473652885
Sourcify
ERC1967Proxy
impl
0xf113BfD6423291b1dD2cA76f897bFf54456e7c88
EthGenesisVault
(solc 0.8.26).
Extract /tmp/stakewise.
No mainnet
interaction.
Files:
Pool.sol,
PoolEscrow.sol,
PoolValidators.sol,
StakedEthToken.sol,
RewardEthToken.sol,
Oracles.sol,
MerkleDistributor.sol,
VestingEscrow.sol,
VestingEscrowFactory.sol,
StakeWiseToken.sol,
Roles.sol,
EthGenesisVault.sol.
Checked for: a
stranger mint of
sETH2/rETH2; merkle
claim paid to the
caller; oracle root
with one signature;
migrate that burns
another account;
escrow withdraw by
anyone; genesis
migrate without
the rETH2 caller.
Result: no user-exploitable finding. Not submitted.
- Current Pool impl
is a post-v3 stub:
receiveFeesand permissionlesstransferToPoolEscrow(sweeps ETH to escrow, not the caller). No stake / mint /registerValidator. - PoolValidators
registerValidatoris oracles-only and merkle-checked; the current Pool no longer exposes that function (dead path). - PoolEscrow
withdrawis owner-only two-step ownership. Genesis vault_pullWithdrawalsrequires the vault to be escrow owner. - rETH2
updateTotalRewardsis the immutable vault.claimis MerkleDistributor.migrateburnsmsg.senderthenvault.migrate. Transfers blocked in the update block. - sETH2
burnis rETH2-only.toggleRewardsis admin. - Oracles
submitMerkleRootneeds>2/3unique oracle signatures plus nonce. Distributorclaimpaysaccount, not the caller. Bitmap is per root. - Vesting
claimis recipient-only.stopis admin and can pull unvested (admin trust). FactorydeployEscrowis admin; listed escrow implinitializeis 7-arg vs factory 8-arg (admin path would miss / revert). - Roles is event-only. SWISE mints 1B once to admin; no later mint.
- EthGenesisVault
migraterequiresmsg.sender == rETH2and escrow owner == vault.receivedeposits unless the sender is the escrow.
Do not file admin pause / fee / escrow withdraw, oracle or Keeper harvest trust, or the vault owning PoolEscrow after migration.
Not submitted. Listed leftover is the Sourcify-open v2 proxies + impls
- PoolEscrow +
Vesting + Safe +
the linked genesis
vault migrate hook.
Remaining listed:
DAO Module
0xb5cf5363c3e766e64b37b2fb9554bfe8d48ed1a0Sourcify 404. Remaining unlisted: FeesEscrow storage slot and V3 Keeper / osToken / other vaults.
2026-09-03: Rhino.fi deposit leftover (Sourcify)
Immunefi program
Rhino.fi /
rhinofi ($2,000,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Sourcify-open
listed proxies:
Optimism
0x0bCa65bf4b4c8803d2f0B49353ed57CAAF3d66Dc
impl
0x87627c7E586441EeF9eE3C28B66662e897513f33;
BSC
0xB80A582fa430645A043bB4f6135321ee01005fEf
impl
0x5ab2790bE0ADe18af686f38C5321Af1D8daa3192;
Arbitrum
0x10417734001162ea139e8b044dfe28dbb8b28ad0
impl
0x2cA9f060e4A50434265dC38c7f539C5bC630E368
all exact_match
DVFDepositContract
BridgeVM(solc 0.8.4, identical source). ARB / BSC / MATIC MultiSigs SourcifymatchGnosisSafeProxy→GnosisSafeL2. Extract/tmp/rhino. No mainnet interaction.
Files:
DVFDepositContract.sol,
BridgeVM.sol.
Checked for: a
stranger withdraw
that pulls escrow
tokens; withdrawVmFunds
paid to the caller;
BridgeVM.execute
without owner;
deposit that credits
without
transferFrom.
Result: no user-exploitable finding. Not submitted.
depositWithId/depositWithPermitsafeTransferFrommsg.sender. Native deposit only emitsmsg.value.commitmentIdis off-chain; an invalid id does not move tokens back.- All withdraw /
addFunds/removeFunds/swapWithData/withdrawWithDatapaths areauthorized.authorizeis owner. Program text: no assumption of authorized-account access. BridgeVMis deployed by the deposit contract (createVMContractpublic only whilevm == 0).executeisonlyOwner(the deposit contract).withdrawVmFundsis permissionless but transfers stuck VM tokens / ETH to the VM owner (escrow), not the caller.- Unused storage
depositsDisallowed/maxDepositAmount/processedWithdrawalIdsare not checked on deposit (no on-chain limit advertised).
Do not file authorized-operator withdraws or custodial-bridge centralization.
Not submitted.
Listed leftover is
the OP / BSC / ARB
DVFDepositContract
impls + listed
Gnosis safes.
Remaining listed:
zkEVM bridge /
zkSync bridge
Sourcify 404;
Polygon bridge
impl
0x717D0Bf97Ce58E14945F5e0320EE98381aeadDAf
Sourcify 404 on
chain 137.
2026-09-03: Lido lido-l2 + circuit-breaker + vesting + stonks leftover (badf17c / 6829a5a / 580f802 / a7812a4)
Immunefi program
lido ($2,000,000,
kyc: false). Listed
GitHub trees include
core, lido-l2,
lido-l2-with-steth,
circuit-breaker,
lido-vesting-escrow,
stonks,
dual-governance,
CSM, easy-track, and
others. This slice is
the four leftover
trees that were not
yet in this log.
Local clones
/tmp/lidofinance-lido-l2
at badf17c,
/tmp/lidofinance-circuit-breaker
at 6829a5a,
/tmp/lidofinance-lido-vesting-escrow
at 580f802, and
/tmp/lidofinance-stonks
at a7812a4. No
mainnet interaction.
Files:
lido-l2/contracts/{BridgingManager,BridgeableTokens}.sol,
optimism/{L1,L2}ERC20TokenBridge.sol,
optimism/CrossDomainEnabled.sol,
arbitrum/{L1,L2}ERC20TokenGateway.sol,
arbitrum/InterchainERC20TokenGateway.sol,
arbitrum/L1CrossDomainEnabled.sol,
arbitrum/libraries/{L1,L2}OutboundDataParser.sol,
token/{ERC20Bridged,ERC20Metadata}.sol,
circuit-breaker/src/{CircuitBreaker,Registry}.sol,
lido-vesting-escrow/contracts/{VestingEscrow,VestingEscrowFactory}.vy,
stonks/contracts/{Stonks,Order,AssetRecoverer}.sol.
Checked for: a
stranger finalize
that unlocks L1
tokens without a
matching L2 burn;
Arbitrum from
spoof that pulls
another user’s
allowance; L2 mint
by a non-messenger;
circuit-breaker
pause by a
non-pauser; vesting
recover_erc20 that
drains locked
tokens; Stonks
order that settles
to the caller or
skips the CoW
price check.
Result: no user-exploitable finding. Not submitted.
- Optimism L1
depositERC20is EOA-only;depositERC20Topullsmsg.sender. Withdraw finalize requires the messenger andxDomainMessageSender == l2TokenBridge, then transfers locked L1 tokens toto_. L2 withdraw burnsmsg.senderand messages L1.finalizeDepositmints only after the same messenger check. Tokens are immutable pair filters. - Arbitrum L1
outboundTransferdecodesfromfrom calldata only whenmsg.senderis the router; otherwisefromismsg.sender. Finalize inbound requires the Inbox bridge + outboxl2ToL1Sender == counterpartGateway. L2 outbound burns the decodedfrom(router-trusted ormsg.sender) and inbound mint is counterpart-only. BridgingManager. initializeis once. Enable / disable deposits and withdrawals are role-gated.ERC20Bridgedmint/burn isonlyBridge. Metadata set is empty-string once.- CircuitBreaker
registerPauseris admin-only.pauserequires the live registered pauser, is single-use (unregisters), and reentrancy- guarded.heartbeatalso requires a live registered pauser. - Vesting
implementation
cannot be
initialized.
Clones require
balanceOf >= amount.claimis recipient-only and caps at vested-unclaimed.revoke_unvested/revoke_allpay the factory owner.recover_erc20of the vesting token is limited tobalance - (locked + unclaimed)and pays the recipient. - Stonks
placeOrderis admin/manager, non-reentrant, and transfersTOKEN_FROMinto a clone. Orderinitializeis once (impl is pre-initialized). CoWisValidSignaturechecks hash, expiry, cancellation, global pause, and oracle price vs stored limit ± tolerance / improvement.recoverTokenFromafter expiry returns sell tokens to Stonks;recoverERC20cannot taketokenFrom. Receiver is baked at initialize (defaults to AGENT).
Not submitted.
Lido core submit /
withdrawal and
StakingRouter leftover
are already logged on
2da0f48. Remaining
Lido listed GitHub:
lido-l2-with-steth,
aave-delivery-infrastructure,
governance-crosschain-bridges,
mev-boost-relay-allowed-list,
community-staking-module,
easy-track,
dual-governance,
aragon-apps, and
0.8.25 vaults.
Oracle / keys-api /
validator-ejector /
council-daemon /
oz-merkle-tree /
onchain-mon are
ops or web, not
this leftover
slice.
2026-09-03: Lido lido-l2-with-steth leftover (4fec842)
Immunefi program
lido ($2,000,000,
kyc: false). core
submit / withdrawal /
StakingRouter and
lido-l2 +
circuit-breaker +
vesting + stonks are
already logged. This
slice is
lido-l2-with-steth.
Local clone
/tmp/lidofinance-lido-l2-with-steth
at 4fec842. No
mainnet interaction.
Files:
optimism/{L1LidoTokensBridge,L1ERC20ExtendedTokensBridge,L2ERC20ExtendedTokensBridge,RebasableAndNonRebasableTokens,TokenRateOracle}.sol,
token/ERC20RebasableBridged.sol,
lib/DepositDataCodec.sol.
Checked for: a
stranger finalize
that unlocks L1
stETH/wstETH without
a matching L2 burn;
rebasable mint that
skips wrapping
shares; updateRate
from a
non-messenger;
unwrap that pays
more shares than
were burned.
Result: no user-exploitable finding. Not submitted.
- L1 deposit is
EOA-only on
depositERC20;depositERC20Topullsmsg.sender. Rebasable deposits wrap to wstETH on the bridge before the L2 message. Amount in the message is always non-rebasable shares. Rate + L1 timestamp are encoded from the L1 oracle, not the caller. - L1 finalize
requires the
messenger and
xDomainMessageSender == L2 bridge. Rebasable withdrawals unwrap the locked wstETH then transfer stETH toto_. Token pairs are immutable (stETH↔stETH, wstETH↔wstETH). - L2
finalizeDepositis messenger + L1-bridge only. It updates the rate then mints wstETH (or mints to the bridge andbridgeWraps stETH). Withdraw burnsmsg.sender(unwrap + burn shares for rebasable) and blocks transfers to the L1 token contracts. TokenRateOracle. updateRateisonlyBridgeOrTokenRatePusher. Stale L1 timestamps are ignored. Same timestamp only bumps the L2 receipt time. New rates must waitMIN_TIME_BETWEENand stay inside the per-day deviation plus sane min/max. Pause / resume are role-gated.- Rebasable wrap /
unwrap is 1:1
shares of the
wrapped token.
bridgeWrap/bridgeUnwrapareonlyBridge. Userwrap/unwrapmovemsg.sender’s tokens only.
Not submitted.
Remaining Lido
listed GitHub:
aave-delivery-infrastructure,
governance-crosschain-bridges,
mev-boost-relay-allowed-list,
community-staking-module,
easy-track,
dual-governance,
aragon-apps, and
0.8.25 vaults.
2026-09-03: Lido 0.8.25 vault leftover (2da0f48)
Immunefi program
lido ($2,000,000,
kyc: false). Submit /
withdrawal and
StakingRouter leftovers
are already logged on
the same pin. L2 /
circuit-breaker /
vesting / stonks are
logged on other trees.
This slice is the
stVault money path in
lidofinance/core
contracts/0.8.25/vaults.
Local sparse clone
/tmp/lido-core at
2da0f48. No mainnet
interaction.
Files:
StakingVault.sol,
VaultHub.sol,
VaultFactory.sol,
OperatorGrid.sol,
LazyOracle.sol,
PinnedBeaconProxy.sol,
dashboard/{Dashboard,Permissions,NodeOperatorFee}.sol,
predeposit_guarantee/PredepositGuarantee.sol,
ValidatorConsolidationRequests.sol.
Checked for: a
stranger mintShares
against another vault;
withdraw of locked
collateral after a
stale or crafted
report; factory
connect of a tampered
proxy; PDG
compensation that
pays the caller;
permissionless
forceRebalance /
settleLidoFees that
sends ETH off-treasury;
unguaranteed deposit
as a stranger.
Result: no user-exploitable finding. Not submitted.
StakingVaultfund/withdraw/ pause / ossify /collectERC20/setDepositor/triggerValidatorWithdrawalsareonlyOwner. Beacon deposits /stage/unstageareonlyDepositor(PDG on factory vaults). WC is0x02 | address(this).receive()is a permissionless donation.ejectValidatorsis node-operator EIP-7002 full exit; ETH returns to the vault WC; only the fee surplus is refunded.collectERC20blocks the EIP-7528 ETH sentinel.depositFromStagedignores the pause when_additionalAmount == 0so a proved 31 ETH activation can finish after Hub pauses deposits for obligations.VaultFactorydeploys aPinnedBeaconProxy, marksdeployedByThisFactory, sets Dashboard as vault owner and PDG as depositor, then either connects (needsCONNECT_DEPOSIT) or leaves the vault disconnected. Optional roles are granted while the factory still holds admin / NOM; that is the creator’s own vault.VaultHub.connectVaultis permissionless but requires a factory-deployed vault,msg.sender == vault.owner(), Hub as pending owner, not ossified, PDG as depositor, staged ETH matching `pendingActivations- 31 ETH
, andavailableBalance= 1 ETH
. Limits come fromOperatorGrid.vaultTierInfo` (default tier until a dual- confirmed change).
- 31 ETH
mintSharesis connection owner + fresh report + share limit + lockable value (TV minus unsettled fees) +OperatorGrid.onMintedShares(jail / tier / group caps), thenLIDO.mintExternalShares.withdrawcaps at unlocked ETH minus redemption shares minus unsettled Lido fees.burnShares/transferAndBurnSharesdecrease liability and burn from Hub.fundupdatesinOutDelta.applyVaultReportis LazyOracle only.maxLiabilitySharesis not lowered when shares were minted after the refslot, which blocks the mint → apply-old- report → unlock → withdraw loop. Disconnect completes on a later report only if liability and slashing reserve are zero; otherwise it aborts.forceRebalanceis permissionless and only burns obligation shares by pulling vault ETH to Hub andrebalanceExternalEtherToInternal.settleLidoFeesis permissionless and pays treasury.socializeBadDebt/internalizeBadDebtareBAD_DEBT_MASTER_ROLE; socialize is same-operator and capacity-capped.updateConnectionis OperatorGrid only.decreaseInternalizedBadDebtis Accounting only.LazyOracle.updateReportDatais AccountingOracle only.updateVaultDatais permissionless but Merkle-proved against that root, rejects a non- newer timestamp, caps fee growth, forbids fee decrease, and quarantines TV jumps abovemaxRewardRatioBP.OperatorGridgroup / tier / jail / fee writes areREGISTRY_ROLE.changeTier/syncTier/updateVaultShareLimitneed owner + node- operator confirmations.onMintedShares/onBurnedShares/resetVaultTierare VaultHub only.PredepositGuarantee.predepositis the NO depositor: BLS- verifies the 1 ETH deposit, locks the same amount of guarantor collateral, and stages 31 ETH.proveWCAndActivate/activateValidator/proveInvalidValidatorWCare permissionless. Invalid-WC proof pays the vault from locked guarantee and unstages 31 ETH; it does not pay the caller.topUpExistingValidatorsis depositor-only and uses vault WC.- Dashboard
fund / withdraw /
mint / burn /
rebalance /
disconnect /
configuration are
role-gated
(
FUND/WITHDRAW/MINT/BURN/REBALANCE/VOLUNTARY_DISCONNECT/VAULT_CONFIGURATION).unguaranteedDepositToBeaconChainneedsALLOW_DEPOSIT_AND_PROVEplusNODE_OPERATOR_UNGUARANTEED_DEPOSIT_ROLEand is documented as frontrunnable trusted-operator flow.disburseFeeandrecoverFeeLeftoverare permissionless pulls tofeeRecipient.ValidatorConsolidationRequestsonly encodes EIP-7251 calls; it does not hold vault ETH.
Do not file
depositFromStaged
pause bypass on a
zero additional
amount (intended
activation);
unguaranteed-deposit
frontrun (documented
trust + role);
permissionless
forceRebalance /
settleLidoFees /
disburseFee /
recoverFeeLeftover
(they pay Hub /
treasury /
feeRecipient);
node-operator
ejectValidators
(ETH returns to the
vault); LazyOracle
quarantine as a
stranger under-
report (it caps
mintable value);
CONNECT_DEPOSIT
lock; or
BAD_DEBT_MASTER /
VAULT_MASTER /
VALIDATOR_EXIT /
REGISTRY_ROLE
privilege as a
stranger drain.
Not submitted.
Remaining Lido listed
GitHub:
aave-delivery-infrastructure,
governance-crosschain-bridges,
mev-boost-relay-allowed-list,
community-staking-module,
easy-track,
dual-governance,
aragon-apps.
Oracle / keys-api /
validator-ejector /
council-daemon /
oz-merkle-tree /
onchain-mon are
ops or web.
2026-09-03: Lido dual-governance Escrow leftover (ba9dfc9)
Immunefi program
lido ($2,000,000,
kyc: false). core,
lido-l2,
lido-l2-with-steth,
circuit-breaker,
vesting, and stonks
are already logged.
This slice is the
Escrow money path in
dual-governance.
Local clone
/tmp/lidofinance-dual-governance
at ba9dfc9. No
mainnet interaction.
Files:
contracts/Escrow.sol,
libraries/AssetsAccounting.sol.
Checked for: a
stranger unlock that
returns another
vetoer’s stETH;
rage-quit
withdrawETH that
pays a caller who
did not lock;
unstETH claim that
credits the caller;
pro-rata withdraw
that can be drained
by a late lock.
Result: no user-exploitable finding. Not submitted.
- Signalling
lockStETH/lockWstETHpullmsg.senderthen credit that holder’s shares.unlock*require the min lock duration and pay only the holder’s accounted shares (wstETH wrap is after unlock accounting).lockUnstETH/unlockUnstETHtransfer NFTs only afteraccountUnstETH*bindslockedBy == holder. Finalized / already-locked NFTs revert. startRageQuitandsetMinAssetsLockDurationare DualGovernance only. After rage quit, lock / unlock are blocked bycheckSignallingEscrow.withdrawETH()is holder-only. It zeros that holder’s shares and paysclaimedETH * holderShares / totals.lockedShares. Totals stay fixed so later holders cannot inflate the denominator. Dust stays in the contract.withdrawETH(ids)requires each recordClaimedandlockedBy == msg.sender, then marksWithdrawn.claimUnstETHis permissionless but ETH stays in the Escrow; accounting asserts the balance delta equals the claimable sum.
Not submitted.
Remaining
dual-governance:
DualGovernance.sol,
EmergencyProtectedTimelock,
committees,
ResealManager.
Remaining Lido
listed GitHub:
CSM / easy-track /
governance bridges.
0.8.25 vault leftover
is already logged on
2da0f48.
2026-09-03: Lido CSM bond leftover (2824e21)
Immunefi program
lido ($2,000,000,
kyc: false). Core,
L2, vesting, stonks,
and 0.8.25 vaults are
already logged. Dual-
governance Escrow is
logged on ba9dfc9.
This slice is the CSM
bond / fee / deposit
queue money path.
Local clone
/tmp/lido-csm at
2824e21. No mainnet
interaction.
Files:
src/Accounting.sol,
src/abstract/BondCore.sol,
src/FeeDistributor.sol,
src/PermissionlessGate.sol,
src/CSModule.sol,
src/abstract/BaseModule.sol
(createNodeOperator,
addValidatorKeys*,
obtainDepositData,
allocateDeposits).
Checked for: a
stranger claim of
another operator’s
bond; recover that
drains totalBondShares;
fee Merkle proof that
overpays the caller;
obtainDepositData by
a non-router; a gate
that bonds a victim
permit into the
caller’s operator.
Result: no user-exploitable finding. Not submitted.
- Public
depositETH/depositStETH/depositWstETH(noId)credit that existing operator frommsg.sender(Lido.submitortransferSharesFrom/ unwrap). Anyone can top up another operator; that is a donation. Thefromoverloads areonlyModule. claimRewards*require manager, reward address, or custom claimer, payrewardAddress, and only transfer excess over required + locked + debt. Fee pulls go throughFeeDistributor.distributeFees(Accounting-only, non-empty Merkle proof, cumulative shares must not decrease) and then optional fee-split transfers.lockBond/releaseLockedBond/compensateLockedBond/settleLockedBond/penalize/chargeFeeareonlyModule.recoverERC20blocks stETH.recoverStETHSharesis recoverer-only and subtractstotalBondShares.FeeDistributor.processOracleReportis oracle-only, capsdistributed+rebateby contract shares, and pays rebate torebateRecipient. stETH recover is blocked.PermissionlessGatecreates an operator formsg.senderthen adds keys with that sender’s ETH / stETH / wstETH.CSModule._checkCanAddKeysallows a gate only whenOperatorTrackercreator ==msg.sender.obtainDepositDataandallocateDepositsare StakingRouter only. Deposit data requires up-to-date deposit info. Unbonded keys on a negative rebase are documented and expected to be exited by VEBO.
Do not file a permissionless bond top-up of another operator (donation); recoverer privilege; CREATE-role as a stranger drain; or the documented unbonded-key rebase trade-off.
Not submitted. Remaining CSM: Vetted / Curated gates and modules, Verifier, Ejector, ExitPenalties, FeeOracle / HashConsensus. Remaining Lido listed GitHub: easy-track / governance bridges / aragon-apps / dual-governance timelock + committees.
2026-09-03: Lido dual-governance submit / timelock leftover (ba9dfc9)
Immunefi program
lido ($2,000,000,
kyc: false). Escrow
leftover is already
logged on the same
pin. This slice is
submit / schedule /
execute. Same clone
/tmp/lidofinance-dual-governance
at ba9dfc9. No
mainnet interaction.
Files:
DualGovernance.sol,
EmergencyProtectedTimelock.sol,
Executor.sol,
libraries/{ExecutableProposals,Proposers,ExternalCalls}.sol.
Checked for: a
stranger
submitProposal
that binds an
attacker executor;
execute that runs
calls before the
delays; cancel that
does not mark
later ids; emergency
execute by a
non-committee.
Result: no user-exploitable finding. Not submitted.
submitProposalrequires a registered proposer (getProposerreverts otherwise) and a state that allows submit. The executor is the proposer’s stored executor, not caller- chosen.registerProposer/ unregister / set executor are admin-executor only.scheduleProposalis permissionless aftercanScheduleProposaland the after- submit delay.cancelAllPendingProposalsis the stored canceller and only in veto signalling / deactivation.- Timelock
submit/schedule/cancelAllare governance-only.executeis permissionless after after- schedule delay andMIN_EXECUTION_DELAY, and only if emergency mode is off. Status is set toExecutedbefore the calls. Calls run through the proposal’s executor (onlyOwner).cancelAllraiseslastCancelledProposalIdtoproposalsCount. - Emergency
activate is the
activation
committee.
emergencyExecuteis the execution committee and skips delays.emergencyResetis that committee and points governance atemergencyGovernancethen cancels pending. Committee and delay setters are admin executor.
Not submitted.
Remaining
dual-governance:
committees,
ResealManager,
Tiebreaker.
Remaining Lido
listed GitHub:
easy-track /
governance bridges /
remaining CSM gates.
CSM bond leftover is
already logged on
2824e21.
2026-09-03: Lido dual-governance committees leftover (ba9dfc9)
Immunefi program
lido ($2,000,000,
kyc: false). Escrow
and submit / timelock
leftovers are already
logged on this pin.
This slice is
HashConsensus,
TiebreakerCore, and
ResealManager. Same
clone
/tmp/lidofinance-dual-governance
at ba9dfc9. No
mainnet interaction.
Files:
committees/{HashConsensus,TiebreakerCoreCommittee}.sol,
ResealManager.sol.
Checked for: a stranger vote that schedules a hash; execute before the committee timelock; reseal / resume by a non-governance caller; sealable resume nonce reuse.
Result: no user-exploitable finding. Not submitted.
HashConsensus. _voteis internal. TiebreakerscheduleProposal/sealableResumerequire a committee member. Quorum schedules the hash and snapshots support. Members add/remove and quorum / timelock setters are owner._markUsedrequires the hash scheduled, unused, and the committee timelock elapsed.executeScheduleProposalthen calls Dual GovernancetiebreakerScheduleProposal.executeSealableResumeuses the current nonce in the key, marks used, then increments the nonce. A replay needs a new quorum on the next nonce.ResealManager. reseal/resumerequiremsg.sender == timelock. getGovernance(). Reseal only extends a pause that is still active and not already infinite.
Not submitted. Listed dual-governance GitHub leftover is exhausted aside from TiebreakerSubCommittee / DualGovernance tiebreaker wrappers. Remaining Lido: easy-track / governance bridges / remaining CSM gates.
2026-09-03: Lido CSM gates leftover (2824e21)
Immunefi program
lido ($2,000,000,
kyc: false). CSM
bond leftover is
already logged on
this pin. Dual-
governance leftovers
are logged on
ba9dfc9. This slice
is Vetted / Curated
gates, Verifier,
Ejector, ExitPenalties,
and FeeOracle. Same
clone /tmp/lido-csm
at 2824e21. No
mainnet interaction.
Files:
src/VettedGate.sol,
src/CuratedGate.sol,
src/abstract/MerkleGate.sol,
src/CuratedModule.sol,
src/Verifier.sol,
src/Ejector.sol,
src/ExitPenalties.sol,
src/FeeOracle.sol.
Checked for: a
stranger Merkle
consume that claims
another address’s
curve; claimBondCurve
for a non-owner;
Verifier report that
marks a live key
withdrawn without a
beacon proof;
ejectBadPerformer
by a non-strikes
caller; Curated
obtainDepositData
by a non-router.
Result: no user-exploitable finding. Not submitted.
MerkleGate._consumeverifieshashLeaf(msg.sender)and marks that address consumed. Tree root / CID writes areSET_TREE_ROLE.VettedGatecreate + add keys consume the caller’s leaf, create the operator formsg.sender, set the vetted curve, then deposit the caller’s ETH / stETH / wstETH.claimBondCurveis owner-only plus a fresh consume.CuratedGate.createNodeOperatoris the same Merkle consume, thenMODULE.createNodeOperatorformsg.sender. Optional custom curve needsSET_BOND_CURVE_ROLEon the gate.CuratedModule.obtainDepositData/allocateDepositsare StakingRouter plus up-to-date deposit info. Weight notify is MetaRegistry only.Verifierproofs bind EIP-4788 parent roots, SSZ gindices, module pubkeys, and withdrawal credentials ==WITHDRAWAL_ADDRESS. Slashed proofs requirevalidator.slashed. Withdrawal proofs reject slashed / not-withdrawable / partial amounts.Ejector.voluntaryEjectis owner-only, deposited + non-withdrawn keys, and forwardsmsg.valueto the triggerable- withdrawals gateway.ejectBadPerformeris STRIKES only.ExitPenaltiesonly records marked fees. Delay / triggered writes are module only; strikes writes are STRIKES only. It does not move bond.FeeOracle.submitReportDatais a consensus member orSUBMIT_DATA_ROLE, checks the consensus hash, then callsFeeDistributor.processOracleReportand strikes. The oracle holds no user assets.
Do not file
SET_TREE_ROLE /
SET_BOND_CURVE_ROLE
/ STRIKES /
StakingRouter
privilege as a
stranger drain; or
permissionless
Verifier calls that
only apply a valid
beacon proof.
Not submitted. Remaining CSM: MerkleGateFactory, ValidatorStrikes, HashConsensus, MetaRegistry. Remaining Lido listed GitHub: easy-track / governance bridges / aragon-apps.
2026-09-03: USDN leftover (Sourcify)
Immunefi program
USDN ($50,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
Sourcify-open:
USDN
0xde17a000ba631c5d7c2bd9fb692efea52d90dee2
exact_match Usdn
(solc 0.8.26);
WUSDN
0x99999999999999cc837c997b882957dafdcb1af9
exact_match Wusdn;
Protocol proxy
0x656cb8c6d154aad29d8771384089be5b5141f01a
impl
0x271df5517a4DaacB7caB988Aa64D23dEbda4c498
UsdnProtocolImpl;
LiquidationRewardsManager
0x9514D3496F46572e8461da381B200812D5Db202C;
WstEthOracleMiddleware
0xC1459fcFe23d5db9Ddb04935ab7a426Bd398EAb0;
LongFarming
0xF9D36078A248AF249AA57ae1D5D0c1033d6Bbe27;
Router
0x49f66b1616865b2a59caecb8352bbf2ac80983e1
match
UniversalRouter;
Dip Accumulator
0xaebcc85a5594e687f6b302405e6e92d616826e03
exact_match
Rebalancer;
sUSDN
0xf67e2dc041b8a3c39d066037d29f500757b1e886
VaultProxy impl
0x891dee0483eBAA922E274ddD2eBBaA2D33468A38
VaultLib.
Extract /tmp/usdn.
No mainnet
interaction.
Files:
Usdn.sol,
Wusdn.sol,
UsdnProtocolImpl.sol,
UsdnProtocolVaultLibrary.sol,
UsdnProtocolActionsLongLibrary.sol,
UsdnLongFarming.sol,
LiquidationRewardsManager.sol,
WstEthOracleMiddleware.sol,
UniversalRouter.sol,
Rebalancer.sol.
Checked for: a stranger mint of USDN; rebase that shrinks balances; wrap that pulls another account; vault validate that mints to the caller; close that pays the caller; farming harvest that pays the notifier on a live position.
Result: no user-exploitable finding. Not submitted.
- USDN
mint/mintSharesareMINTER_ROLE.rebaseisREBASER_ROLEand only lowers the divisor (balances grow).burn/burnSharesburnmsg.sender(or allowance). - WUSDN wrap
transferSharesFrommsg.sender. Unwrap burns caller WUSDN thentransferSharestoto. - Protocol deposit
safeTransferFrommsg.sender(asset + SDEX burn). ValidatemintSharesto pendingto. Withdrawal pulls shares from the initiator, burns them on validate, pays pendingtocapped by_balanceVault. - Open long
transferFrominitiator. Close requiresmsg.sender == pos.useror EIP-712 owner sig. Payout islong.to. - Farming
ownershipCallbackis protocol-only. Liveharvestpaysowner. Slash (tick version change) splits notifier BPS.withdrawis owner-only then transfers the position back. - Rebalancer
deposit
transferFromsender; validate / reset / withdraw are the pendingmsg.sender.updatePositionis protocol. - Oracle applies
stEthPerTokenon ETH Pyth / Chainlink. Router is Uniswap-style dispatcher + USDN initiate/validate cmds (lockedBy/ Permit2).
Do not file minter / rebaser roles, oracle-feed trust, or Enzyme VaultLib as a stranger mint.
Not submitted.
Listed leftover is
the Sourcify-open
token / wrap /
protocol two-step /
farming / rewards
view / oracle /
router / rebalancer
deposit.
Remaining listed:
sUSDN Enzyme
VaultLib
internals.
2026-09-03: Lido easy-track leftover (3183d1f)
Immunefi program
lido ($2,000,000,
kyc: false). Core,
L2, vaults, CSM, and
dual-governance
leftovers are already
logged. This slice is
the Easy Track motion
and payout path.
Local clone
/tmp/lido-easy-track
at 3183d1f. No
mainnet interaction.
Files:
contracts/EasyTrack.sol,
EVMScriptExecutor.sol,
EVMScriptFactoriesRegistry.sol,
TrustedCaller.sol,
payouts/multi-token/TopUpAllowedRecipients.sol,
EVMScriptFactories/TopUpRewardPrograms.sol.
Checked for: a
stranger createMotion
that binds an
attacker payout
script; enactMotion
with swapped calldata
that pays the caller;
executeEVMScript by
a non-EasyTrack
caller; top-up to an
unlisted recipient.
Result: no user-exploitable finding. Not submitted.
createMotionrequires a registered factory. The stored hash iskeccak256offactory.createEVMScript(msg.sender, calldata). Factory add/remove is admin-only. Resulting scripts must match the factory’s stored permissions.enactMotionis permissionless afterduration, deletes the motion first, then recreates the script with the original creator and calldata and requires the same hash. The executor is EasyTrack-only anddelegatecalls AragonCallsScript.objectToMotionweightsgovernanceToken.balanceOfAtat the snapshot and rejects the motion at the stored threshold.cancelMotionis creator-only.TopUpAllowedRecipients/TopUpRewardProgramsareonlyTrustedCaller(_creator). Recipients must be on the allowed / reward-program registry, tokens must be allowed, and the sum must stay under the spendable balance. Scripts call FinancenewImmediatePayment.
Do not file a trusted-caller payout motion (designed operator); admin factory registration; or permissionless enact after the wait (intended).
Not submitted. Remaining easy-track: NO management factories, MEV relay factories, vault-hub / OperatorGrid factories, CSM settle / vetted-tree factories. Remaining Lido listed GitHub: governance bridges / aragon-apps.
2026-09-03: Lido governance-crosschain-bridges leftover (659e236)
Immunefi program
lido ($2,000,000,
kyc: false). Core,
L2 token bridges,
easy-track, CSM, and
dual-governance
leftovers are already
logged. This slice is
governance-crosschain-bridges.
Local clone
/tmp/lidofinance-gov-bridges
at 659e236. No
mainnet interaction.
Files:
bridges/{BridgeExecutorBase,L2BridgeExecutor,OptimismBridgeExecutor,ArbitrumBridgeExecutor,PolygonBridgeExecutor}.sol.
Checked for: a
stranger queue
that binds attacker
targets; execute
before the delay;
Polygon
processMessageFromRoot
from a non-FxChild.
Result: no user-exploitable finding. Not submitted.
- L2
queueisonlyEthereumGovernanceExecutor. Optimism requires the L2 messenger andxDomainMessageSender == L1 executor. Arbitrum requires the L1-to-L2 alias of that executor. PolygonprocessMessageFromRootis FxChild-only androotMessageSender == fxRootSender. executeis permissionless afterexecutionTimeand only whileQueued. The set is markedexecutedbefore the calls.cancelis guardian-only. Delay / guardian updates areonlyThis(self-queued).executeDelegateCallisonlyThis.- Updating the L1
executor address
is
onlyThis.
Not submitted. Remaining Lido listed GitHub: aragon-apps / aave-delivery-infrastructure / mev-boost-relay-allowed-list.
2026-09-03: USDN sUSDN VaultLib leftover (Sourcify)
Immunefi program
USDN ($50,000,
kyc: false). Token /
wrap / protocol /
farming / rebalancer
leftover is already
logged. This slice is
the listed sUSDN
proxy
0xf67e2dc041b8a3c39d066037d29f500757b1e886
(VaultProxy) impl
0x891dee0483eBAA922E274ddD2eBBaA2D33468A38
exact_match Enzyme
VaultLib (solc
0.6.12). Extract
/tmp/usdn/vaultlib.
No mainnet
interaction.
Files:
VaultLib.sol,
VaultLibBaseCore.sol,
VaultLibBase1.sol,
VaultLibBase2.sol,
SharesTokenBase.sol,
ProxiableVaultLib.sol.
Checked for: a
stranger mintShares
of sUSDN; withdrawAssetTo
that pays the caller;
callOnContract /
external-position
dispatch without the
accessor; init /
setAccessor /
setVaultLib by a
non-creator;
transfer that skips
the Comptroller hook.
Result: no user-exploitable finding. Not submitted.
mintShares/burnShares/transferShares/withdrawAssetTo/callOnContract/receiveValidatedVaultAction/ protocol-fee mint and MLN buyback areonlyAccessor(ComptrollerProxy).notSharesblocks withdrawing the vault’s own shares token.initruns once (creator == 0).setAccessorandsetVaultLibare creator-only (Dispatcher).setVaultLibrequires a matchingproxiableUUID.- ERC20
transfer/transferFromcall the accessor pre-transfer hook (or the freely- transferable variant). OwnersetFreelyTransferableSharesis one-way. - Owner can add
asset managers,
nominate a new
owner, and set a
migrator. Those
are privilege, not
a stranger drain.
claimOwnershipis the nominated owner only.
Do not file
accessor-trusted
mint / withdraw /
callOnContract as
a stranger drain, or
Enzyme owner /
migrator privilege.
Not submitted. Listed USDN leftover is exhausted. The Comptroller buy / redeem share-price path is not a listed USDN asset.
2026-09-03: Lido aragon-apps leftover (e44f928)
Immunefi program
lido ($2,000,000,
kyc: false). Core,
L2, easy-track, CSM,
dual-governance, and
governance-crosschain-bridges
are already logged.
This slice is
aragon-apps. Local
clone
/tmp/lidofinance-aragon-apps
at e44f928. No
mainnet interaction.
Files:
apps/vault/contracts/Vault.sol,
apps/finance/contracts/Finance.sol,
apps/agent/contracts/Agent.sol,
apps/token-manager/contracts/TokenManager.sol.
Checked for: a
stranger Vault
transfer; Finance
newImmediatePayment
to the caller;
Agent execute
without
EXECUTE_ROLE;
TokenManager mint
without MINT_ROLE.
Result: no user-exploitable finding. Not submitted.
- Vault
depositis permissionless and pullsmsg.sender.transferisauthP(TRANSFER_ROLE, arr(token, to, value)). - Finance
newImmediatePayment/newScheduledPaymentareCREATE_PAYMENTS_ROLE.executePaymentisEXECUTE_PAYMENTS_ROLE.receiverExecutePaymentis the stored receiver only and pays that receiver. - Agent
execute/safeExecuteareEXECUTE_ROLE/SAFE_EXECUTE_ROLE. Safe execute reverts if a protected token balance drops or the protected list changes. - TokenManager
mint/issue/assign/burnare their respective roles.
Not submitted. Remaining Lido listed GitHub: aave-delivery-infrastructure / mev-boost-relay-allowed-list. Remaining aragon-apps: Voting / DisputableVoting / Agreement.
2026-09-03: IPOR leftover (Sourcify)
Immunefi program
IPOR ($20,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
Sourcify-open:
ipUSDT
0x9Bd2177027edEE300DC9F1fb88F24DB6e5e1edC6
match IpTokenUsdt;
ipUSDC
0x7c0e72f431FD69560D951e4C04A4de3657621a88
match IpTokenUsdt;
ipweETH
0xaC5B04988BC71bEE96f8D93040777Db3ef166125
match IpToken;
ipstETH
0xc40431b6C510AeB45Fbb5e21E40D49F12b0c1F0c
match IpToken;
Router proxy
0x16d104009964e694761C0bf09d7Be49B7E3C26fd
impl
0xCC735cAf5354415308dBD826e9734A70b69461d6
match
IporProtocolRouterEthereum;
AmmStorage USDC/USDT
impls AmmStorage;
AmmTreasury USDC/USDT
impls AmmTreasury;
AmmTreasury weETH impl
AmmTreasuryBaseV2;
AmmStorage weETH
AmmStorageBaseV1.
Extract /tmp/ipor.
No mainnet
interaction.
Files:
IpToken.sol,
IpTokenUsdt.sol,
IporProtocolRouterEthereum.sol,
IporProtocolRouterAbstract.sol,
AccessControl.sol,
AmmTreasury.sol,
AmmTreasuryBaseV2.sol,
AmmStorage.sol,
AmmStorageBaseV1.sol.
Checked for: a
stranger mint of
ipTokens; treasury
withdraw to the
caller; storage
liquidity write
without the router;
router fallback that
delegatecalls an
unknown selector;
batch ETH refund
that steals another
user’s msg.value.
Result: no user-exploitable finding. Not submitted.
- ipToken
mint/burnareonlyJoseph(USDT / USDC) oronlyTokenManager(weETH / stETH). Manager / Joseph setters are owner. - AmmTreasury AM
deposit / withdraw
are
onlyRouterand payaddress(this). OwnergrantMaxAllowanceForSpenderis privilege. - AmmStorage
liquidity / swap /
treasury writes are
onlyRouter(AM vault updatesonlyAmmTreasury). - Router unknown
selectors revert.
Open / provide /
redeem / close map
to immutable or
stored services.
Governance writes
and emergency
close are
_onlyOwner.transferToTreasury/ Charlie are public and go to the governance service (pays the configured recipient, notmsg.sender). batchExecutorisnonReentrant. Leftover ETH is returned to the current caller after a mutating dispatch.
Do not file Joseph / token-manager mint, owner allowance / upgrade, or permissionless treasury sweep to the configured recipient.
Not submitted. Listed leftover is the Sourcify-open ipToken / router / storage / treasury path. Remaining listed: AmmTreasury ETH impl Sourcify 404. Pool / open / close service implementations are not listed assets.
2026-09-03: Lido aave-delivery-infrastructure leftover (27e7d4e)
Immunefi program
lido ($2,000,000,
kyc: false). Core,
L2, easy-track, CSM,
dual-governance,
governance-crosschain-bridges,
and aragon-apps
leftovers are already
logged. This slice is
aave-delivery-infrastructure.
Local clone
/tmp/lido-adi at
27e7d4e. No
mainnet interaction.
Files:
src/Lido/contracts/{CrossChainExecutor,BridgeExecutorBase}.sol,
src/contracts/{CrossChainReceiver,CrossChainForwarder,BaseCrossChainController,CrossChainController,CrossChainControllerWithEmergencyMode}.sol,
src/contracts/adapters/BaseAdapter.sol,
src/contracts/adapters/optimism/OpAdapter.sol,
src/contracts/adapters/arbitrum/ArbAdapter.sol,
src/contracts/adapters/sameChain/SameChainAdapter.sol,
src/contracts/emergency/{EmergencyConsumer,EmergencyRegistry}.sol,
src/contracts/libs/EncodingUtils.sol.
Checked for: a
stranger
receiveCrossChainMessage
that queues attacker
targets; CCC
forwardMessage
without an approved
sender; an adapter
that registers a
payload without a
trusted remote; SameChain
shortcut that
impersonates the
Ethereum Agent.
Result: no user-exploitable finding. Not submitted.
- Lido
CrossChainExecutor.receiveCrossChainMessageisonlyCrossChainControllerand requiresoriginSender == GOVERNANCE_EXECUTORandoriginChainId == GOVERNANCE_CHAIN_IDbefore_queue.executeis permissionless after the delay and only whileQueued.cancelis guardian-only. Delay / guardian updates andexecuteDelegateCallareonlyThis.receiveFundsis a donation. - CCC
receiveCrossChainMessageisonlyApprovedBridges(originChainId). Envelope origin / dest chain must match. Delivery waits forrequiredConfirmationdistinct adapters.deliverEnvelopeis permissionless only afterConfirmed(failed first delivery). Confirmations / adapters / validity timestamps are owner-only. forwardMessageisonlyApprovedSendersand stampsorigin = msg.sender. Retry envelope / transaction is owner or guardian. AdapterforwardMessageisdelegatecalled from the CCC.- OpAdapter
ovmReceiveis messenger-only andxDomainMessageSender == trusted remote. ArbAdapterarbReceiverequiresundoL1ToL2Alias(msg.sender) == trusted remote.BaseAdapter._registerReceivedMessageforbids delegatecall. - SameChainAdapter
calls the
destination
directly. A
stranger call
hits
InvalidCalleron the executor (msg.sender is not the CCC). The intended path is CCCdelegatecallso the executor still sees the CCC and the stamped Agent origin. - Emergency
solveEmergencyis guardian + Chainlink emergency oracle (answer > emergencyCount).EmergencyRegistry.setEmergencyis owner-only.
Do not file
permissionless
execute after
the delay,
guardian cancel,
owner / guardian
retry or
invalidation,
approved-sender
forward, or
oracle /
guardian
emergency
reconfig.
Not submitted. Remaining Lido listed GitHub: aave-delivery adapters leftover is now logged. mev-boost-relay-allowed-list is logged.
2026-09-03: Lido mev-boost-relay leftover (47211c6)
Immunefi program
lido ($2,000,000,
kyc: false). Core,
L2, easy-track, CSM,
dual-governance,
governance-crosschain-bridges,
aragon-apps, and
aave-delivery are
already logged. This
slice is
mev-boost-relay-allowed-list.
Local clone
/tmp/lidofinance-mev-boost
at 47211c6. No
mainnet interaction.
File:
contracts/MEVBoostRelayAllowedList.vy.
Checked for: a
stranger
add_relay /
remove_relay;
recover_erc20 to
the caller; ETH
receive that locks
user funds.
Result: no user-exploitable finding. Not submitted.
add_relayandremove_relayare owner or manager. URI must be non-empty. Duplicate URI reverts. Max 40 relays.change_owner,set_manager,dismiss_manager, andrecover_erc20are owner-only. Recovery transfers a listed ERC-20 from this contract to a non-zero recipient.__default__reverts, so the contract cannot receive ETH.- The list is off-chain config. There is no on-chain user deposit or withdrawal.
Not submitted. Listed Lido GitHub repos in this pass are opened. Remaining aave-delivery adapters leftover is logged. Remaining in already-opened trees: aragon-apps Voting / DisputableVoting / Agreement; dual-governance TiebreakerSubCommittee / wrappers; CSM MerkleGateFactory / ValidatorStrikes / HashConsensus / MetaRegistry; easy-track NO / MEV-relay / vault-hub / OperatorGrid / CSM settle factories.
2026-09-03: Lido aave-delivery adapters leftover (27e7d4e)
Immunefi program
lido ($2,000,000,
kyc: false). Core
CCC / executor /
Op / Arb / SameChain
are already logged.
This slice is the
remaining
aave-delivery-infrastructure
adapters. Local
clone
/tmp/lidofinance-aave-delivery
at 27e7d4e. No
mainnet interaction.
Files:
src/contracts/adapters/ccip/CCIPAdapter.sol,
src/contracts/adapters/layerZero/LayerZeroAdapter.sol,
src/contracts/adapters/wormhole/WormholeAdapter.sol,
src/contracts/adapters/polygon/PolygonAdapterBase.sol,
src/contracts/adapters/hyperLane/HyperLaneAdapter.sol,
src/contracts/adapters/zkEVM/ZkEVMAdapter.sol,
src/contracts/adapters/scroll/ScrollAdapter.sol,
src/contracts/adapters/metis/MetisAdapter.sol,
src/contracts/adapters/gnosisChain/GnosisChainAdapter.sol,
src/contracts/adapters/cBase/CBaseAdapter.sol,
src/contracts/adapters/BaseAdapter.sol.
Checked for: a stranger receive that registers a payload without the official messenger or a trusted remote. Result: no user-exploitable finding. Not submitted.
- Every receive
path is the
official
messenger /
router /
mailbox /
relayer /
tunnel /
bridge only,
then requires
_trustedRemotes[origin] == src && src != 0before_registerReceivedMessage. - CCIP
ccipReceiveisonlyRouter. LZlzReceiveisonlyLZEndpointandallowInitializePath. WormholereceiveWormholeMessagesisonlyRelayer. HyperLanehandleisonlyMailbox. zkEVMonMessageReceivedisonlyZkEVMBridge. PolygonprocessMessageisonlyFxTunnel. GnosisreceiveMessagerequiresmsg.sender == BRIDGEand usesmessageSender()/messageSourceChainId(). - Scroll / Metis
/ CBase inherit
OpAdapter
ovmReceive(onlyOVM+xDomainMessageSender == trusted remote). They only override destination chain andforwardMessage. _registerReceivedMessageforbids delegatecall via_selfAddress.
Not submitted. Listed aave-delivery adapter leftover is exhausted. Remaining in already-opened Lido trees: aragon-apps Voting / DisputableVoting / Agreement; dual-governance TiebreakerSubCommittee / wrappers; CSM MerkleGateFactory / ValidatorStrikes / HashConsensus / MetaRegistry; easy-track NO / MEV-relay / vault-hub / OperatorGrid / CSM settle factories.
2026-09-03: Vesper leftover (Sourcify)
Immunefi program
Vesper ($50,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Ethereum
Sourcify-open vault
proxies share
VPool
0x3CEDDEF5cbe54674fCBE1b4368a68b8D6a20Fc46
(vaFrax / vaDAI /
vaUSDC / vaWBTC /
vaLINK) or
0xd948ba1B50C474199DB204Ef128BA413c49Fd9b8
(vastETH / varETH)
or
0x91f92F75E547Db066c39DEa4d4a8B45f4B8EDE4a
(vacbETH). vaETH
impl
0xf296B1113CC49Ae4c6890E7B5dD3bed780407487
exact_match VETH.
Optimism listed
vaults are the same
VPool / VETH
(solc 0.8.9). Extract
/tmp/vesper. No
mainnet interaction.
Files:
VPool.sol,
VETH.sol,
PoolERC20.sol,
PoolStorage.sol,
Governable.sol,
Pausable.sol.
Checked for: a
stranger mint of
vault shares;
withdraw that pays
the caller without
burning; reportEarning
that transfers
collateral to a
non-strategy;
sweepERC20 of the
pool token; VETH
unwrap that sends
ETH to a third
party.
Result: no user-exploitable finding. Not submitted.
deposit/depositWithPermittransferFrommsg.senderthen mint shares fromcalculateMintage.withdrawburns_msgSenderthen transfers collateral (or ETH on VETHwithdrawETH) to that sender.reportEarning/reportLosstakemsg.senderas the strategy and forward topoolAccountant. Token moves only between the pool and that caller.sweepERC20isonlyKeeperand blocks the collateral token. Governor / keeper setters are privilege.- Empty-pool
pricePerShareis10**decimals.minDepositLimitdefaults to 1.
Do not file
first-depositor
share inflation on
an empty vault,
keeper / governor
privilege, or
reportEarning as a
stranger drain
without a listed
accountant that
accepts an
unregistered
strategy.
Not submitted.
Listed leftover is
the Sourcify-open
Ethereum + Optimism
VPool / VETH
vaults.
Remaining listed:
Base vaults Sourcify
404. PoolAccountant
and strategies are
not listed assets.
2026-09-03: Lido easy-track leftover factories leftover (3183d1f)
Immunefi program
lido ($2,000,000,
kyc: false). Easy
Track motion /
payout leftover is
already logged on
the same pin. This
slice is the leftover
NO / MEV-relay /
vault-hub /
OperatorGrid / CSM
settle factories.
Local clone
/tmp/lido-easy-track
at 3183d1f. No
mainnet interaction.
Files:
contracts/EVMScriptFactories/{Add,Activate,Deactivate}NodeOperators.sol,
IncreaseNodeOperatorStakingLimit.sol,
IncreaseVettedValidatorsLimit.sol,
SetNodeOperator{Names,RewardAddresses}.sol,
ChangeNodeOperatorManagers.sol,
SetVettedValidatorsLimits.sol,
UpdateTargetValidatorLimits.sol,
{Add,Edit,Remove}MEVBoostRelays.sol,
CSMSettleELStealingPenalty.sol,
CSMSetVettedGateTree.sol,
{Curated,SDVT}SubmitExitRequestHashes.sol,
contracts/EVMScriptFactories/vaultFactories/{VaultsAdapter,ForceValidatorExitsInVaultHub,SocializeBadDebtInVaultHub,SetLiabilitySharesTargetInVaultHub,RegisterGroupsInOperatorGrid,RegisterTiersInOperatorGrid,AlterTiersInOperatorGrid,UpdateVaultsFeesInOperatorGrid,UpdateGroupsShareLimitInOperatorGrid,SetJailStatusInOperatorGrid}.sol.
Checked for: a
stranger factory
that builds a
payout or staking-
limit script for
an attacker NO;
VaultsAdapter
withdrawETH /
forceValidatorExit
without the
executor.
Result: no user-exploitable finding. Not submitted.
- Trusted-caller
factories
(
Add/Activate/DeactivateNodeOperators, names / reward / managers, MEV relays, CSM settle / vetted tree, SDVT exit hashes, vault-hub / OperatorGrid) requireonlyTrustedCaller(_creator). Easy Track storeskeccak256(factory.createEVMScript(creator, calldata))andenactMotionrecreates with that same pair. IncreaseNodeOperatorStakingLimitis not a trusted caller. Creator must be the NOrewardAddress. Limit can only rise and cannot exceedtotalSigningKeys.IncreaseVettedValidatorsLimitallows the reward address or aMANAGE_SIGNING_KEYSmanager for that operator id. Same limit bounds.CuratedSubmitExitRequestHashesrequires the first request’s NO reward address == creator and validates the rest viaSubmitExitRequestHashesUtils. Script only callssubmitExitRequestsHash.VaultsAdaptermutators areevmScriptExecutoronly.withdrawETHandsetValidatorExitFeeLimitare trusted caller.receive()is a donation for EIP-7002 fees. Bad-debt socialize requires both vaults share a node operator.
Do not file trusted-caller privilege, a NO raising its own vetted limit up to deposited keys, permissionless enact after the wait, or executor-only VaultsAdapter calls.
Not submitted. Remaining in already-opened Lido trees: aragon-apps Voting / DisputableVoting / Agreement; dual-governance TiebreakerSubCommittee / wrappers; CSM MerkleGateFactory / ValidatorStrikes / HashConsensus / MetaRegistry. Listed easy-track leftover factories are exhausted.
2026-09-03: Lido aragon-apps Voting leftover (e44f928)
Immunefi program
lido ($2,000,000,
kyc: false). Vault /
Finance / Agent /
TokenManager leftover
is already logged on
the same pin. This
slice is Voting and
DisputableVoting.
Local clone
/tmp/lido-aragon at
e44f928. No mainnet
interaction.
Files:
apps/voting/contracts/Voting.sol,
apps/voting-disputable/contracts/DisputableVoting.sol.
Checked for: a
stranger newVote
that binds an
attacker script;
executeVote before
the vote closes or
with a swapped
script; a delegate
that votes without
assignment.
Result: no
user-exploitable
finding. Not
submitted.
- Voting
newVote/forwardareCREATE_VOTES_ROLE.voteusesbalanceOfAtatsnapshotBlock = block.number - 1.executeVoteis permissionless after the vote is Closed, support and quorum pass (>ofPCT_BASE), and the stored script runs viarunScript. - Support / quorum /
vote-time changes
are their roles.
unsafelyChangeVoteTimeis documented to affect open votes. assignDelegateis self-only.attemptVoteForMultipleskips voters who already voted directly and documents front-run undelegation. TokenbalanceOfAtreentrancy is an explicit LDO trust assumption.- DisputableVoting
newVoteisCREATE_VOTES_ROLE. It storeskeccak256(script)only.executeVoterequires_canExecute(ended, execution delay finished, accepted, not paused / cancelled) andkeccak256(_executionScript) == stored hash.voteOnBehalfOfrequiresrepresentatives[voter] == msg.senderand skips already-cast votes.
Do not file
permissionless
executeVote after
pass, CREATE_VOTES
privilege, documented
delegate front-run,
or the >
threshold.
Not submitted. Remaining aragon-apps: Agreement. Remaining in already-opened Lido trees: dual-governance TiebreakerSubCommittee / wrappers; CSM MerkleGateFactory / ValidatorStrikes / HashConsensus / MetaRegistry.
2026-09-03: Lido dual-governance Tiebreaker leftover (ba9dfc9)
Immunefi program
lido ($2,000,000,
kyc: false). Escrow
/ submit / timelock
and committees
leftovers are already
logged on the same
pin. This slice is
TiebreakerSubCommittee,
the Tiebreaker
library, and Dual
Governance
tiebreaker wrappers.
Local clone
/tmp/lido-dg at
ba9dfc9. No mainnet
interaction.
Files:
contracts/committees/TiebreakerSubCommittee.sol,
contracts/libraries/Tiebreaker.sol,
contracts/DualGovernance.sol
(tiebreaker wrappers).
Checked for: a
stranger
scheduleProposal
or
sealableResume
that unpauses or
schedules without
committee quorum
or outside a tie.
Result: no
user-exploitable
finding. Not
submitted.
- SubCommittee
scheduleProposal/sealableResumeare member-only HashConsensus votes. Execute is permissionless after the hash is scheduled (_markUsed). Constructor timelock is zero. Execute calls CorescheduleProposal/sealableResumeso the subcommittee contract votes as a Core member, not Dual Governance itself. - Core then
executes to Dual
Governance
tiebreakerScheduleProposal/tiebreakerResumeSealable, which requiremsg.sender == tiebreakerCommitteeandcheckTie(not Normal / VetoCooldown, and either the activation timeout has passed or Rage Quit plus a long-paused / faulty sealable blocker). - Setup
(
setTiebreakerCommittee, blockers, timeout) is admin-executor only on Dual Governance.
Do not file committee-member votes, permissionless execute after quorum, or tiebreaker action only in the documented deadlock.
Not submitted. Remaining aragon-apps: Agreement. Remaining in already-opened Lido trees: CSM MerkleGateFactory / ValidatorStrikes / HashConsensus / MetaRegistry. Listed dual-governance leftover is exhausted.
2026-09-03: Lido CSM leftover modules leftover (2824e21)
Immunefi program
lido ($2,000,000,
kyc: false). CSM
bond and gates
leftovers are already
logged on the same
pin. This slice is
MerkleGateFactory,
ValidatorStrikes,
HashConsensus, and
MetaRegistry. Local
clone /tmp/lido-csm
at 2824e21. No
mainnet interaction.
Files:
src/MerkleGateFactory.sol,
src/abstract/MerkleGate.sol,
src/ValidatorStrikes.sol,
src/lib/base-oracle/HashConsensus.sol,
src/MetaRegistry.sol.
Checked for: a
stranger factory
that hijacks an
existing gate;
processBadPerformanceProof
that ejects without
a valid Merkle
leaf; HashConsensus
submitReport from
a non-member.
Result: no user-exploitable finding. Not submitted.
MerkleGateFactory.createis permissionless and deploys a newOssifiableProxywith the caller- suppliedadmin, theninitializes it. It cannot write an already- deployed gate.MerkleGate._consumerequireshashLeaf(msg.sender)and marks that address consumed.ValidatorStrikes.processOracleReportis oracle-only.processBadPerformanceProofis permissionless but requires a multiproof againsttreeRoot, strikes ≥ the curve threshold, and evenmsg.valuethat is forwarded toejectBadPerformer.- HashConsensus
submitReportresolves the caller via_getMemberIndex(non-members revert). Quorum must be> totalMembers / 2. Member / quorum / processor changes are roles. - MetaRegistry
group / curve-
weight writes are
roles.
setOperatorMetadataAsOwneris the NO owner only.refreshOperatorWeightonly recomputes cache for an already-grouped operator.
Do not file permissionless new MerkleGate deploy, oracle-set strike trees, committee HashConsensus, or role privilege.
Not submitted. Remaining aragon-apps: Agreement leftover is logged. Listed CSM leftover modules are exhausted.
2026-09-03: Lido aragon-apps Agreement leftover (e44f928)
Immunefi program
lido ($2,000,000,
kyc: false). Vault /
Finance / Agent /
TokenManager and
Voting /
DisputableVoting
leftovers are already
logged. This slice is
Agreement. Local
clone
/tmp/lidofinance-aragon-apps
at e44f928. No
mainnet interaction.
File:
apps/agreement/contracts/Agreement.sol.
Checked for: a
stranger newAction
that locks another
account's collateral;
challengeAction
without
CHALLENGE_ROLE;
settleAction that
pays the caller the
submitter's lock.
Result: no user-exploitable finding. Not submitted.
newActionis an activated Disputable app only (msg.sendermust be indisputableInfosand active). It locks_submitterafter that address has signed the current setting.challengeActionneedsCHALLENGE_ROLEon the related Disputable app. Settlement offer cannot exceed action collateral.settleActionis the submitter, or anyone after the settlement period. Slash / unlock go to the stored submitter and challenger.closeActionis permissionless and only unlocks the submitter when_canClose.signrecordsmsg.senderonly.
Not submitted. Remaining aragon-apps leftover is exhausted.
2026-09-03: Nexus Mutual cover / pool / staking leftover (9e88562)
Immunefi program
Nexus Mutual
($25,000, kyc: false).
Unique listed GitHub
leftover not previously
logged. Local clone
/tmp/nexus-mutual at
9e88562. No mainnet
interaction.
Files:
contracts/modules/cover/Cover.sol,
contracts/modules/staking/StakingPool.sol,
contracts/modules/capital/Pool.sol,
contracts/modules/token/TokenController.sol.
Checked for: a
stranger buyCover
that mints to the
caller; withdraw
that pays
msg.sender instead
of the NFT owner;
sendPayout without
the Claims module.
Result: no user-exploitable finding. Not submitted.
buyCover/buyCoverWithRiareonlyMember. Cover edits require NFT owner or approved.executeCoverBuyis LimitOrders only.depositTopulls NXM frommsg.sendervia TokenController. New tokens mint todestinationor the caller. Existing token deposits require owner or approved.withdrawpaysstakingNFT.ownerOf(tokenId)(or the manager for token 0). Stake only after the tranche expires.- Pool
sendPayoutis Claims only.transferAssetToSafeis SafeTracker only.transferAssetToSwapOperatoris SwapOperator only.
Not submitted. Remaining Nexus listed GitHub: Claims / Assessment / Ramm / LimitOrders / CoverBroker leftover is logged. Leftover modules leftover is logged. Governance leftover is logged (listed Nexus Mutual GitHub leftover exhausted).
2026-09-03: Nexus Mutual claims leftover (9e88562)
Immunefi program
Nexus Mutual
($25,000, kyc: false).
Cover / pool / staking
leftover is already
logged. This slice is
Claims, Assessments,
Ramm, LimitOrders, and
CoverBroker. Local
clone /tmp/nexus-mutual
at 9e88562. No
mainnet interaction.
Files:
contracts/modules/assessment/Claims.sol,
contracts/modules/assessment/Assessments.sol,
contracts/modules/capital/Ramm.sol,
contracts/modules/cover/LimitOrders.sol,
contracts/external/cover/CoverBroker.sol.
Checked for: a
stranger
submitClaim on
someone else's
cover; redeemClaimPayout
to the caller;
executeOrder
without a buyer
signature;
swap that mints
NXM without ETH.
Result: no user-exploitable finding. Not submitted.
submitClaimis a member and the cover NFT owner only. Deposit ETH goes to the Pool.redeemClaimPayoutis the current cover owner and pays that owner after a redeemable assessment.retrieveDepositis permissionless and always pays the cover owner.castVoteis a member in the claim's assessor group. Group writes are Governor.startAssessmentis Claims only.- Ramm
swaptakes ETH or NXM frommsg.senderand mints / pays that sender with minOut and circuit breakers. - LimitOrders
executeOrderisonlyInternalSolverand recovers the buyer from the signature. Payment and refunds are the buyer.cancelOrderis the signer. - CoverBroker
buyCoverpulls payment frommsg.senderand refunds that sender.rescueFundsis owner-only.
Not submitted. Remaining Nexus listed GitHub: leftover modules leftover is logged. Governance leftover is logged (listed Nexus Mutual GitHub leftover exhausted).
2026-09-03: dHEDGE leftover (Sourcify)
Immunefi program
dHEDGE ($50,000,
kyc: false). Unique
no-KYC listed slice
not previously
logged. Listed
PoolFactory and linked contracts
Sourcify-open on
Ethereum
0x96D33bCF84DdE326014248E2896F79bbb9c13D6d
impl
0x5ee204C28217e30b45784ECd9e9aFDE029334a5F
exact_match
PoolFactory (solc
0.7.6); same impl
source on Optimism
0xC25bf381B2580211eE48813cD7c2119D5B015b62,
Base
0x7256070a6340E0A8d8a2b4eC3969bb4c5977Ec3c,
Arbitrum
0xD0EAe0fBa24FA2817BBa16fe5030a9a5B63946a3.
Extract /tmp/dhedge.
No mainnet
interaction.
Files:
PoolFactory.sol,
ProxyFactory.sol,
InitializableUpgradeabilityProxy.sol,
BaseUpgradeabilityProxy.sol,
SafeSignerAccess.sol.
Checked for: a
stranger
createFund that
binds another
manager’s logic;
deploy that
re-initializes a
live pool; pause /
setPoolsPaused
by a non-owner;
setLogic that
swaps
implementations
without owner.
Result: no user-exploitable finding. Not submitted.
createFundis permissionless when unpaused. It deploys a new pool + manager proxy, thensetPoolManagerLogicand marksisPool. Fee caps are stored for the manager initializer.deployis public and creates an uninitialized- looking clone whose EIP-1967 slot is the factory. It is not added toisPool.onlyPool/onlyPoolManagerstay false.- Proxies resolve
logic via
HasLogic(factory). getLogic(type).setLogicisonlyOwner. - Pause /
setPoolsPausedare owner or Safe signer. Signers can only pause, not unpause. DAO / fee / asset-handler / validator writes areonlyOwner.
Do not file
permissionless
createFund,
public unregistered
deploy clones, or
owner setLogic /
pause as a stranger
drain.
Not submitted.
Listed leftover is
the Sourcify-open
ETH / OP / Base /
Arb PoolFactory.
Remaining listed:
Polygon factory
Sourcify 404.
PoolLogic /
PoolManagerLogic
implementations are
not independently
Sourcify-fetched.
2026-09-03: Hydration DCA leftover (672e02f)
Immunefi program
Hydration
($222,222, kyc: false).
Unique listed GitHub
leftover not previously
logged. Local sparse
clone /tmp/hydration-node
at 672e02f. No
mainnet interaction.
Files:
pallets/dca/src/lib.rs,
pallets/bonds/src/lib.rs,
pallets/circuit-breaker/src/lib.rs.
Checked for: a
stranger schedule
that spends another
account's reserve;
terminate that
unreserves to the
caller; redeem
that pays without
burning the caller's
bonds.
Result: no user-exploitable finding. Not submitted.
- DCA
schedulerequireswho == schedule.ownerandreserve_namedsasset_infrom that signer. Buy orders are disabled.terminateis the owner orTerminateOriginand unreserves to the stored owner.execute_traderuns asschedule.owner. - Bonds
issueisIssueOriginand pulls fromIssuerAccount.redeemburns the signer's bonds after maturity and pays that signer 1:1. - Circuit-breaker
limit / lockdown
writes are
authority.
release_depositis signed or authority and releases the namedwhoafter lockdown ends.
Not submitted. Remaining Hydration listed GitHub: other pallets (omnipool / stableswap / XYK leftover is logged).
2026-09-03: Hydration pool leftover (672e02f)
Immunefi program
Hydration
($222,222, kyc: false).
DCA / bonds /
circuit-breaker leftover
is already logged.
This slice is
omnipool, stableswap,
XYK, and OTC. Local
sparse clone
/tmp/hydration-node
at 672e02f. No
mainnet interaction.
Files:
pallets/omnipool/src/lib.rs,
pallets/stableswap/src/lib.rs,
pallets/xyk/src/lib.rs,
pallets/otc/src/lib.rs.
Checked for: a
stranger
remove_liquidity
on someone else's
position; sell
that pays the
caller without
taking asset_in;
OTC cancel_order
that unreserves to
the caller.
Result: no user-exploitable finding. Not submitted.
- Omnipool
add_liquiditypulls the signer and mints an NFT to that signer.do_remove_liquidityrequiresNFTHandler::owner == whoand pays that owner.withdraw_protocol_liquidityisAuthorityOrigin.sell/buytransferasset_infrom the signer andasset_outto the signer. - Stableswap
sell/buyrequire the signer's free balance and transfer that signer. - XYK
create_pool/add_liquiditypull the signer. Shares mint to that signer. - OTC
place_orderreservesasset_outfrom the signer.fill_order/partial_fill_orderswap against the reserved owner amount.cancel_orderis the stored owner only.
Not submitted. Remaining Hydration listed GitHub: liquidity-mining / staking / LBP / referrals / route- executor leftover is logged.
2026-09-03: Hydration staking leftover (672e02f)
Immunefi program
Hydration
($222,222, kyc: false).
DCA and pool leftovers
are already logged.
This slice is staking,
liquidity-mining, LBP,
referrals, and
route-executor. Local
sparse clone
/tmp/hydration-node
at 672e02f. No
mainnet interaction.
Files:
pallets/staking/src/lib.rs,
pallets/liquidity-mining/src/lib.rs,
pallets/lbp/src/lib.rs,
pallets/referrals/src/lib.rs,
pallets/route-executor/src/lib.rs.
Checked for: a
stranger claim /
unstake on someone
else's position;
LBP remove_liquidity
by a non-owner;
claim_rewards that
pays another
account's shares.
Result: no user-exploitable finding. Not submitted.
- Staking
stakelocks the signer's native balance and mints an NFT to that signer.increase_stake,claim, andunstakerequireis_owner. - Liquidity-mining
has no public
calls. Farm create
pulls
total_rewardsfrom the owner account. - LBP
create_poolisCreatePoolOriginand pullspool_owner.remove_liquidityis the stored pool owner after the sale ends. - Referrals
claim_rewardsconverts the pot then pays the signer from that signer'sReferrerShares/TraderShares. - Route-executor
sell/buy/sell_allrun as the signer.
Not submitted. Remaining Hydration listed GitHub: EVM leftover is logged. Leftover pallets leftover is logged. Leftover adapters leftover is logged (listed Hydration leftover that a public tree would open is exhausted).
2026-09-03: Velvet Capital leftover (Sourcify)
Immunefi program
Velvet Capital
($51,000, kyc: false).
Unique no-KYC listed
slice not previously
logged. 28 of 30 BSC
listed addresses
Sourcify-open (chain
56). Extract
/tmp/velvet. No
mainnet interaction.
Listed Sourcify-open:
IndexSwap /
OffChainIndexSwap /
Exchange /
Rebalancing /
OffChainRebalance /
RebalanceAggregator /
FeeModule /
VelvetSafeModule /
AssetManagerConfig /
PriceOracle /
IndexSwapLibrary /
FeeLibrary /
RebalanceLibrary /
Pancake / Venus / Ape /
BiSwap / Wombat / Beefy
handlers /
ZeroExHandler /
OneInchHandler /
ParaswapHandler. Two
IndexSwap /
OffChainRebalance
instances share the
same impl source.
Checked for: stranger
investInFund that
mints to the caller
from another user's
transfer; withdrawFund
that pays without
burning the caller;
Exchange
_pullFromVault
without
INDEX_MANAGER_ROLE;
VelvetSafeModule
executeWallet by a
non-owner; handler
redeem that pulls
from a vault.
Result: no user-exploitable finding. Not submitted.
investInFund/investInFundOffChainpullmsg.sender(ormsg.value) then mint to that sender.withdrawFund/redeemTokensburn the caller and pay that caller (or hold redeemed underlyings in the caller's mapping).- Exchange vault pulls
and swaps are
onlyIndexManager. VelvetSafeModuleexecuteWallet/executeWalletDelegateareonlyOwner; setup transfers ownership to Exchange. - Rebalance /
aggregator vault
pulls are
onlyAssetManager. IndexSwap mint/burn shares areMINTER_ROLE. - Handlers operate on
tokens already on the
handler. Public
redeem/ aggregatorswapcannot pull the Gnosis Safe. chargeFeesis public and mints fee shares to the configured treasuries.
Do not file first- depositor inflation, public fee mint to treasury, handler leftover grief, asset- manager rebalance / pause, owner UUPS upgrade, or public unpause after 15 minutes.
Not submitted.
Listed leftover is the
Sourcify-open BSC
IndexSwap / Exchange /
rebalance / fee / Safe
module / handlers.
Remaining listed:
0xB9669646EBb93A03dB67CC05f2894487C9923775
and
0xE61472Ce45e559830ECF12F6a215Cd732F4D798B
Sourcify 404.
Velvet Capital V2 is a
separate KYC program.
2026-09-03: Mars Ecosystem leftover (Sourcify)
Immunefi program
Mars Ecosystem
($10,000, kyc: false).
Unique no-KYC listed
slice. 7 of 9 BSC
listed addresses
Sourcify-open (chain
56). Extract
/tmp/mars. No
mainnet interaction.
Listed Sourcify-open:
Core
0x00789Cfb69499c65ac9A3a68fb4917c9b4FcA2a7
exact_match;
MarsSwapFactory
0x6f12482D9869303B998C54D91bCD8bCcba81f3bE;
MarsSwapRouter
0xb68825C810E67D4e444ad5B9DeB55BA56A66e72D;
AirDrop
0x01D152fF991E76b6cb310387c07cAfdFda790a25;
LiquidityMiningMaster
0xc7B8285a9E099e8c21CA5516D23348D8dBADdE4a
and
0x22D8d50454203bd5a41B49ef515891f1aD9f3e53;
VestingMaster
0x381Facb9282770a5E3Ac6c8637096b442039C3dB
match.
Checked for: stranger
farm withdraw of
another user's LP;
claim that pays a
zero-allocation
airdrop as a drain;
VestingMaster lock
by a non-farm;
router
removeLiquidity
that burns another
account's LP.
Result: no user-exploitable finding. Not submitted.
- Farm
deposittransferFrommsg.senderand creditsuserInfo[pid] [msg.sender].withdraw/emergencyWithdrawpay that sender. - VestingMaster
lockisonlyFarms.claimpaysmsg.sender's matured locks. - AirDrop
claimpays the storeduserClaimed [msg.sender].amountonce.addList/recoverareonlyGovernor. - Router
removeLiquiditytransferFrommsg.senderLP thenburns toto. FactorysetFeeToisonlyGovernor. - Core
allocateToken/ XMS mint areonlyGovernor.
Do not file governor treasury allocate, MasterChef reward math, or Uniswap-style router slippage as a stranger drain.
Not submitted.
Listed leftover is
the Sourcify-open
BSC Core / factory /
router / farm /
vesting / airdrop.
Remaining listed:
0x7859B01BbF675d67Da8cD128a50D155cd881B576
and
0xC35a8BdBB93A03dB362aF6dC3383cD2c6aEA6cBc
Sourcify 404.
2026-09-03: Hydration EVM leftover (672e02f)
Immunefi program
Hydration
($222,222, kyc: false).
DCA, pool, and staking
leftovers are already
logged. This slice is
evm-accounts, the
MultiCurrency
precompile, and
permit dispatch.
Local sparse clone
/tmp/hydration-node
at 672e02f. No
mainnet interaction.
Files:
pallets/evm-accounts/src/lib.rs,
runtime/hydradx/src/evm/precompiles/multicurrency.rs,
runtime/hydradx/src/evm/permit.rs.
Checked for: a
stranger
claim_account
that binds another
account; transfer
from a non-caller;
transfer_from
without allowance.
Result: no user-exploitable finding. Not submitted.
bind_evm_addressbinds the signer.claim_accountis unsigned butvalidate_signatureverifies the claimed account. Deployer / approved-contract / NTT minter writes areControllerOrigin.- MultiCurrency
transferpullshandle.context(). caller.approvesets allowance for that caller.transfer_fromrequires allowance or an owner-approved contract. - Permit
dispatch_permitruns as the permitsourceand reverts if the account nonce changes.
Not submitted. Hydration leftover pallets leftover is logged. Leftover adapters leftover is logged (listed Hydration leftover that a public tree would open is exhausted).
2026-09-03: Beefy Finance leftover (Sourcify)
Immunefi program
Beefy Finance
($75,000, kyc: false).
Unique no-KYC listed
slice. All 243 listed
smart contracts are
Polygon vault /
strategy addresses.
First-30 Sourcify
sample: 23 open, 7
404. Extract
/tmp/beefy. No
mainnet interaction.
Listed Sourcify-open
sample:
BeefyVaultV6 (11 in
sample, including
0xfEcf784F48125ccb7d8855cdda7C5ED6b5024Cb3
match and
0x9f3B96a2Dd55aa904bC5476Ffe66E74a53f6b420
exact_match);
StrategyCommonChefLP
0x315324Bcd724b8CF01FfE6d04F029328f595e126;
StrategyCommonChefReferrerLP
0xC32CCCfF0777C145e7d658081D141ec8A38f8133;
StrategyCommonChefSingle
0xf2F5C13686b79b92dC73F6Bb1D2663329658EC87;
StrategyPolygonBifiMaxi
0xD126BA764D2fA052Fc14Ae012Aef590Bc6aE0C4f;
StrategyCurveATricrypto
0x0C0C75AF434519AB96E34EB3bbEea726324d6264;
StrategyCurveAaveRen
0xAccf2f81F8c13e8D97ee272D141b6f4B613aB46D;
StrategyDFYNDualFarmRewardPoolLP (3);
StrategyDFYNRewardPoolLP;
StrategyPolyCatDyfnLP.
Checked for: stranger
vault withdraw that
pays without burning
the caller; strategy
withdraw /
retireStrat without
the vault; public
earn that sends
vault want to a
non-strategy.
Result: no user-exploitable finding. Not submitted.
- Vault
deposittransferFrommsg.senderthen mints shares to that sender.withdrawburns the caller and pays that caller. - Public
earnforwards idlewantto the configuredstrategyonly. - Strategy
withdraw/retireStrataremsg.sender == vault. HarvestonlyEOAtakes the configured call fee from rewards. proposeStrat/upgradeStratareonlyOwner.panicisonlyManager.
Do not file first-
depositor inflation,
public earn, owner
strat upgrade, or
harvest call-fee as
a stranger drain.
Not submitted.
Listed leftover is
the Sourcify-open
Polygon
BeefyVaultV6 +
common chef / DFYN /
Curve / BIFI-maxi
strategies in the
sampled slice.
Remaining listed:
other Polygon vaults
(7 of first 30
Sourcify 404;
unsampled addresses
not fetched).
2026-09-03: Orca leftover (3b47341 / 05fe66b)
Immunefi program
Orca ($500,000,
kyc: false). Unique
no-KYC listed slice.
Listed xORCA
StaKE6XNKVVhG8Qu9hDJBqCW3eRe7MDGLz17nJZetLT
and Orca Whirlpools
whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc.
Official clones
/tmp/xorca at
05fe66b and
/tmp/whirlpools at
3b47341. No mainnet
interaction.
Files:
solana-program/src/instructions/{stake,unstake,withdraw,set,initialize}.rs,
programs/whirlpool/src/instructions/{swap,increase_liquidity,decrease_liquidity,collect_fees,close_position}.rs
plus v2 variants.
Checked for: stranger
xORCA withdraw of
another unstaker's
pending; Whirlpool
collect_fees /
decrease_liquidity
without the position
NFT; swap that
pulls a non-signer
ATA.
Result: no user-exploitable finding. Not submitted.
- xORCA
staketransfers ORCA from the signer ATA and mints xORCA to that signer.unstakeburns the signer xORCA and writes a pending PDA seeded with that unstaker.withdrawverifies that PDA against the signer and pays the signer ATA after cooldown.setis the stored update authority. - Whirlpool
collect_fees/decrease_liquidity/increase_liquidity/close_positioncallverify_position_authority(owner or delegate of the position NFT). swap/swap_v2transfer astoken_authorityfrom the supplied owner ATAs; SPL requires that signer.
Do not file first- depositor vault inflation (xORCA virtual-assets math and tests disincentivize it), authority cooldown updates, or swap slippage as a stranger drain.
Not submitted. Listed leftover is exhausted.
2026-09-03: Threshold Bank leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
BOB cross-chain leftover
is already logged.
This slice is listed
Ethereum Sourcify
Bank plus Bank /
VendingMachine from
keep-network/tbtc-v2.
Local clone
/tmp/threshold-tbtc
at 502cd39. Sourcify
exact_match for
0x65Fbae61ad2C8836fFbFB502A0dA41b0789D9Fc6.
No mainnet interaction.
Files:
solidity/contracts/bank/Bank.sol,
solidity/contracts/bridge/VendingMachine.sol.
Checked for: a
stranger
increaseBalance;
transferBalance
from another
account;
VendingMachine.mint
that credits the
caller without
taking TBTC v1.
Result: no user-exploitable finding. Not submitted.
- Bank
transferBalancemoves the caller's balance. Allowance updates are the owner.increaseBalance/increaseBalances/increaseBalanceAndCallareonlyBridge.decreaseBalanceburns the caller. - VendingMachine
mintpulls TBTC v1 frommsg.senderand mints v2 to that sender.receiveApprovalis TBTC v1 only and mints tofrom.unmintburns the caller's v2 and pays that caller v1.withdrawFeesis governance.
Not submitted.
Remaining Threshold
listed leftover:
other explorer
addresses and
keep-network/tbtc-v2
typescript.
2026-09-03: Arkadiko leftover (Hiro)
Immunefi program
Arkadiko ($100,000,
kyc: false). Unique
no-KYC listed slice.
12 listed Clarity
contracts on
SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR
Hiro-open. Extract
/tmp/arkadiko. Official
clone /tmp/arkadiko-dao
at 62095e8. No mainnet
interaction.
Files:
arkadiko-vaults-operations-v1-3.clar,
arkadiko-vaults-manager-v1-2.clar,
arkadiko-vaults-pool-active-v1-1.clar,
arkadiko-vaults-pool-liq-v1-2.clar,
arkadiko-vaults-data-v1-1.clar,
arkadiko-vaults-sorted-v1-1.clar,
usda-token.clar,
wstx-token.clar.
Checked for: stranger
open-vault that mints
USDA against another
account's collateral;
close-vault that
withdraws another
owner's collateral;
liquidate-vault that
pays leftover to the
caller; pool-active
withdraw without
operations / manager.
Result: no user-exploitable finding. Not submitted.
open-vault/update-vault/close-vaultbindownertotx-sender. Collateral deposit / USDA mint and burn go to that sender.- pool-active
deposit/withdrawrequire operations, manager, or DAO owner.set-vault/ sorted insert remove are the same callers. liquidate-vaultonly when CR is invalid. Leftover collateral returns to the vault owner. Liquidation collateral goes to the liq pool.redeem-vaultis the first sorted vault. Redeemer burns their USDA and receives collateral minus fee.- USDA
mint-for-daois the DAO. wstx wrap / unwrap movetx-sender. Liq-pool stake / unstake credittx-sender.
Do not file DAO owner privilege, permissionless liquidation of undercollateralized vaults, or first- vault redemption as a stranger drain.
Not submitted. Listed leftover is the Hiro-open vaults / tokens / liq-pool slice. Remaining listed: the website only.
2026-09-03: Threshold vault + MaintainerProxy leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Bank / VendingMachine
and BOB leftover are
already logged.
This slice is listed
Ethereum Sourcify
TBTCVault
(0x9C070027cdC9dc8F82416B2e5314E11DFb4FE3CD),
DonationVault
(0xa544b70dC6af906862f68eb8e68c27bb7150e672),
and MaintainerProxy
(0xcF29Ff894674775841F60Aa2a3c373DE27A8df2b).
Local clone
/tmp/threshold-tbtc
at 502cd39.
No mainnet interaction.
Files:
solidity/contracts/vault/TBTCVault.sol,
solidity/contracts/vault/TBTCOptimisticMinting.sol,
solidity/contracts/vault/DonationVault.sol,
solidity/contracts/maintainer/MaintainerProxy.sol.
Checked for: a
stranger mint of TBTC
without Bank balance;
optimistic mint by a
non-minter; debt
repay that mints
twice; DonationVault
decreaseBalance of
someone else;
MaintainerProxy proof
submit without being
a listed maintainer.
Result: no user-exploitable finding. Not submitted.
TBTCVault.mintpulls the caller's Bank satoshis after checking balance and allowance.receiveBalanceApprovalisonlyBank.receiveBalanceIncreaseisonlyBankand mints only the swept amount afterrepayOptimisticMintingDebt.unmintburns the caller and returns that caller's Bank balance.unmintAndRedeemrequires the decoded redeemer to equal the TBTC burner (rebate impersonation already patched; do not refile 1308).- Optimistic mint
request / finalize
are
onlyMinter, require a revealed unswept deposit targeted at this vault, and waitoptimisticMintingDelay. Cancel isonlyGuardian. Debt is repaid from later Bank increases so a sweep does not mint a second full amount. - DonationVault
donate/receiveBalanceApprovalmove the owner into the vault thendecreaseBalancethe vault.receiveBalanceIncreaseburns the vault's newly credited Bank total. - MaintainerProxy
sweep / redemption
/ moving-funds
proofs are
onlySpvMaintainer. Wallet-lifecycle helpers areonlyWalletMaintainer. Auth andupdateBridgeare owner. Permissionless wrappers (resetMovingFundsTimeout,defeatFraudChallenge*) still have to succeed on Bridge before the reimbursement pool pays the caller.
Not submitted.
Remaining Threshold
listed leftover:
Bridge /
BridgeGovernance /
RedemptionWatchtower /
RebateStaking /
Wormhole L1
depositor/redeemer
proxies,
WalletProposalValidator,
LightRelay,
TokenholderGovernor,
ReimbursementPool,
and
keep-network/tbtc-v2
typescript.
2026-09-03: Threshold watchtower + Wormhole L1 leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Vault / MaintainerProxy
leftover is already
logged. This slice is
listed Ethereum
Sourcify
RedemptionWatchtower
impl
(0xbfD04E3928923aD8C86256B9A8F64eBD01Cf1dAf
behind
0xB8dF0A949aC45ff8f401553A1dcb742Feb38E6D3),
BTCDepositorWormhole
impl
(0x9A5250c7beA10f7472eB9d50bB757B83d67FB5ED
behind
0xb810AbD43d8FCFD812d6FEB14fefc236E92a341A),
L1BTCDepositorWormholeV2Arbitrum
impl
(0x82FDDF79765Ed75325bCBdf65F67dF0879AAbe8C
behind
0x75A6e4A7C8fAa162192FAD6C1F7A6d48992c619A),
and L1BTCRedeemerWormhole
impl
(0x14D93D4c4e07130fFfE6083432b66b96D8eB9DC0
behind
0x5D4d83aaB53B7E7cA915AEB2d4d3f4e03823DbDe).
Local clone
/tmp/threshold-tbtc
at 502cd39.
No mainnet interaction.
Files:
solidity/contracts/bridge/RedemptionWatchtower.sol,
solidity/contracts/cross-chain/AbstractL1BTCDepositor.sol,
solidity/contracts/cross-chain/wormhole/BTCDepositorWormhole.sol,
solidity/contracts/cross-chain/wormhole/L1BTCDepositorWormholeV2Base.sol,
solidity/contracts/cross-chain/wormhole/L1BTCRedeemerWormhole.sol,
solidity/contracts/integrator/AbstractBTCDepositor.sol,
solidity/contracts/integrator/AbstractBTCRedeemer.sol.
Checked for: a
stranger
withdrawVetoedFunds;
guardian-less veto;
finalize that bridges
tBTC to the caller
instead of extraData;
Wormhole redeem that
ignores
allowedSenders.
Result: no user-exploitable finding. Not submitted.
- Watchtower
raiseObjectionisonlyGuardianand needs a pending Bridge redemption. Third objection finalizes, bans the redeemer, pulls Bank balance vianotifyRedemptionVeto, and burns the penalty.withdrawVetoedFundspays onlyveto.redeemerafter the freeze.disableWatchtoweris lifetime-gated. - L1 depositor
initializeDepositreveals with extraData bound in the Bitcoin script.finalizeDepositis one-shot Initialized → Finalized, reads extraData from the Bridge deposit, and_transferTbtclocks that amount to the configured Wormhole gateway with the recorded receiver as payload. Relayermsg.senderis not the L2 owner. - L1 redeemer
requestRedemptionmeasures tBTC received fromcompleteTransferWithPayload, requiresallowedSenders, unmints through the vault, and requests Bridge redemption to the VAA payload script. VAA replay is Token Bridge plusnonReentrant.
Do not refile 1496 (cross-chain redemption timeout) or 1410 (TOB-TBTCACEXT-30).
Not submitted.
Remaining Threshold
listed leftover:
Bridge /
BridgeGovernance /
RebateStaking /
WalletProposalValidator /
LightRelay /
TokenholderGovernor /
ReimbursementPool,
and
keep-network/tbtc-v2
typescript.
2026-09-03: JustLend leftover (f28f3b4)
Immunefi program
JustLend DAO ($50,000,
kyc: false). Unique
no-KYC listed slice.
Official clone
/tmp/justlend-protocol
at f28f3b4 (justlend/ justlend-protocol).
55 listed assets are
Tronscan smart_contract
URLs (Unitroller /
Comptroller / jToken
markets / GovernorBravo /
oracle / rate models).
No mainnet interaction.
Files:
contracts/Unitroller.sol,
contracts/Comptroller.sol,
contracts/CToken.sol,
contracts/CErc20.sol,
contracts/CEther.sol,
contracts/CErc20Delegator.sol,
contracts/Maximillion.sol.
Checked for: a stranger
mint that credits
another account without
pulling that account;
redeem / borrow that
pays the caller from
someone else's jTokens;
liquidateBorrow without
shortfall; seize that
moves collateral when
msg.sender is not the
borrowed jToken.
Result: no user-exploitable finding. Not submitted.
- Unitroller
_setPendingImplementation/_setPendingAdminare admin. Accept is the pending implementation or pending admin. Other callsdelegatecallthe current implementation. mintFreshpulls the minter viadoTransferInand credits that minter.redeemFreshburns the redeemer's jTokens and pays that redeemer.borrowFreshpays the borrower after a liquidity check.repayBorrowFreshpulls the payer and reduces the named borrower.liquidateBorrowFreshusesmsg.senderas liquidator, requires shortfall and closeFactor, and seizes viaseizeInternalorcTokenCollateral.seize(msg.senderis the seizer). Borrower cannot be the liquidator.- Comptroller
redeem / borrow /
transfer require
listed markets and no
hypothetical shortfall.
Liquidation requires
shortfall.
_setPriceOracle/_setCollateralFactor/_supportMarket/ pause are admin or pause guardian. - CEther refunds surplus
msg.valueto the sender. CErc20 skips the USDT transfer return-value check (Tron USDT compatibility). Delegator_setImplementationis admin. MaximillionrepayBehalfrefunds excess TRX tomsg.sender.
Do not file first- depositor exchange-rate inflation, admin / reserveAdmin privilege, permissionless liquidation of an undercollateralized account, or the USDT return-value skip as theft.
Not submitted. Listed leftover is the official GitHub Unitroller / Comptroller / CToken mint-redeem-borrow- liquidate slice. Remaining listed: ComptrollerLegacy JST rewards, GovernorBravo / WJST / Timelock, PriceOracle / PriceOracleProxy, interest-rate models, and the other Tronscan jToken markets (same CToken / CErc20 / CEther / Delegator bytecode).
2026-09-03: Threshold RebateStaking leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Watchtower / Wormhole L1
leftover is already
logged. This slice is
listed Ethereum
Sourcify
RebateStaking impl
(0x25aAF04229f77A9AE80430b3C89E3455Ab2ec22F
behind
0x0184739C32edc3471D3e4860c8E39a5f3Ff85A45).
Local clone
/tmp/threshold-tbtc
at 502cd39.
No mainnet interaction.
Files:
solidity/contracts/bridge/RebateStaking.sol.
Checked for: a
stranger
applyForRebate that
zeros someone else's
treasury fee;
finalizeUnstaking
of another stake;
callback rebate
without
setRebateAuthorization.
Result: no user-exploitable finding. Not submitted.
applyForRebateandcancelRebateareonlyBridge.getStakeronly redirects a zero-stake delegatee to the staker who set them.stakepulls T from the caller.startUnstakingandfinalizeUnstakingmove the caller's stake afterunstakingPeriod.setRebateAuthorizationis the caller's stake only.isRebateAuthorizedis false whengetStakeis 0.forceStakeTransferis owner. Same-blockcancelRebatematching at most one rebate is a documented temporary cap denial, not a drain.
Do not refile 1308
(rebate timestamp /
impersonation).
Vault
unmintAndRedeem
already binds the
decoded redeemer.
Not submitted.
Remaining Threshold
listed leftover:
Bridge /
BridgeGovernance /
WalletProposalValidator /
LightRelay /
TokenholderGovernor /
ReimbursementPool,
and
keep-network/tbtc-v2
typescript.
2026-09-03: JustLend leftover governance leftover (f28f3b4)
Immunefi program
JustLend DAO ($50,000,
kyc: false). Unitroller /
Comptroller / CToken leftover
is already logged. This
slice is listed
GovernorBravo / WJST /
Timelock / PriceOracleProxy.
Official clone
/tmp/justlend-protocol
at f28f3b4. No mainnet
interaction.
Files:
contracts/Governance/Bravo/GovernorBravoDelegate.sol,
contracts/Governance/WJST.sol,
contracts/Timelock.sol,
contracts/PriceOracleProxy.sol.
Checked for: a stranger
execute that runs an
unqueued proposal;
voteFresh that locks
another account's WJST
without the governor;
withdraw of someone
else's wrapped JST;
setSaiPrice by a
non-guardian.
Result: no user-exploitable finding. Not submitted.
proposeneeds WJST votes above the threshold or a live whitelist.queueis Succeeded only.executeis Queued and goes through Timelock.cancelis the proposer or a proposer who fell below threshold.castVoteInternalrequires an Active proposal, locksvotesAddedviawjst.voteFresh, and credits the named voter.voteFreshis governor-only and subtracts that account.- WJST
depositpullsmsg.senderand credits that sender.withdrawburns and pays the sender.withdrawVotesunlocks the sender after proposal state ≥ 2.setGovernorAlpha/transferOwnershipare owner. - Timelock
queue / cancel /
execute are admin.
setDelay/setPendingAdminare self-calls. - PriceOracleProxy
getUnderlyingPriceis view.setSaiPriceis guardian, once, and bounded.
Do not file WJST
getPriorVotes
ignoring the block
(no checkpoint —
governance design),
admin / owner
privilege, or
whitelist guardian
as theft.
Not submitted. Listed leftover is GovernorBravo / WJST / Timelock / PriceOracleProxy. Remaining listed: ComptrollerLegacy JST rewards, PriceOracleV1, interest-rate models, and the other Tronscan jToken markets (same CToken / CErc20 / CEther / Delegator bytecode).
2026-09-03: Threshold validator + ReimbursementPool leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
RebateStaking leftover
is already logged.
This slice is listed
Ethereum Sourcify
WalletProposalValidator
(0x30019D85a86ABD3cDA1167F4C052690c32FBDEc2)
and ReimbursementPool
(0x8adF3f35dBE4026112bCFc078872bcb967732Ea8).
Local clone
/tmp/threshold-tbtc
at 502cd39 plus Sourcify
exact_match for the
pool. No mainnet
interaction.
Files:
solidity/contracts/bridge/WalletProposalValidator.sol,
Sourcify
contracts/ReimbursementPool.sol.
Checked for: a
write path on the
validator that
moves Bank / TBTC;
refund from an
unauthorized
caller; withdraw
to a stranger.
Result: no user-exploitable finding. Not submitted.
- WalletProposalValidator
has no write
functions. Sweep /
redemption /
moving-funds /
heartbeat helpers
are
viewand revert on invalid proposals. They do not submit proofs or change Bridge state. - ReimbursementPool
refundisnonReentrantand requiresisAuthorized[msg.sender]. Authorize / unauthorize /setStaticGas/setMaxGasPrice/withdraw/withdrawAllare owner.
Not submitted.
Remaining Threshold
listed leftover:
Bridge /
BridgeGovernance /
LightRelay /
TokenholderGovernor,
and
keep-network/tbtc-v2
typescript.
2026-09-03: JustLend leftover rewards leftover (f28f3b4)
Immunefi program
JustLend DAO ($50,000,
kyc: false). Unitroller /
CToken and GovernorBravo /
WJST leftovers are already
logged. This slice is
ComptrollerLegacy JST
rewards, PriceOracleV1,
and interest-rate models.
Official clone
/tmp/justlend-protocol
at f28f3b4. No mainnet
interaction.
Files:
contracts/ComptrollerLegacy.sol,
contracts/PriceOracle/PriceOracleV1.sol,
contracts/JumpRateModel.sol,
contracts/JumpRateModelV2.sol,
contracts/BaseJumpRateModelV2.sol,
contracts/WhitePaperInterestRateModel.sol.
Checked for: a stranger
claimComp that pays
the caller another
holder's JST;
setPrice without being
poster; updateJumpRateModel
by a non-owner.
Result: no user-exploitable finding. Not submitted.
claimCompupdates supply / borrow indexes andtransferCompsends JST to the named holder, not the caller. Speeds and market add/drop are admin or initializing.refreshCompSpeedsonly rewrites speeds.- PriceOracleV1
setPrice/setPricesrequireposter. Reader assets cannot be overwritten. Swing is capped. - JumpRate /
WhitePaper models
are view-only after
construct.
JumpRateModelV2
updateJumpRateModelis owner.
Do not file poster /
admin / owner
privilege, permissionless
claimComp for another
holder (pays that
holder), or public
refreshCompSpeeds
as theft.
Not submitted. Listed leftover that a public tree would open is exhausted. Remaining listed: other Tronscan jToken markets (same CToken / CErc20 / CEther / Delegator bytecode).
2026-09-03: Threshold Bridge leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Bank / vault /
watchtower / Wormhole /
RebateStaking leftovers
are already logged.
This slice is listed
Ethereum Sourcify
Bridge (match
0x8d014903bf7867260584d714e11809fea5293234).
Local clone
/tmp/threshold-tbtc
at 502cd39.
No mainnet interaction.
Files:
solidity/contracts/bridge/Bridge.sol,
solidity/contracts/bridge/Deposit.sol,
solidity/contracts/bridge/Redemption.sol.
Checked for: a stranger reveal that credits another depositor; sweep / redemption proof without SPV maintainer; callback redemption that spends a Vault and rebates a stranger; timeout payout to the caller.
Result: no user-exploitable finding. Not submitted.
revealDeposit/revealDepositWithExtraDataembedmsg.senderin the expected P2(W)SH script and storedepositor = msg.sender.submitDepositSweepProofandsubmitRedemptionProofareonlySpvMaintainerand require an SPV proof.- Direct
requestRedemptionusesmsg.senderasbalanceOwner.receiveBalanceApprovalis Bank-only. Callback rebate applies only when the named redeemer authorized that balance owner (do not refile 1308). notifyRedemptionTimeoutreturns Bank balance torequest.redeemerafterredemptionTimeout.notifyRedemptionVetois the watchtower only.
Do not refile 1494 (closeable wallets) or 1320 (relayer reimbursement).
Not submitted.
Remaining Threshold
listed leftover:
BridgeGovernance /
LightRelay /
TokenholderGovernor,
and
keep-network/tbtc-v2
typescript.
2026-09-03: Threshold leftover gov / relay leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Bridge leftover is
already logged.
This slice is listed
Ethereum Sourcify
BridgeGovernance
(0xA94DD662E2A247493fACCeab9f2459AAF90778Ee),
LightRelay
(0x836cdFE63fe2d63f8Bdb69b96f6097F36635896E),
and
TokenholderGovernor
(0xd101f2b25bcbf992bdf55db67c104fe7646f5447).
Local clone
/tmp/threshold-tbtc
at 502cd39 plus Sourcify
for the governor.
No mainnet interaction.
Files:
solidity/contracts/bridge/BridgeGovernance.sol,
solidity/contracts/relay/LightRelay.sol,
Sourcify
contracts/governance/TokenholderGovernor.sol.
Checked for: a
stranger
setVaultStatus /
setRebateStaking;
retarget that
skips header
checks; governor
execute without
a passed proposal.
Result: no user-exploitable finding. Not submitted.
- BridgeGovernance
param updates are
onlyOwnerand two-step withgovernanceDelay.setVaultStatus/setSpvMaintainerStatus/setRedemptionWatchtower/setRebateStakingare owner (the last two are documented one-off wiring). - LightRelay
retargetchecks header length and pre/post targets. Auth of submitters /setProofLengthare owner. - TokenholderGovernor
is an OZ Governor
- timelock wrapper (1.5% quorum, 0.25% proposal threshold). Votes come from liquid T plus staking checkpoints.
Not submitted.
Listed Threshold
explorer leftover in
this pass is
exhausted at the
opened-contract
level. Remaining
listed:
keep-network/tbtc-v2
typescript (not a
Solidity money path).
2026-09-03: Pareto Credit leftover (19e7cde)
Immunefi program
Pareto Credit ($50,000,
kyc: false). Unique
no-KYC listed slice.
Listed asset is the
docs vault-address page.
Docs HTML lists Ethereum
vaults. Sourcify
exact_match
TransparentUpgradeableProxy
for
0xf6223C567F21E33e859ED7A045773526E9E3c2D5
and siblings;
match IdleCDOTranche
for
0x45054c6753b4Bce40C5d54418DabC20b070F85bE.
Official clone
/tmp/idle-tranches
at 19e7cde (Idle
Perpetual Yield Tranches
/ Pareto credit vaults).
No mainnet interaction
(publicnode storage 403).
Files:
contracts/IdleCDOCreditVault.sol,
contracts/IdleCDO.sol,
contracts/IdleCDOTranche.sol,
contracts/IdleCDOEpochVariant.sol.
Checked for: a stranger
depositAA that mints
to the caller without
pulling that caller;
withdrawAA that pays
without burning the
caller; epoch
claimWithdrawRequest
that pays another
user's receipt.
Result: no user-exploitable finding. Not submitted.
- CreditVault
depositAA/depositBBpullmsg.senderand mint tranche shares to that sender, thenstrategy.deposit. - IdleCDO
withdrawAA/withdrawBBburn the caller's tranche via_withdrawOpsand pay that caller. - Tranche
mint/burnare minter (the CDO) only. First mint burnsMIN_LIQUIDITYtoaddress(1). - Epoch
requestWithdrawburns the caller and records a strategy receipt formsg.sender.claimWithdrawRequest/claimInstantWithdrawRequestclaim that sender.
Do not file junior
loss absorption /
default pause, owner
or guardian shutdown,
first-deposit
MIN_LIQUIDITY, or
Keyring allowlist as
theft.
Not submitted. Listed leftover is the IdleCDO / CreditVault / Tranche / epoch request-claim slice. Remaining listed: IdleCreditVault strategy, other epoch admin, proxy implementations not independently Sourcify-fetched, and other docs addresses.
2026-09-03: Puffer Finance leftover (Sourcify)
Immunefi program
pufferfinance-boost
($200,000, kyc: false).
Unique no-KYC listed
Ethereum slice.
Sourcify exact_match
PufferDepositor
0x7276925e42f9c4054afa2fad80fa79520c453d6a,
PufferVaultV5 impl
0x3b2fdFdEFE919dBcCE0bc5ac426097d5523B8AFA
behind pufETH proxy
0xd9a442856c234a39a81a089c06451ebaa4306a72,
and Timelock
0x3C28B7c7Ba1A1f55c9Ce66b263B33B204f2126eA.
Official clone
/tmp/puffer-contracts
at 5ebdeaa.
No mainnet interaction.
Files:
src/PufferDepositor.sol,
src/PufferVaultV5.sol.
Checked for: a
stranger mint of
pufETH without ETH /
stETH; withdraw that
burns another owner
without allowance;
mintRewards by a
random caller;
transferETH of vault
ETH.
Result: no user-exploitable finding. Not submitted.
- Depositor
depositStETH/depositWstETH/ swap-and-deposit pull frommsg.senderand mint pufETH to that sender. All entry points arerestricted(AccessManager pause-style). - Vault
depositETHmints toreceiverformsg.value.depositStETHpulls the caller's stETH shares.withdraw/redeemburnownershares (ERC4626 allowance) and wrap ETH forreceiver. mintRewards/depositRewards/revertMintRewards/initiateETHWithdrawalsFromLido/claimWithdrawalsFromLido/transferETH/burnarerestrictedto their matching roles.
Not submitted. Remaining listed Puffer Timelock is OZ-style delay, not a user money path.
2026-09-03: Pareto Credit leftover strategy leftover (19e7cde)
Immunefi program
Pareto Credit ($50,000,
kyc: false). IdleCDO /
CreditVault / Tranche /
epoch request-claim is
already logged. This
slice is the
IdleCreditVault strategy
receipt and APR=0
accounting. Official
clone /tmp/idle-tranches
at 19e7cde. No mainnet
interaction.
Files:
contracts/strategies/idle/IdleCreditVault.sol.
Checked for: a stranger
requestWithdraw /
claimWithdrawRequest
that pays another user's
receipt; instant claim
without a request;
mintStrategyTokens
without being the CDO.
Result: no user-exploitable finding. Not submitted.
deposit/mintStrategyTokens/requestWithdraw/claimWithdrawRequest/ instant request-claim /collect*Funds/prepareStopEpochWithApr0are_onlyIdleCDO.requestWithdrawburns principal from the CDO and mints a receipt to_user. Claim waits one epoch (unlessepochEndDate == 0), settles APR=0, burns that user's receipt, andsafeTransfers underlyings to_user.- Instant claim burns that user's receipt and pays that user. Collect pulls from the CDO only.
_transferis blocked unless the CDO orcanTransferafter default (manager).setApris CDO or manager.transferToken/setWhitelistedCDOare owner.redeem/redeemUnderlying/redeemRewardsare unused no-ops.
Do not file owner rescue, manager APR, CDO-only mint, address- bound receipts, unused redeem stubs, or APR=0 stopEpoch revert when APR is later set as theft.
Not submitted. Listed leftover is the IdleCreditVault strategy slice. Remaining listed: other epoch admin, proxy implementations not independently Sourcify-fetched, and other docs addresses.
2026-09-03: Pareto Credit leftover epoch admin leftover (19e7cde)
Immunefi program
Pareto Credit ($50,000,
kyc: false). IdleCDO
request-claim and
IdleCreditVault strategy
are already logged. This
slice is epoch start /
stop / instant-fund
pull and mid-epoch
deposit. Official clone
/tmp/idle-tranches at
19e7cde. No mainnet
interaction.
Files:
contracts/IdleCDOEpochVariant.sol.
Checked for: a stranger
startEpoch /
stopEpoch /
getInstantWithdrawFunds
that drains borrower
funds to the caller;
depositDuringEpoch
that mints without
pulling the caller;
sendFundsToBorrower /
getFundsFromBorrower
without being this
contract.
Result: no user-exploitable finding. Not submitted.
setEpochParams/setInstantWithdrawParams/startEpoch/stopEpoch/getInstantWithdrawFundsare owner or strategy manager. Epoch duration 0 is reserved for pool close.startEpochskims donations, pauses deposits, funds instant receipts on the strategy, then sends surplus to the borrower viasendFundsToBorrower(only self). Failed borrower transfer defaults.stopEpochpulls interest + pending withdraws from the borrower viagetFundsFromBorrower(only self),collectWithdrawFundsto the strategy, then accrues. Catch path defaults._interest == 1closes the pool.stopEpochWithDurationburns_lossAmountonly after pending receipts are funded (documented).depositDuringEpochpullsmsg.sender, mints that sender at a time-weighted price, mints strategy tokens to the CDO, and sends underlyings to the borrower. Disabled for programmable / AYS / first-tranche supply 0.restoreOperationsis owner and reverts ifdefaulted.
Do not file owner /
manager epoch control,
borrower default pause,
minted-interest NAV
fronting, Keyring
allowlist, or pending
receipts not haircut by
_lossAmount as theft.
Not submitted. Listed leftover is the epoch start / stop / mid-epoch deposit slice. Remaining listed: IdleCDOEpochQueue / Prefunded and L2 variants, proxy implementations not independently Sourcify-fetched, and other docs addresses.
2026-09-03: Pareto Credit leftover queue leftover (19e7cde)
Immunefi program
Pareto Credit ($50,000,
kyc: false). IdleCDO
request-claim, strategy,
and epoch admin leftovers
are already logged. This
slice is the buffer-period
queue and prefunded
variant. Official clone
/tmp/idle-tranches at
19e7cde. No mainnet
interaction.
Files:
contracts/IdleCDOEpochQueue.sol,
contracts/IdleCDOEpochVariantPrefunded.sol.
Checked for: a stranger
claimDepositRequest /
claimWithdrawRequest
that pays another user's
queue slot; deleteRequest
after funds already went
to the borrower;
processPrefundedDeposits
without being the CDO.
Result: no user-exploitable finding. Not submitted.
requestDeposit/requestWithdrawpull frommsg.senderand credit that sender's next-epoch slot.deleteRequest/deleteWithdrawRequestrefund that sender only if the epoch is not yet priced (and not already prefunded).processDeposits/processDepositsToBorrower/processWithdrawRequests/processWithdrawalClaimsare owner or strategy manager. Prefunded settlement is CDO-only and AA-only.claimDepositRequest/claimWithdrawRequestpaymsg.senderat the saved epoch price. APR=0 claim rebase updates that price from realized cash.- Prefunded
setEpochQueueis owner or manager.depositDuringEpochis disabled. Stop mints AA to the queue for already- prefunded cash.
Do not file owner /
manager process, Keyring
allowlist, prefund lock
after processDepositsToBorrower,
or queue rounding dust as
theft.
Not submitted.
Listed leftover that a
public tree would open
is exhausted (L2 epoch
variants only set
feeReceiver). Remaining
listed: proxy
implementations not
independently
Sourcify-fetched, and
other docs addresses.
2026-09-03: Mars Ecosystem leftover timelock leftover (Sourcify)
Immunefi program
Mars Ecosystem
($10,000, kyc: false).
Core / factory / router /
farm leftover is already
logged. Remaining listed
0xC35a8BdBB93abFAb362aF6dC3383cD2c6aEA6cBc
was a prior checksum typo
(A03dB); Sourcify
exact_match Timelock
on BSC. Extract
/tmp/mars-timelock. No
mainnet interaction.
Files:
contracts/dao/Timelock.sol
(Compound fork).
Checked for: a stranger
queueTransaction /
executeTransaction
without being admin;
setDelay /
setPendingAdmin
without a self-call.
Result: no user-exploitable finding. Not submitted.
queueTransaction/cancelTransaction/executeTransactionrequireadmin. Execute also requires a queued hash,etadelay, and 14-day grace.setDelay/setPendingAdminmust come from the timelock itself.acceptAdminispendingAdmin.receivecan hold BNB. No user deposit or redeem path.
Do not file admin queue / execute or Compound-style delay as theft.
Not submitted.
Listed leftover is the
BSC Timelock. Remaining
listed:
0x7859B01BbF675d67Da8cD128a50D155cd881B576
Sourcify 404. Other
listed VestingMaster /
LiquidityMiningMaster
rows are the same
bytecode already
logged.
2026-09-03: SushiSwap leftover RedSnwapper leftover (Sourcify)
Immunefi program
SushiSwap ($200,000,
kyc: false). Unique
no-KYC listed slice.
Listed assets are docs
deployment pages.
Docs name Ethereum
RedSnwapper
0xAC4c6e212A361c968F1725b4d055b47E63F80b75.
Sourcify exact_match
on Ethereum and the
same address on Arb /
OP / Base / Polygon /
BSC. Extract
/tmp/sushi-redsnwapper.
No mainnet interaction.
Files:
contracts/RedSnwapper.sol
(includes SafeExecutor).
Checked for: a stranger
snwap /
snwapMultiple that
transferFroms another
user; leftover-token
sweep of someone else's
balance; SafeExecutor
calling with this
contract's token
allowance.
Result: no user-exploitable finding. Not submitted.
snwap/snwapMultiplepull ERC20 only frommsg.sender(or this contract's leftover minus 1 whenamountIn == 0). Native skips the pull and forwardsmsg.value.- Output check is the
recipient's balance
delta versus
amountOutMin. Executor is caller-chosen. SafeExecutorhas no token approvals. Tokens are sent to the executor, not held here.
Do not file leftover
dust sweep (balance-1),
user-chosen executor
theft of the caller's
own tokens, or public
SafeExecutor leftover
ETH as theft.
Not submitted. Listed leftover is the Sourcify-open RedSnwapper. Remaining listed: CPAMM and CLAMM docs deployments.
2026-09-03: SushiSwap leftover CPAMM / CLAMM leftover (Sourcify)
Immunefi program
SushiSwap ($200,000,
kyc: false). RedSnwapper
is already logged. Docs
CPAMM / CLAMM deployments
resolve via sushi@7.3.1
to Ethereum
UniswapV2Factory
0xC0AEe4…f2Ac
(exact_match),
UniswapV2Router02
0xd9e1cE…8B9F
(match),
UniswapV3Factory
0xbACEB8…29C4F
(match), and
NonfungiblePositionManager
0x2214A4…A432
(match). Extract
/tmp/sushi-v2factory,
/tmp/sushi-v2router,
/tmp/sushi-v3factory,
/tmp/sushi-v3npm. No
mainnet interaction.
Files:
UniswapV2Factory /
UniswapV2Pair,
UniswapV2Router02,
UniswapV3Factory,
NonfungiblePositionManager
/ LiquidityManagement.
Checked for: a stranger
router transferFrom of
another user's tokens;
pair mint that credits
the caller without
deposits; NPM collect
without NFT
authorization.
Result: no user-exploitable finding. Not submitted.
- Router add / remove /
swap pull from
msg.sender(ormsg.valuefor ETH), enforce deadline andamountMin/amountOutMin, and mint or payto. - Pair first mint locks
MINIMUM_LIQUIDITYunlessmsg.senderis the factory migrator (feeToSetter). Burn paystofor LP sitting on the pair. Swap keeps K after 0.3% fee. - V3 factory
createPoolis permissionless.setOwner/enableFeeAmountare owner. - NPM mint callback
pays the recorded
payer through a
factory-verified
pool. Decrease /
collect / burn require
isAuthorizedForToken.
Do not file first-
depositor
MINIMUM_LIQUIDITY,
feeToSetter migrator /
feeTo, public skim of
surplus, owner V3 fee
tiers, or Uniswap-style
slippage as theft.
Not submitted. Listed leftover is the Sourcify-open Ethereum CPAMM factory / pair / router and CLAMM factory / NPM. Remaining listed: V3 TickLens / Quoter / PositionHelper (view / helper) and same-bytecode other-chain factories.
2026-09-03: Aster leftover (Sourcify)
Immunefi program
Aster ($200,000,
kyc: false). Unique
no-KYC listed BSC slice.
Sourcify exact_match
asBTC / USDF /
asUSDF / AsBNB and
match ERC1967 proxies
whose implementations
are Earn,
WithdrawVault,
USDFEarn,
asUSDFEarn, and
RewardDispatcher.
Extract /tmp/aster.
No mainnet interaction.
Files:
contracts/oft/asBTC.sol,
contracts/oft/USDF.sol,
contracts/oft/asUSDF.sol,
src/AsBNB.sol,
contracts/Earn.sol,
contracts/USDFEarn.sol,
contracts/asUSDFEarn.sol,
contracts/WithdrawVault.sol,
contracts/RewardDispatcher.sol,
contracts/Withdrawable.sol.
Checked for: a stranger
deposit that mints to
the caller without
pulling that caller;
claimWithdraw of
another user's request;
role-less mint /
burn on asBTC / USDF /
asUSDF / AsBNB.
Result: no user-exploitable finding. Not submitted.
- Earn
deposit/depositNativepullmsg.sender(ormsg.value) and mint ass tokens to that sender. Request locks that sender's ass tokens. Claim requiresreceipt == msg.sender. - USDFEarn /
asUSDFEarn pull
msg.senderand mint to that sender.WithdrawablerequesttransferFroms the caller; claim pays that receipt via the vault. - Token
mint/burnareMINTER_AND_BURN_ROLEor AsBNBonlyMinter. Vaulttransfer/transferNativeareTRANSFER_ROLE. Exchange-rate upload and Ceffu sweep areBOT_ROLE.
Do not file minter /
bot / admin privilege,
custodial Ceffu sweep,
first-deposit
exchangePrice 1e18, or
signed rate updates as
theft.
Not submitted. Listed leftover that Sourcify opens is exhausted. Remaining listed: the website.
2026-09-03: Gamma leftover (Sourcify)
Immunefi program
Gamma ($50,000,
kyc: false). Unique
no-KYC listed Ethereum
slice (not GammaSwap).
Sourcify exact_match
xGamma
0x26805021988F1a45dC708B5FB75Fc75F21747D8c
and match
Hypervisor
0xa8076ae31e4b6c64d07b1ed27889924a962a70d3
UniProxy0x83de646a7125ac04950fea7e322481d4be66c71d. Extract/tmp/gamma. No mainnet interaction.
Files:
xGamma/xGamma.sol,
Hypervisor/Hypervisor.sol,
UniProxy/UniProxy.sol.
Checked for: a stranger
deposit that pulls a
third party or mints
without a matching pull;
withdraw that burns
another user's shares;
enter / leave that
pays a caller other than
the staker.
Result: no user-exploitable finding. Not submitted.
- Hypervisor
depositrequiresmsg.sender == whitelistedAddress(UniProxy). IttransferFroms the namedfromafter that gate. First mint sizes shares from the deposit and the live tick price with noMINIMUM_LIQUIDITYlock. - Hypervisor
withdrawrequiresfrom == msg.senderand burns that sender after sending the proportional Uniswap collect plus unused balances toto. Rebalance / compound /pullLiquidity/ whitelist / fee are owner. - UniProxy
deposittransferFromsmsg.senderon version < 3, then calls Hypervisor withfrom= proxy ormsg.sender. Version ≥ 2 mints shares tomsg.sender(thetoargument is unused).addPositioninfinite-approves the hypervisor; owner only. - xGamma
entermints tomsg.senderthentransferFroms that sender.leaveburnsmsg.senderand pays that sender. SushiBar first-deposit / donation inflation applies.
Do not file first-
depositor share
inflation, owner
rebalance / whitelist /
fee, UniProxy ignoring
to on version ≥ 2, or
xGamma donation
inflation as theft.
Not submitted. Listed leftover that Sourcify opens is exhausted (all three listed addresses).
2026-09-03: SPOT leftover (Sourcify)
Immunefi program
SPOT ($10,000,
kyc: false). Unique
no-KYC listed Ethereum
slice. Sourcify
exact_match
TransparentUpgradeableProxy
0xC1f33e0cf7e40a67375007104B929E49a581bafE
→ impl PerpetualTranche
0x62cbE9F24413485f04FA62F9548C7855ec4a5425
(exact_match) and
BondIssuer
0x2E2E49eDCd5ce08677Bab6d791C863f1361B52F2;
match RouterV1
0x38f600e08540178719BF656e6B43FC15A529c393
BondFactory0x2b135C839d61808E1eC6F84151CD9429B0920374. Extract/tmp/spot. No mainnet interaction.
Files:
token_impl/contracts/PerpetualTranche.sol,
router/contracts/RouterV1.sol,
factory/contracts/BondFactory.sol,
factory/contracts/BondController.sol,
issuer/contracts/BondIssuer.sol.
Checked for: a stranger
deposit that mints
perp or tranche tokens
without pulling that
caller; redeem that
pays a caller other
than the burner;
router helpers that
pull a third party.
Result: no user-exploitable finding. Not submitted.
- PerpetualTranche
depositpullsmsg.senderinto the reserve and mints perp to that sender.redeemburnsmsg.sender(fee stays viatransferfrom that sender) and pays reserve tokens to that sender.rollover/claimFees/payProtocolFee/rebalanceToVaultareonlyVault. - RouterV1
trancheAndDeposit/trancheAndRollovertransferFrommsg.senderand return leftover collateral / fee / unused tranches / minted perp to that sender. The listed Router still callsperp.rollover, which isonlyVaulton the listed PerpetualTranche impl (reverts). - BondController
depositpullsmsg.senderand mints tranches to that sender.redeem/redeemMatureburn or redeemmsg.senderand pay that sender. First deposit requiresMINIMUM_FIRST_DEPOSIT. - BondIssuer
issueis a timed factory poke. BondFactorycreateBondclones a new controller.
Do not file first- deposit minimum, owner fee / mature, vault-only rollover or debasement mint, keeper pause / mint caps, or leftover tokens sitting on the router as theft.
Not submitted. Listed leftover that Sourcify opens is exhausted. Remaining listed: the website.
2026-09-03: DeGate leftover (Sourcify)
Immunefi program
boosteddegatebugbounty
($400,000, kyc: false).
Unique no-KYC listed
Ethereum slice. Sourcify
exact_match Compound
Timelock
0xf2991507952d9594E71A44A54fb19f3109D213A5
+
0x0D2eC0a5858730E7D49f5B4aE6f2C665e46c1d9d
and match
OwnedUpgradabilityProxy
deposit
0x54D7aE423Edb07282645e740C046B9373970a168
→ impl
DefaultDepositContract
0x8CCc06C4C3B2b06616EeE1B62F558f5b9C08f973
- exchange
0x9C07A72177c5A05410cA338823e790876E79D73B→ implExchangeV30xc56C1dfE64D21A345E3A3C715FFcA1c6450b964b MultiSigWallet0x2028834B2c0A36A918c10937EeA71BE4f932da52. Extract/tmp/degate. No mainnet interaction.
Files:
tl_dep/contracts/TimelockCompound.sol,
gnosis/MultiSigWallet.sol,
dep_impl/contracts/core/impl/DefaultDepositContract.sol,
ex_impl/contracts/core/impl/ExchangeV3.sol,
ex_impl/contracts/core/impl/libexchange/ExchangeDeposits.sol,
ex_impl/contracts/core/impl/libexchange/ExchangeWithdrawals.sol.
Checked for: a stranger
deposit that credits
another account or pulls
a third party without
agent rights; on-chain
withdrawals that pay the
caller instead of the
owner; unguarded
onchainTransferFrom.
Result: no user-exploitable finding. Not submitted.
- ExchangeV3
depositisonlyFromUserOrAgent(from)and the library requiresfrom == to. The deposit contracttransferFroms thatfromand creditspendingDeposits[to]. forceWithdraw/setWithdrawalRecipient/onchainTransferFrom/approveTransactionuse the same gate. BatchapproveTransactionsrequires the caller is an agent of every listed owner.withdrawFromMerkleTree/withdrawFromDepositRequest/withdrawFromApprovedWithdrawalsare permissionless helpers that pay the account owner, not the caller.- Deposit-contract
deposit/withdraw/transferareonlyExchange. - Timelock queue /
cancel / execute are
admin;
setDelay/setPendingAdminare self-only. Multisig confirm is owner- gated.
Do not file
permissionless owner-
paying withdraw
helpers, registered-
agent deposits, owner
submitBlocks / fee
sweep, or timelock /
multisig admin as
theft.
Not submitted. Listed leftover that Sourcify opens is exhausted (all five listed addresses plus the two proxy impls).
2026-09-03: boost-lido leftover (Sourcify)
Immunefi program
boost-lido ($100,000,
kyc: false). Unique
no-KYC listed Ethereum
slice (Mellow DVV /
DVstETH). Sourcify
exact_match vault
proxy
0x5E362eb2c0706Bd1d134689eC75176018385430B
→ impl DVV
0x0000007563180c9066693110667e2232962d93a1
plus listed
VaultConfigurator /
ERC20TvlModule /
StakingModule /
oracles / Initializer /
SimpleDVTStakingStrategy
/ ManagedValidator.
Extract /tmp/boost-lido.
No mainnet interaction.
Files:
DVV_000000/src/vaults/DVV.sol,
DVV_000000/src/vaults/ERC4626Vault.sol,
DVV_000000/src/vaults/MellowVaultCompat.sol,
Initializer_969A0c/src/Vault.sol,
StakingModule_D570E1/src/modules/obol/StakingModule.sol,
SimpleDVTStakingStrategy_078b1C/src/strategies/SimpleDVTStakingStrategy.sol,
ManagedValidator_A1b3a3/src/validators/ManagedValidator.sol.
Checked for: a stranger
ERC-4626 deposit that
mints without pulling
the caller; withdraw /
redeem that burns
another owner without
allowance; Mellow
registerWithdrawal
that locks another
user's LP.
Result: no user-exploitable finding. Not submitted.
- DVV ERC-4626
deposit/mintpullmsg.senderand mint toreceiver.withdraw/redeemburnowner(caller or approved) and payreceiver. Pause / whitelist / limit only shrinkmaxDeposit. DVV.submitis a permissionless poke that wraps vault WETH into wstETH.migrate/migrateApprovalare public storage-slot pokes.- Bundled Mellow
Vault.depositpullsmsg.senderand mints LP toto.registerWithdrawallocks that sender's LP.processWithdrawalsis operator and paysrequest.to. - StakingModule
convert/convertAndDepositareonlyDelegateCall. StrategyprocessWithdrawalsis operator.convertAndDepositstill goes throughvault.delegateCall(operator + validator on the Mellow vault).
Do not file
permissionless
submit / migrate,
operator withdrawal
processing, admin
pause / whitelist, or
ERC-4626 first-deposit
inflation as theft.
Not submitted. Listed leftover that Sourcify opens is exhausted (all twelve listed addresses plus the DVV impl).
2026-09-03: alchemix-boost leftover (f100743)
Immunefi program
alchemix-boost
($125,000, kyc: false).
Unique no-KYC listed
alchemix-v2-dao slice
(not the already-logged
Alchemix V3 tree). Public
raw sources from
alchemix-finance/alchemix-v2-dao
f100743. Extract
/tmp/alchemix-boost.
No mainnet interaction.
Files:
RevenueHandler.sol,
RewardsDistributor.sol,
VotingEscrow.sol,
Minter.sol,
Voter.sol,
RewardPoolManager.sol,
FluxToken.sol,
BaseGauge.sol,
Bribe.sol,
CurveMetaPoolAdapter.sol,
CurveEthPoolAdapter.sol,
AlchemixGovernor.sol.
Checked for: a stranger
claim that pays the
caller instead of the
veNFT owner; withdraw
that unlocks another
tokenId; unguarded
mint on Flux / ALCX.
Result: no user-exploitable finding. Not submitted.
- RevenueHandler /
RewardsDistributor /
FluxToken claims
require
isApprovedOrOwnerand pay the veNFT owner (or a recipient the owner chose). - VotingEscrow
createLock/depositForpullmsg.senderBPT.withdrawis owner- or-approved and transfers BPT toownerOf. - RewardPoolManager
deposit / withdraw
are
veALCX-only. VoternotifyRewardAmountis minter-only. BribegetRewardForOwneris voter-only and paysownerOf. - Minter
updatePeriodis voter-only. FluxmintisonlyMinter. Curve adaptersmelttomsg.sender(the RevenueHandler after it moved tokens in).
Do not file
permissionless
checkpoint / donate-
to-lock, leftover
adapter dust melt,
admin treasury
routing, or veNFT
approval letting the
approved address
claim as theft.
Not submitted. Listed leftover that a public tree would open is exhausted. Remaining listed: the website.
2026-09-03: GMX leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false). Unique
no-KYC listed slice
(not GMTrade / Mux
GmxV2 leftovers).
Sourcify Arbitrum
match Vault
0x489ee077994B6658eAfA855C308275EAd8097C4A
Router0xaBBc5F99639c9B6bCb58544ddf04EFA6802F4064GlpManager0x321F653eED006AD1C29D174e17d96351BDe22649GLP/GMX, andexact_matchRewardRouterV20x5E4766F932ce00aA4a1A82d3Da85adf15C5694A1. Extract/tmp/gmx. No mainnet interaction.
Files:
vault/Vault.sol,
router/Router.sol,
glpManager/GlpManager.sol,
rewardRouter/contracts/staking/RewardRouterV2.sol,
glp/GLP.sol,
gmx/GMX.sol.
Checked for: a stranger
increasePosition /
decreasePosition on
another account;
Router pluginTransfer
without that user's
plugin approval;
addLiquidityForAccount
without handler;
RewardRouter redeem
that unstakes another
account.
Result: no user-exploitable finding. Not submitted.
- Vault
increasePosition/decreasePositionrequire the caller is the account, the configured router, or anapprovedRoutersentry for that account.buyUSDG/sellUSDGare manager-only._transferIncredits the balance delta. - Router swaps and
directPoolDepositpull_sender(). Position open/close pass_sender()as the account.pluginTransfer/ plugin position calls require the plugin is gov-listed and the user calledapprovePlugin. - GlpManager public
add/remove use
msg.sender.*ForAccountis handler-only. - RewardRouter stake /
mint-and-stake /
unstake-and-redeem /
claim bind to
msg.sender. GLP / GMXmintisonlyMinter.
Do not file manager
buyUSDG, gov mint,
user-approved plugin
pulls, permissionless
liquidation, or
handler-only GLP
account mint as theft.
Not submitted. Remaining listed: Avalanche V1 twins, reward trackers / vesters / distributors, and the listed GMX V2 ExchangeRouter / DepositVault / DataStore / Oracle rows (Arb + Avax).
2026-09-03: GMX leftover V2 ExchangeRouter leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false). Sourcify
Arbitrum match
ExchangeRouter
0x674Ee2FFe588c4b1Fde6D5481c55Ef6133004cbA
and exact_match
DepositVault
0xF89e77e8Dc11691C9e8757e84aaFbCD8A67d7A55
DataStore0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8. Extract/tmp/gmx-v2. No mainnet interaction.
Files:
exRouter/contracts/router/ExchangeRouter.sol,
exRouter/contracts/router/BaseRouter.sol,
exRouter/contracts/router/Router.sol,
exRouter/contracts/deposit/DepositUtils.sol,
depositVault/contracts/bank/Bank.sol,
depositVault/contracts/bank/StrictBank.sol.
Checked for: a stranger
createDeposit that
credits another
account's vault
transfer-in;
cancelDeposit that
refunds the caller
instead of the
depositor;
unguarded
pluginTransfer.
Result: no user-exploitable finding. Not submitted.
- ExchangeRouter
createDeposit/createWithdrawal/createOrder/executeAtomicWithdrawalpassaccount = msg.sender.cancelDeposit/cancelWithdrawalrequireaccount == msg.sender. sendTokenspullsmsg.senderthroughRouter.pluginTransfer(onlyRouterPlugin).- DepositUtils records
vault balance deltas
into a deposit owned
by that account.
Cancel refunds
deposit.account(). - DepositVault
transferOut/recordTransferInareonlyController.
Do not file keeper execute / cancel of an aged request, controller vault sweeps, or leftover tokens sent to the vault without a matching create as theft.
Not submitted. Remaining listed: Avalanche V1/V2 twins, V1 trackers / vesters, and V2 Oracle / Reader / GlvReader rows.
2026-09-03: zerolend-boost leftover (60d255a)
Immunefi program
zerolend-boost
($200,000, kyc: false). Ended 2024-03-14
audit competition
(Audit Comp | ZeroLend);
logged so the custom
governance tree is not
re-opened. Public
zerolend/governance at
60d255aca56f46fe9b26f012eee683e1aede2b33.
Extract /tmp/zerolend-gov.
Sourcify 404 on zkSync
chain 324 for sample Pool
impl / proxy. No mainnet
interaction.
Files:
contracts/ZeroLend.sol,
contracts/locker/BaseLocker.sol,
contracts/locker/staking/OmnichainStakingBase.sol,
OmnichainStakingToken.sol,
OmnichainStakingLP.sol,
contracts/vesting/VestedZeroNFT.sol,
contracts/vesting/StakingBonus.sol,
contracts/airdrop/AirdropRewarder.sol,
contracts/voter/PoolVoter.sol,
contracts/zaps/ZapLockerLP.sol,
contracts/emissions/EmissionsMainnet.sol.
Checked for: a stranger
unstakeToken /
unstakeAndWithdraw that
sends another staker's
NFT or underlying to the
caller; locker
withdraw that pays a
non-owner; vest claim
that pays the caller;
airdrop claim that
pays the prover.
Result: no user-exploitable finding. Not submitted.
_unstakeTokenrevertsInvalidUnstakerunlessmsg.sender == lockedByToken[tokenId].unstakeTokenthen transfers the NFT to that sender.unstakeAndWithdrawwithdraws the locker NFT (staking is owner) and payslocked.amounttomsg.sender.- BaseLocker
increaseAmount/increaseUnlockTime/withdraw(uint256)require owner or approved.withdrawpaysmsg.sender.withdraw(address)still requires authorization on each token.depositForcan donate into an existing lock. - VestedZeroNFT
mintpullsmsg.senderand mints to_who.claim(uint256)paysownerOf(id).claimUnvestedisstakingBonus-only. - AirdropRewarder
claimpays / locks the merkle-proven_user. - PoolVoter
votebinds tomsg.sender.resetis self orvotingPowerCombined. - ZeroLend
mintisMINTER_ROLE. Emissionsexecuteis owner.
Do not file
permissionless vest /
airdrop poke that
pays the owner, lock
donations, public
ZapLockerLP.sweep
dust, owner
emissions / bonus
BPS, or Aave-fork
first-depositor
inflation on the
listed zkSync / Manta
markets.
Not submitted.
Listed leftover that
a public tree would
open is exhausted
(ended audit-comp
governance repo).
Remaining listed:
zkSync / Manta
Aave-fork addresses
(Sourcify 404 last
check). Do not take
remaining
zerolend-boost
Aave-fork rows.
2026-09-03: GMX leftover V1 RewardTracker leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false). Sourcify
Arbitrum exact_match
RewardTracker
0x4d268a7d4C16ceB5a606c173Bd974984343fea13
+
0x0755D33e45eD2B874c9ebF5B279023c8Bd1e5E93
+
0xd2D1162512F927a7e282Ef43a362659E4F2a728F
+
0x4e971a87900b931fF39d1Aad67697F49835400b6
RewardDistributor0x5C04a12EB54A093c396f61355c6dA0B15890150dVester0x199070DDfd1CFb69173aa2F7e20906F26B363004, andmatchRewardTracker0x908C4D94D34924765f1eDc22A1DD098397c59dD4
0x1aDDD80E6039594eE970E5872D247bf0414C8903
RewardDistributor0x23208B91A98c7C1CD9FE63085BFf68311494F193BonusDistributor0x03F349b3CC4f200D7FAE4d8DdaF1507f5A40D356EsGMX0xf42Ae1D54fd613C9bb14810b0588FaAa09a426cA. Extract/tmp/gmx-trackers. No mainnet interaction.
Files:
bonus-tracker/contracts/staking/RewardTracker.sol,
fee-glp-dist/contracts/staking/RewardDistributor.sol,
gmx-vester/contracts/staking/Vester.sol,
bonus-dist/BonusDistributor.sol,
esgmx/EsGMX.sol,
staked-gmx-tracker/RewardTracker.sol.
Checked for: a stranger
unstake /
unstakeForAccount
that sends another
account's deposit
tokens to the caller;
claim /
claimForAccount
that pays the caller
another account's
rewards; Vester
withdraw that
releases another
account's esGMX;
distributor
distribute that
anyone can drain.
Result: no user-exploitable finding. Not submitted.
- RewardTracker
stake/unstakebind funding and receiver tomsg.sender.stakeForAccount/unstakeForAccount/claimForAccountrequireisHandler. Publicclaimpays a named receiver frommsg.sender'sclaimableReward. - RewardDistributor
and
BonusDistributor
distributerequiremsg.sender == rewardTracker. - Vester
depositpullsesToken(and pair token) from_account. Publicdeposit/claim/withdrawusemsg.sender.depositForAccount/claimForAccount/transferStakeValuesare handler-only. - EsGMX
mint/burnareonlyMinter.claimasks each yield tracker formsg.sender.
Do not file gov
withdrawToken,
handler-only
ForAccount pulls,
private staking /
claiming mode,
or admin
recoverClaim.
Not submitted. Remaining listed: Avalanche V1 twins (same RewardTracker / Vester / distributor types), Sourcify-404 Glp Vester + Staked Glp Distributor, and V2 Oracle / Reader / GlvReader rows. Do not re-review same-bytecode Avax twins.
2026-09-03: deBridge leftover (Sourcify)
Immunefi program
debridge ($200,000,
kyc: false). Unique
unused standing
program. Not previously
logged. Ethereum
Sourcify exact_match
DeBridgeGate
0x24455aa55DED7728783c9474bE8eA2f5C935f8EB
DeBridgeToken0xf8A2902c0a5f817F5e22C82f453538d3f0734C2bSignatureVerifier0xfE7De3c1e1BD252C67667B56347cABFC6df08dF4CallProxy0xBd3d657AE87671eC6f8D6272A9f431a7c4a9B6f8SimpleFeeProxy0x37a52ddb753c924f8C914de65ef00b5210Caa83CandmatchDeBridgeTokenDeployer0x4c7CA8fcFFE77281A8B81D4580CFf8257d785491WethGate0xFCf83648b8cDeF62e5d03319a6f1FCE16e4D6A59. Gate / token / sig / call proxies areTransparentUpgradeableProxy. Extract/tmp/debridge. No mainnet interaction.
Files:
gate/contracts/transfers/DeBridgeGate.sol,
sig/contracts/transfers/SignatureVerifier.sol,
callproxy/contracts/periphery/CallProxy.sol,
token/contracts/periphery/DeBridgeToken.sol,
deployer/contracts/transfers/DeBridgeTokenDeployer.sol,
fee/contracts/periphery/SimpleFeeProxy.sol,
wethgate/contracts/transfers/WethGate.sol.
Checked for: a stranger
send that locks
another account's
tokens; claim that
mints / pays the
caller instead of the
signed receiver;
flash that skips
the fee; CallProxy
call from a
non-gate; unguarded
WethGate.withdraw
of gate WETH.
Result: no user-exploitable finding. Not submitted.
_sendpullsmsg.sender/msg.valueand burns wrapped deTokens from the gate.claimbuildssubmissionIdfrom the signed receiver / amount / auto-params, marks it used, then_checkConfirmationsvia SignatureVerifier (onlyDeBridgeGate, oracle threshold). Tokens mint or transfer to_receiveror CallProxy.executionFeepays the claimer.flashrequires the fee repaid before return.- CallProxy
call/callERC20areonlyGateRole.multiSendis self-only. - DeBridgeToken
mintisonlyMinter.burnburnsmsg.sender. - TokenDeployer
deployAssetisonlyDeBridgeGate. - SimpleFeeProxy
fee withdraws pay
treasury.
Do not file
permissionless claim
of a signed
submission to that
receiver, keeper
executionFee,
public fee sweep to
treasury, donated
WETH on WethGate,
or admin oracle /
threshold.
Not submitted. Listed leftover that Sourcify opens on Ethereum is exhausted. Remaining listed: other-chain Gate / Token / Verifier / CallProxy / FeeProxy twins (same types).
2026-09-03: ENS leftover (Sourcify)
Immunefi program
ens ($250,000,
kyc: false). Unique
unused standing
program. Not previously
logged. Listed
smart-contract asset is
the deployments wiki;
Ethereum Sourcify
exact_match
ETHRegistrarController
0x253553366Da8546fC250F225fe3d25d0C782303b
NameWrapper0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401PublicResolver0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63andmatchBaseRegistrarImplementation0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85ENSRegistryWithFallback0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e. BulkRenewal Sourcify
- Extract
/tmp/ens. No mainnet interaction.
Files:
controller/contracts/ethregistrar/ETHRegistrarController.sol,
controller/contracts/ethregistrar/BaseRegistrarImplementation.sol,
namewrapper/contracts/wrapper/NameWrapper.sol,
registrar/BaseRegistrarImplementation.sol,
registry/ENSRegistryWithFallback.sol,
resolver/contracts/resolvers/PublicResolver.sol.
Checked for: a stranger
register that
assigns a name
without paying;
withdraw that
sends registrar ETH
to the caller;
wrapETH2LD /
unwrap that steals
another name;
registry
setOwner without
authorisation.
Result: no user-exploitable finding. Not submitted.
- Controller
registerrequiresmsg.valuecover rent + premium, consumes a commit-reveal, and wraps to the namedowner. Excess refundsmsg.sender.renewis permissionless (pays for that name).withdrawsends the balance toowner(). - BaseRegistrar
register/renewareonlyController.reclaimrequires approved or owner. - NameWrapper
wrapETH2LD/wraprequire registrar / registry owner or approved.unwrap*isonlyTokenOwner.registerAndWrapETH2LDisonlyController. - Registry
setOwner/setSubnodeOwnerareauthorised. - PublicResolver writes require node owner, operator, or delegate.
Do not file
permissionless
renew of someone
else's name, public
withdraw that
pays the owner,
commit-reveal
front-running of
an uncommitted
name, or owner
ERC20Recoverable.
Not submitted. Listed leftover that Sourcify opens is exhausted at the opened registrar / wrapper / registry / resolver level. Remaining listed: the deployments wiki (BulkRenewal Sourcify 404, DNSSEC / reverse rows) and website assets.
2026-09-03: GMX leftover V2 OrderHandler leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false). Sourcify
Arbitrum exact_match
OrderVault
0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5
WithdrawalVault0x0628D46b5D145f183AdB6Ef1f2c97eD1C4701C55DepositHandler0xfe2Df84627950A0fB98EaD49c69a1DE3F66867d6LiquidationHandler0xdAb9bA9e3a301CCb353f18B4C8542BA2149E4010andmatchOrderHandler0xe68CAAACdf6439628DFD2fe624847602991A31eBWithdrawalHandler0x64fbD82d9F987baF5A59401c64e823232182E8Ed. Extract/tmp/gmx-v2-orders. No mainnet interaction.
Files:
orderHandler/contracts/exchange/OrderHandler.sol,
orderHandler/contracts/order/OrderUtils.sol,
orderVault/contracts/order/OrderVault.sol,
orderVault/contracts/bank/Bank.sol,
depositHandler/contracts/exchange/DepositHandler.sol,
depositHandler/contracts/deposit/DepositUtils.sol,
withdrawalHandler/contracts/exchange/WithdrawalHandler.sol,
withdrawalHandler/contracts/withdrawal/WithdrawalUtils.sol,
liquidationHandler/contracts/exchange/LiquidationHandler.sol.
Checked for: a stranger
createOrder that
credits vault
transfer-in to
another account;
cancelOrder that
refunds the caller;
vault transferOut
without controller;
liquidation that
pays the keeper the
position.
Result: no user-exploitable finding. Not submitted.
- Order / Deposit /
Withdrawal
create*/cancel*areonlyController(ExchangeRouter already bindsaccount = msg.sender). OrderUtils.createOrderrecords vault transfer-in into that account's order.cancelOrderrefundscancellationReceiverororder.account().- Deposit /
Withdrawal cancel
refund
*.account(). - OrderVault /
WithdrawalVault
transferOutisonlyController. executeOrder/executeDeposit/executeWithdrawalareonlyOrderKeeper.executeLiquidationisonlyLiquidationKeeper.
Do not file keeper execute / cancel of an aged request, controller vault sweeps, leftover tokens sent to a vault without a matching create, or keeper execution-fee payment.
Not submitted. Remaining listed: GlvRouter / Handler / Vault, ShiftHandler / Vault, SubaccountRouter, ExternalHandler, FeeHandler, V1 Order Book / Timelock / StakedGlp / USDG, Avax twins, and V2 Oracle / Reader rows.
2026-09-03: GMX leftover V2 GlvRouter leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false). Sourcify
Arbitrum exact_match
GlvHandler
0x3f6dF0c3A7221BA1375E87e7097885a601B41Afc
GlvVault0x393053B58f9678C9c28c2cE941fF6cac49C3F8f9andmatchGlvRouter0xd59a808bCA24812C483C1B3bF0A0E8D7D5932E4cSubaccountRouter0xa329221a77BE08485f59310b873b14815c82E10D. Extract/tmp/gmx-glv. No mainnet interaction.
Files:
router/contracts/router/GlvRouter.sol,
handler/contracts/exchange/GlvHandler.sol,
handler/contracts/glv/glvDeposit/GlvDepositUtils.sol,
handler/contracts/glv/glvWithdrawal/GlvWithdrawalUtils.sol,
vault/contracts/glv/GlvVault.sol,
subaccount/contracts/router/SubaccountRouter.sol,
subaccount/contracts/subaccount/SubaccountUtils.sol.
Checked for: a stranger
createGlvDeposit
that credits vault
transfer-in to
another account;
cancelGlvDeposit
that refunds the
caller; a
subaccount
createOrder that
pulls a non-owner.
Result: no user-exploitable finding. Not submitted.
- GlvRouter
createGlvDeposit/createGlvWithdrawalsetaccount = msg.sender. Cancel requiresaccount == msg.sender. - GlvHandler
create / cancel
are
onlyController. Execute isonlyOrderKeeper. GlvDepositUtilsrecords vault transfer-in into that account's deposit. Cancel refundsglvDeposit.account().- GlvVault is
StrictBank
(
transferOutonlyController). - SubaccountRouter
createOrderrequiresvalidateSubaccountandreceiver == account.pluginTransferpulls the listed account.
Do not file
user-approved
subaccount pulls,
keeper execute /
cancel of an aged
GLV request, or
makeExternalCalls
of leftover tokens
the caller sent.
Not submitted. Remaining listed: ShiftHandler / Vault, ExternalHandler, FeeHandler, V1 Order Book / Timelock / StakedGlp / USDG, Avax twins, and V2 Oracle / Reader rows.
2026-09-03: GMX leftover V2 AdlHandler leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false).
Oracle + V1 Order
Book leftover
already logged.
This slice is the
listed remaining
AdlHandler /
AdlUtils /
GlpBalance /
Chainlink
providers /
ChainReader.
Arbitrum Sourcify
exact_match
AdlHandler
0x9242FbED25700e82aE26ae319BCf68E9C508451c
- GlpBalance
0x13E0BbE893B33b64D4f3F96725dd70531fA4EbCe - ChainlinkDataStreamProvider
0x83cBb05AA78014305194450c4AADAc887fe5DF7F - ChainlinkPriceFeedProvider
0x527FB0bCfF63C47761039bB386cFE181A92a4701 - ChainReader
0x9E6ac9e474Ce93040141391bf52fa74135490f50andmatchAdlUtils0x113Fc422d9D49b7371b7A164f62b839877DCbb93. Extract/tmp/gmx-adl. No mainnet interaction.
Files:
contracts/exchange/AdlHandler.sol,
contracts/adl/AdlUtils.sol,
contracts/staking/GlpBalance.sol,
contracts/oracle/ChainlinkDataStreamProvider.sol,
contracts/oracle/ChainlinkPriceFeedProvider.sol,
contracts/chain/ChainReader.sol.
Checked for: a
stranger
executeAdl that
closes another
account when ADL
is off; an ADL
order that pays
the keeper the
position; GlpBalance
transferFrom
without allowance;
a non-oracle
getOraclePrice
that writes
DataStore.
Result: no user-exploitable finding. Not submitted.
updateAdlState/executeAdlareonlyAdlKeeperand run underwithOraclePrices.validateAdlrequiresisAdlEnabledand oracle timestamps at leastlatestAdlAt.createAdlOrdersets account / receiver / cancellationReceiver to the position account. The decrease has no slippage by design.- After execute,
pending pnl /
pool must fall
and must not
undershoot
minPnlFactorAfterAdl. - GlpBalance
transfermovesmsg.sender.transferFromspends allowance thentransferFroms the staked GLP tracker after cooldown. - Data-stream
getOraclePriceisonlyOracleand verifies a Chainlink report for the stored feed id. Price-feed provider is view-only. - ChainReader only stores an Arbitrum block hash.
Do not file ADL-keeper reduction of a profitable position when ADL is enabled, the documented lack of profit-order sorting, GlpBalance wrapper transfer of own staked GLP, or oracle-only price verification as stranger theft.
Not submitted. Listed leftover that Sourcify opens for these types is exhausted. Remaining listed: Avax twins (same types — do not re-review unless a function differs), Sourcify-404 Staked Glp Distributor, same-type Reader / order utils already in opened compilations, and the websites.
2026-09-03: USDT0 leftover ETH adapter + Arb OFT (Sourcify)
Immunefi program
usdt0 ($6,000,000,
kyc: true).
Unique unused
standing program.
Not previously
logged. Ethereum
Sourcify
exact_match
TransparentUpgradeableProxy
0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee
impl
0xCD979B10A55FCdAC23ec785CE3066c6ef8a479A4
(OAdapterUpgradeable).
Arbitrum Sourcify
exact_match
proxy
0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92
impl
0x00678FDaAB0D5C91b843a22Fa38E08AF1bBDa85E
(OUpgradeable)
and proxy
0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9
impl
0x3263CD783823d04a6B9819517E0E6840d37cA3F4
(ArbitrumExtensionV2).
Extract /tmp/usdt0
/ /tmp/usdt0-oupg /
/tmp/usdt0-arb-ext.
No mainnet
interaction.
Files:
contracts/OAdapterUpgradeable.sol,
contracts/OUpgradeable.sol,
@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterUpgradeable.sol,
@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTCoreUpgradeable.sol,
@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppReceiverUpgradeable.sol,
contracts/Wrappers/ArbitrumExtension.sol,
contracts/Tether/TetherToken.sol.
Checked for: a
stranger send
that locks another
account's tokens;
lzReceive that
credits the
caller; Arb
mint / burn
by a non-OFT;
bridgeMint that
inflates supply.
Result: no user-exploitable finding. Not submitted.
- ETH
OAdapterUpgradeablesend_debitsmsg.senderviasafeTransferFrominto the adapter.lzReceiveis endpoint-only and requires a configured peer._creditpays the messageto. - Arb
OUpgradeablesendburnsmsg.senderon the inner token._creditmints to the messageto(zero address becomes0xdead). - Arb token
mint/burnareonlyAuthorizedSender(l2Gateway/ OFT). Owner sets the OFT viasetOFTContract.bridgeMintrevertsNotImplemented.bridgeBurnis a no-op behind the same sender check.
Do not file
LayerZero
peer-gated mint /
burn, OFT send
of the caller's
own tokens, owner
setOFTContract,
or the empty
authorized
bridgeBurn as
stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH / Arb OFT types is exhausted. Remaining listed: other-chain USDT0 twins (same OFT / adapter types — do not re-review unless a function differs) and the websites.
2026-09-03: Ondo Finance leftover TokenRouter + rOUSG (Sourcify)
Immunefi program
ondofinance
($1,000,000,
kyc: true).
Unique unused
standing program.
Not previously
logged. Ethereum
Sourcify match
OndoTokenRouter
0x99B8d1D1c17a10CD1A878d1A44c11fd7E4daD7bC
and exact_match
TokenProxy
0x54043c656F0FAd0652D9Ae2603cDF347c5578d00
impl
0x3f2A14eA8482b83c49f7e73D90D20611939C5135
(ROUSG).
Extract
/tmp/ondo-router
and /tmp/ondo-rousg.
No mainnet
interaction.
Files:
contracts/xManager/tokenRouter/OndoTokenRouter.sol,
contracts/ousg/rOUSG.sol.
Checked for: a
stranger
depositToken that
pulls another
account; withdraw
that pays the
caller a user's
RWA; wrap that
mints shares to
the caller for
someone else's
OUSG; unwrap
that burns another
account.
Result: no user-exploitable finding. Not submitted.
- TokenRouter
depositToken/withdrawTokenareonlyRole(RWA_MANAGER_ROLE). Deposit pullsmsg.senderand forwards to the configured recipient. Withdraw gathers from configured sources and paysmsg.sender(the manager). - Source / recipient / oracle / minimum-price setters are admin roles.
- rOUSG
wrapmints shares tomsg.senderthentransferFroms that sender's OUSG.unwrap/unwrapSharesburn the caller and pay that caller.transferFromspends allowance. burnSharesisBURNER_ROLEand sends residual OUSG to the burner.
Do not file manager-only router deposit/withdraw, admin burn of rOUSG shares, first-wrapper share rounding, or KYC-gated OUSG transfers as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that Sourcify
opens for these
two types is
exhausted.
Remaining listed:
other Ondo
oracles / tokens /
managers
(including
USDYOracleWrapper)
and other-chain
rows.
2026-09-03: Hyperlane leftover ETH Mailbox leftover (Sourcify)
Immunefi program
hyperlane
($2,500,000,
kyc: true).
Unique unused
standing program.
Not previously
logged. Ethereum
Sourcify match
Mailbox proxy
0xc005dc82818d67AF737725bD4bf75435d065D239
impl
0x7b4D881c122a5e61adCFfb56A2e3CE9927D53455
- InterchainGasPaymaster
0x1008FAbD07aBd93a7D9bB81803a89cC3a834E1A9(proxy0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611) - StorageGasOracle
0xc9a103990A8dB11b4f627bc5CD1D0c2685484Ec5 - MerkleTreeHook
0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA. Extract/tmp/hl-mailbox//tmp/hl-igp//tmp/hl-gasoracle//tmp/hl-hook. No mainnet interaction.
Files:
Mailbox.sol (flattened
contracts/Mailbox.sol),
InterchainGasPaymaster.sol
(contracts/hooks/igp/InterchainGasPaymaster.sol).
Checked for: a
stranger
dispatch that
binds another
sender; process
that delivers
without ISM
verify; IGP
claim that pays
the caller.
Result: no user-exploitable finding. Not submitted.
- Mailbox
dispatchbuilds the message withmsg.senderas sender and pays required + custom hooks frommsg.value. processis permissionless. It requires the destination domain, unused message id, andism.verify, thenhandles the recipient.- IGP
payForGasspendsmsg.valueand refunds the named address. Permissionlessclaimpays the configured beneficiary. Gas configs areonlyOwner.
Do not file
permissionless
process of an
ISM-verified
message, IGP
claim to the
beneficiary, or
owner gas-oracle
writes as
stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH mailbox / IGP types is exhausted. Remaining listed: other-chain mailbox twins, ISM factories, and warp routes.
2026-09-03: Ondo Finance leftover TokenManager leftover (Sourcify)
Immunefi program
ondofinance
($1,000,000,
kyc: true).
TokenRouter +
rOUSG leftover
already logged.
This slice is the
listed remaining
ETH manager /
oracle /
messenger types.
Sourcify match
BasicRecipient
0xE9b3c628103580702b465c052F67843CAC61fB35
- GMTokenManager
0x2c158BC456e027b2AfFCCadF1BDBD9f5fC4c5C8c - TokenManagerRegistrar
0xD2746617c58b72254785BDb483e04f311c858d5f - OndoRateLimiter
0x98Db502215Da1ad9F626D4a0090A8A2f4971003c - Inspector
0x0b34233a94c3433092009D8903080553039bB7a1 - USDYOracleWrapper
0x87b126e5518b6a1Bb8465779b4607C45C643DF90andexact_matchMessenger0xff2BABA46Df92919705E60120C477Ae5b7341Eb3. Extract/tmp/ondo-recipient//tmp/ondo-gmtm//tmp/ondo-messenger//tmp/ondo-registrar//tmp/ondo-inspector//tmp/ondo-usdyoracle//tmp/ondo-ratelimit. No mainnet interaction.
Files:
contracts/xManager/tokenManagers/tokenRecipients/BasicRecipient.sol,
contracts/globalMarkets/tokenManager/GMTokenManager.sol,
contracts/Messenger.sol,
contracts/globalMarkets/tokenFactory/registrars/TokenManagerRegistrar.sol,
contracts/Inspector.sol,
contracts/xManager/OndoOracle/USDYOracleWrapper.sol.
Checked for: a
stranger deposit
into
BasicRecipient;
unsigned
mintWithAttestation;
Messenger send
from a
non-registered
OFT; oracle
writes.
Result: no user-exploitable finding. Not submitted.
- BasicRecipient
depositTokenisDEPOSITOR_ROLEand pullsmsg.sender. - GMTokenManager
mint / redeem
require a
registered user
id and an
ATTESTATION_SIGNER_ROLEquote. They pull and pay_msgSender().adminProcessMintisADMIN_MINT_ROLE. - Messenger
sendrequiresoftToId[msg.sender]._lzReceiveforwards to the registered OFT. - Registrar
registerisTOKEN_FACTORY_ROLE. - Inspector and USDY wrapper are view / owner pause.
Do not file role-gated depositor pulls, signer-attested mint/redeem, admin mint, or OFT-only messenger send as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that Sourcify
opens for these
ETH manager types
is exhausted.
Remaining listed:
RWADynamicOracle
/ OndoSanityCheckOracle
/ IssuanceHours
/ OndoIDRegistryView,
Sourcify-404 ETH
rows, and
other-chain
twins.
2026-09-03: Veda leftover BoringVault leftover (Sourcify)
Immunefi program
veda
($1,000,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
exact_match
BoringVault
0xf0bb20865277aBd641a307eCe5Ee04E79073416C,
AccountantWithRateProviders
0xEa23aC6D7D11f6b181d6B98174D334478ADAe6b0
- sibling
0xc315D6e14DDCDC7407784e2Caf815d131Bc1D3E7, BoringSolver0xe3F8fa039fF7A8Fe42fA2C6e9DC8565EcE6f7042, ManagerWithMerkleVerification0xaFa8c08bedB2eC1bbEb64A7fFa44c604e7cca68d, and BoringOnChainQueue0x77A2fd42F8769d8063F2E75061FC200014E41Edf. Several listed addresses Sourcify
- Extract
/tmp/veda-vault//tmp/veda-acct//tmp/veda-mgr//tmp/veda-queue//tmp/veda-solver. No mainnet interaction.
Files:
src/base/BoringVault.sol,
src/base/Roles/AccountantWithRateProviders.sol,
src/base/Roles/ManagerWithMerkleVerification.sol,
src/base/Roles/BoringQueue/BoringOnChainQueue.sol,
src/base/Roles/TellerWithMultiAssetSupport.sol.
Checked for: a
stranger enter /
exit of another
user's shares;
queue cancel /
replace of
someone else's
request; solver
fill that pays
the caller;
manager vault
calls without a
merkle proof.
Result: no user-exploitable finding. Not submitted.
- BoringVault
enter/exit/managearerequiresAuth(MINTER / BURNER / MANAGER).entertransferFromsfrom;exitburnsfromand paysto. - Queue
requestOnChainWithdraw/ permit pullmsg.sendershares and queue that sender. Cancel / replaceonlyRequestUser(request.user, msg.sender)and refundrequest.user.solveOnChainWithdrawsisrequiresAuth; it transfers shares to the solver thensafeTransferFroms assets from the solver to eachrequests[i].user. - Manager
manageVaultWithMerkleVerification/ flash loan arerequiresAuth. - Accountant
updateExchangeRate/ fee settersrequiresAuth;claimFeesmust be called by the vault. - Teller
deposit/depositWithPermitare publicrequiresAuthand pullmsg.sender.refundDeposit/bulkDeposit/bulkWithdraware role-gated. ERC20 depositenters frommsg.sender.
Do not file auth-gated enter / exit, solver fill of matured requests to the request user, manager merkle-gated vault calls, or first-depositor share inflation.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH vault / accountant / manager / queue types is exhausted. Remaining listed: Sourcify-404 ETH rows and other-chain twins.
2026-09-03: Immutable leftover RootERC20Bridge leftover (Sourcify)
Immunefi program
immutable
($1,000,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
exact_match
RootERC20BridgeFlowRate
0x177EaFe0f1F3359375B1728dae0530a75C83E154
behind proxy
0xBa5E35E26Ae59c7aea6F029B68c6460De2d13eB6
and
RootAxelarBridgeAdaptor
0xE2E91C1Ae2873720C3b975a8034e887A35323345
behind proxy
0x4f49B53928A71E553bB1B0F66a5BcB54Fd4E8932.
Extract
/tmp/imm-bridge
/ /tmp/imm-axelar.
No mainnet
interaction.
Files:
src/root/RootERC20Bridge.sol,
src/root/flowrate/RootERC20BridgeFlowRate.sol,
src/root/RootAxelarBridgeAdaptor.sol.
Checked for: a stranger deposit that spends another user's tokens; adaptor bypass on withdraw; queue finalise that pays the caller.
Result: no user-exploitable finding. Not submitted.
deposit/depositETHpullmsg.sender(or wrap WETH frommsg.sender).depositTo/depositToETHlet the caller name the child receiver and pay with the caller's tokens.onMessageReceiveisonlyBridgeAdaptor. Withdraw paysreceiverfrom the decoded payload.- Flow-rate
queue: large /
unknown /
activated
withdrawals
enqueue;
finaliseQueuedWithdrawal(receiver, index)is permissionless after the delay and pays thatreceiver, not the caller. - Axelar adaptor
sendMessageisCallerNotBridge;_executerequires the registered child chain + adaptor thenrootBridge.onMessageReceive.
Do not file permissionless finalise of a matured queued withdrawal to that receiver, adaptor-only withdraw, or admin rate-control.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH root-bridge types is exhausted. Remaining listed: other-chain / child-chain twins and Sourcify-404 rows.
2026-09-03: Stargate leftover ETH pools leftover (Sourcify)
Immunefi program
stargate
($10,000,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
match
StargatePoolNative
0x77b2043768d28E9C9aB44E1aBfC95944bcE57931,
StargatePoolUSDC
0xc026395860Db2d07ee33e05fE50ed7bD583189C7,
StargatePoolMigratable
(USDT)
0x933597a323Eb81cAe705C5bC29985172fd5A3973,
StargateStaking
0xFF551fEDdbeDC0AeE764139cCD9Cb644Bb04A6BD,
TokenMessaging
0x6d6620eFa72948C5f68A3C8646d58C00d3f4A980,
Treasurer
0x1041D127b2d4BC700F0F563883bC689502606918,
StargateMultiRewarder
0x5871A7f88b0f3F5143Bf599Fd45F8C0Dc237E881,
and FeeLibV1
0x3E368B6C95c6fEfB7A16dCc0D756389F3c658a06.
Extract
/tmp/sg-pool-native
/ /tmp/sg-pool-usdc
/ /tmp/sg-pool-usdt
/ /tmp/sg-staking
/ /tmp/sg-msg
/ /tmp/sg-treas
/ /tmp/sg-reward
/ /tmp/sg-feeth.
No mainnet
interaction.
Files:
src/StargatePool.sol,
src/StargatePoolNative.sol,
src/StargateBase.sol,
src/messaging/TokenMessaging.sol,
src/peripheral/rewarder/StargateStaking.sol,
src/peripheral/Treasurer.sol.
Checked for: a stranger deposit that spends another user's tokens; redeem that burns someone else's LP; send that pulls a victim; retry receive that pays the caller; staking withdraw of another user's shares.
Result: no user-exploitable finding. Not submitted.
- ERC20 pool
_inflowtransferFroms_from.deposit/sendTokenpassmsg.sender. Native pool chargesmsg.value. LP mints to the named receiver;redeem/redeemSendburnFrommsg.sender. receiveTokenBus/receiveTokenTaxiareonlyCaller(tokenMessaging)and pay the decoded_receiver.retryReceiveTokenis permissionless after a hash match and pays that cached_receiver.- TokenMessaging
_lzReceiveis EndpointOAppReceivergated and forwards to the asset's Stargate impl. - Staking
depositpullsmsg.sender.depositTois contract-caller only and still pullsmsg.sender. Withdraw / claim debitmsg.sender. - Treasurer
withdrawTreasuryFeeis admin + listed Stargate only. Pool treasury / planner withdraws areonlyCaller.
Do not file permissionless retry of a cached failed receive to that receiver, treasurer / planner fee withdraw, or Endpoint-gated bus / taxi credit as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH pool / staking / messaging types is exhausted. Remaining listed: METIS / mETH pool twins, other FeeLibV1 rows, and other-chain deployments.
2026-09-03: LayerZero leftover ETH Endpoint leftover (Sourcify)
Immunefi program
layerzero
($15,000,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
match
EndpointV2
0x1a44076050125825900e736c501f859c50fE728c,
SendUln302
0xbB2Ea70C9E858123480642Cf96acbcCE1372dCe1,
ReceiveUln302
0xc02Ab410f0734EFa3F14628780e6e695156024C2,
DVN
0x589dEDbD617e0CBcB916A9223F4d1300c294236b,
UltraLightNodeV2
0x4D73AdB72bC3DD368966edD0f0b2148401A178E2
and exact_match
Endpoint V1
0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675.
Extract
/tmp/lz-epv2
/ /tmp/lz-senduln
/ /tmp/lz-recvuln
/ /tmp/lz-dvn
/ /tmp/lz-epv1
/ /tmp/lz-ulnv2.
No mainnet
interaction.
Files:
contracts/EndpointV2.sol,
contracts/Endpoint.sol,
contracts/uln/uln302/ReceiveUln302.sol,
contracts/uln/ReceiveUlnBase.sol,
contracts/uln/dvn/DVN.sol.
Checked for: a
stranger send
that attributes
another OApp;
verify that
inserts a
payload without
the receive
library;
lzReceive that
delivers an
unverified
payload; DVN
execute without
admin +
signatures.
Result: no user-exploitable finding. Not submitted.
- EndpointV2
sendbuilds the packet withsender = msg.senderand pays native / LZ token fees from the caller.verifyrequiresisValidReceiveLibraryformsg.sender. lzReceiveis permissionless after_clearPayloadmatches the stored hash and then calls the named_receiver.clearis_assertAuthorized(OApp or delegate).- ReceiveUln302
verifyrecordsmsg.senderas a DVN.commitVerificationrequires the configured DVN threshold thenendpoint.verify. - DVN
executeisADMIN_ROLEplus unused hash and threshold signatures.assignJobisMESSAGE_LIB_ROLE. - Endpoint V1
sendusesmsg.senderas the UA.receivePayloadrequires the configured receive library and sequential nonce.
Do not file
permissionless
lzReceive of a
verified
payload, ULN
verify that
only records the
caller as a DVN,
or admin DVN
execute as
stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH endpoint / ULN / DVN types is exhausted. Remaining listed: FPValidator / SendULN301 / ReceiveULN301, OApp / OFT examples, Aptos / Solana / TON rows.
2026-09-03: Ethena leftover minting + staking leftover (Sourcify)
Immunefi program
ethena
($3,000,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
exact_match
EthenaMinting
0xe3490297a08d6fC8Da46Edb7B6142E4F461b62D3,
StakedUSDeV2
0x9D39A5DE30e57443BfF2A8307A4256c8797A3497,
USDeSilo
0x7FC7c91D556B400AFa565013E3F32055a0713425,
EthenaLPStaking
0x8707f238936c12c309bfc2B9959C35828AcFc512,
USDtbMinting
0xa3DDBf92077b850E29C4805Df0a2459Ae048416a,
PSM
0x73E35C5c35A274E34AdE6EB13cC7f62aEE323728,
USDe
0x4c9EDD5852cd905f086C759E8383e09bff1E68B3,
StakingRewardsDistributor
0xf2fa332bD83149c66b09B45670bCe64746C6b439
and match
USDeOFTAdapter
0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34.
Extract
/tmp/ethena-mint
/ /tmp/ethena-susde
/ /tmp/ethena-silo
/ /tmp/ethena-lp
/ /tmp/ethena-usdtb-mint
/ /tmp/ethena-psm
/ /tmp/ethena-usde
/ /tmp/ethena-dist
/ /tmp/ethena-usde-oft.
No mainnet
interaction.
Files:
contracts/EthenaMinting.sol,
contracts/StakedUSDeV2.sol,
contracts/USDeSilo.sol,
contracts/EthenaLPStaking.sol,
contracts/usdtb/USDtbMinting.sol,
dependencies/onchain-minting-internal-1.0.0/src/swap/PSM.sol,
contracts/USDe.sol.
Checked for: a stranger mint without a benefactor signature; unstake of another user's sUSDe cooldown; LP withdraw of someone else's stake; PSM swap that pulls a non-delegated benefactor.
Result: no user-exploitable finding. Not submitted.
- EthenaMinting
mint/mintWETHareMINTER_ROLEand require a benefactor or accepted delegate EIP-712 / EIP-1271 signature. Collateral pulls the benefactor.redeemisREDEEMER_ROLEandburnFroms the benefactor. - USDe
mintisOnlyMinter. - StakedUSDeV2
4626
withdraw /
redeem are
off when
cooldown is
on.
cooldownAssets/cooldownSharesburnmsg.senderinto the silo.unstakepays the named receiver fromcooldowns[msg.sender]. Silowithdrawis vault only. - LP staking
stakepullsmsg.sender. Unstake / withdraw debitmsg.sender. PSM
benefactor or an accepted delegate, thenswaprequiresmsg.sendertransferFroms that benefactor.- USDtbMinting follows the same minter + signature pattern.
Do not file
role-gated
attested mint /
redeem, 4626
deposit to a
named receiver
that pays the
caller, or
cooldown
unstake of
msg.sender
to a named
receiver.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH mint / stake / PSM types is exhausted. Remaining listed: StakedENA / USDtb proxies (implementation not this slice), other OFT adapters, and TON / other-chain rows.
2026-09-03: Ether.fi leftover LiquidityPool leftover (Sourcify)
Immunefi program
etherfi
($500,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
UUPS proxies
resolve to
match
LiquidityPool
0x17A16747D03006c9754548AC0d0afF48783A4a45
behind
0x308861A430be4cce5502d0A12724771Fc6DaF216,
WeETH
0xA6Ca0607190d03CF16fe6F2865Cf40c3D160ccf3
behind
0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee,
Liquifier
0x263A74E56EB07C2A2A84FD510615a17b66e10E70
behind
0x9FFDF407cDe9a93c47611799DA23924Af3EF764F,
WithdrawRequestNFT
0x41617D01362770ebAAC10311aB899FBc8a4E4A7E
behind
0x7d5706f6ef3F89B3951E23e557CDFBC3239D4E2c,
EtherFiRedemptionManager
0x5D53B303D62a7861f88650045b8D5DeB59dfb3Dc
behind
0xDadEf1fFBFeaAB4f68A9fD181395F68b4e4E7Ae0,
DepositAdapter
0xE774E19f087523EA316fCCb4B156169153f18b9d
behind
0xcfC6d9Bd7411962Bfe7145451A7EF71A24b6A7A2,
StakingManager
0x66e1C53e846eF3E9f3722591868AfcFfB7f39800
behind
0x25e821b7197B146F7713C3b89B6A4D83516B912d.
eETH impl
0xd1901dD36CBf4a81386d0162DF2707f7dDb60527
Sourcify 404.
Extract
/tmp/ef-liqpool-impl
/ /tmp/ef-weeth-impl
/ /tmp/ef-liq-impl
/ /tmp/ef-wnft-impl
/ /tmp/ef-redeem-impl
/ /tmp/ef-dep-impl
/ /tmp/ef-stake-impl.
No mainnet
interaction.
Files:
src/core/LiquidityPool.sol,
src/core/WeETH.sol,
src/deposits/Liquifier.sol,
src/deposits/DepositAdapter.sol,
src/withdrawals/WithdrawRequestNFT.sol,
src/withdrawals/EtherFiRedemptionManager.sol,
src/staking/StakingManager.sol.
Checked for: a stranger deposit that mints eETH to the caller while spending another user's ETH; withdraw that burns someone else's eETH; wrap that pulls a victim; claim that pays the caller.
Result: no user-exploitable finding. Not submitted.
- LiquidityPool
depositchargesmsg.valueand mints to the caller.depositToRecipientis liquifier / admin only.requestWithdrawtransferFromsmsg.sendereETH and mints the NFT to the named recipient. Live-ratewithdrawis membership / redemption manager only and burnsmsg.sender. - WeETH
wrappullsmsg.sendereETH and mints weETH to the caller.unwrapburnsmsg.sender. - Liquifier
ERC20 deposit
pulls
msg.senderand mints eETH to the caller. - DepositAdapter ETH / WETH deposits pull the caller and wrap to weETH for the caller.
- Redemption
pulls
msg.sendereETH / weETH and pays the named receiver. - WithdrawRequestNFT
claimWithdrawis permissionless and paysownerOf(tokenId). - StakingManager validator register / fund paths are executor / oracle gated.
Do not file
permissionless
claim of a
finalized
withdraw NFT to
its owner,
liquifier-only
depositToRecipient,
or operator
validator
funding as
stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH pool / wrap / redeem types is exhausted. Remaining listed: eETH impl Sourcify 404, Auction / Oracle / OFT / bridge adapters, and other-chain weETH.
2026-09-03: Compound leftover Comet leftover (Sourcify)
Immunefi program
compoundfinance
($1,000,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
exact_match
cUSDCv3 proxy
0xc3d688B66703497DAA19211EEdff47f25384cdc3
to
CometWithExtendedAssetList
0x83D491269720CE925f92C6bF9F66B7a0779A293a,
cWETHv3 proxy
0xA17581A9E3356d9A858b789D68B4d866e593aE94
to
0x87F77f3A127Bcf2Df912871aE4DE4eDd1cB8cAB4,
CometRewards
0x1B0e765F6224C21223AeA2af16c1C46E38885a40,
Bulker
0x74a81F84268744a40FEBc48f8b812a1f188D80C3,
MainnetBulker
0xa397a8C2086C554B531c02E29f3291c9704B00c7,
and Configurator
proxy
0x316f9708bB98af7dA9c68C1C3b5e79039cD336E3
to
0xcFC1fA6b7ca982176529899D99af6473aD80DF4F.
Extract
/tmp/comp-usdc-impl
/ /tmp/comp-weth-impl
/ /tmp/comp-rewards
/ /tmp/comp-bulker-usdc
/ /tmp/comp-bulker-weth
/ /tmp/comp-config-impl.
No mainnet
interaction.
Files:
contracts/CometWithExtendedAssetList.sol,
contracts/CometCore.sol,
contracts/CometRewards.sol,
contracts/Bulker.sol.
Checked for: a
stranger
supplyFrom /
withdrawFrom
without
allowance;
claim that
pays the
caller;
absorb of a
healthy
account.
Result: no user-exploitable finding. Not submitted.
supply/withdrawbind operator, from, and dst tomsg.sender.supplyTo/withdrawTopull / debitmsg.senderand pay the named address.supplyFrom/withdrawFromrequirehasPermission(from/src, operator)(owner == managerorisAllowed).- Transfers use the same permission check.
absorbis permissionless and requiresisLiquidatable. Incentive points go to the named absorber.withdrawReservesis governor only.- Rewards
claimpayssrc.claimTorequires Comet permission. - Bulker
invokesupplyFrom/withdrawFrommsg.sender.
Do not file
permissionless
absorb of an
underwater
account,
claim that
pays src, or
supplyTo that
credits a named
dst with the
caller's tokens.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH USDC / WETH Comet types is exhausted. Remaining listed: other mainnet markets, Comet ext wrappers, Governor / Timelock, and other-chain Comets.
2026-09-03: Maple leftover Pool leftover (Sourcify)
Immunefi program
maple
($500,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
match
MaplePool
0x80ac24aA929eaF5013f6436cdA2a7ba190f5Cc0b,
MaplePoolManager
0xfE02Be1aD28EdFd8e3dD6F29C402B244C2A258B8
behind proxy
0x7aD5fFa5fdF509E30186F4609c2f6269f4B6158F,
MapleLoan
0xEeaDb66693d63cFCF3E4D942D2812D4aE9443Fc1,
LoanManager
0xbAD003DA1e107f537Ae2f687f5FE7a7aFFe9B241
and exact_match
SyrupRouter
0x134cCaaA4F1e4552eC8aEcb9E4A2360dDcF8df76.
Queue WM proxy
0x1bc47a0Dd0FdaB96E9eF982fdf1F34DC6207cfE3
resolves to live
impl
0xF95E5722226a1018d058CD757B75F1D10289e967
(match); listed
v100 impl
0x899B57Bbd8597aa2d1898476504f479c982c5c2c
also opens.
Extract
/tmp/maple-pool
/ /tmp/maple-pm-impl
/ /tmp/maple-loan
/ /tmp/maple-lm-impl
/ /tmp/maple-syrup
/ /tmp/maple-wmq-impl
/ /tmp/maple-wmq-live.
No mainnet
interaction.
Files:
MaplePool.sol,
contracts/MaplePoolManager.sol,
contracts/MapleLoan.sol,
modules/syrup-router/contracts/SyrupRouter.sol,
modules/withdrawal-manager-queue/contracts/MapleWithdrawalManager.sol.
Checked for: a
stranger
deposit that
mints shares
while pulling
another user's
assets; redeem
without
allowance;
queue
processExit
that pays the
caller; loan
fund by a
non-lender.
Result: no user-exploitable finding. Not submitted.
- Pool
deposit/mintpullmsg.senderand mint to the named receiver.requestRedeem/redeemescrow or burnowneronly whenmsg.senderis owner or has allowance. - PoolManager
processRedeemisonlyPooland requires owner == sender or allowance.processWithdrawis disabled.depositCoverpullsmsg.sender. Cover withdraw is pool-delegate only. - Queue WM
addShares/processExitareonlyPoolManager.processRedemptionsisonlyRedeemer. - SyrupRouter
depositpullsmsg.sender. - MapleLoan
fundisonlyLender.makePaymenttransferFromsmsg.senderto the lender.
Do not file
4626 deposit to
a named
receiver that
pays the
caller, queue
processing by
the redeemer
role, or
lender-only
fund.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH pool / loan / Syrup types is exhausted. Remaining listed: factories, cyclical WM, Aave / Sky / Basic strategies, and other pools.
2026-09-03: Aave leftover v3 Pool leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Unique unused
standing program.
Official
aave-dao/aave-v3-origin
HEAD
cff15de.
Extract
/tmp/aave-v3
via jsDelivr +
raw.githubusercontent.com.
No mainnet
interaction.
Files:
src/contracts/protocol/pool/Pool.sol,
src/contracts/protocol/libraries/logic/SupplyLogic.sol,
src/contracts/protocol/libraries/logic/BorrowLogic.sol,
src/contracts/protocol/libraries/logic/LiquidationLogic.sol,
src/contracts/protocol/libraries/logic/FlashLoanLogic.sol,
src/contracts/protocol/tokenization/VariableDebtToken.sol.
Checked for: a
stranger supply
that pulls
another user's
tokens; withdraw
of someone
else's aTokens;
borrow that
mints debt to
onBehalfOf
without credit
delegation;
liquidation of a
healthy
position.
Result: no user-exploitable finding. Not submitted.
supply/supplyWithPermitsetuser = _msgSender()andtransferFromthat user. aTokens mint toonBehalfOf.withdrawburns_msgSender()aTokens and paysto.borrowmints variable debt toonBehalfOf. Ifuser != onBehalfOf, VariableDebtToken_decreaseBorrowAllowance.repaypulls the caller and burnsonBehalfOfdebt.uint256.maxrepay-on-behalf is rejected.liquidationCallrequires a health factor below the liquidation threshold.
Do not file
supply to a
named
onBehalfOf
that pays the
caller, credit-
delegated
borrow, or
permissionless
liquidation of
an unhealthy
position.
Not submitted. Payment requires user KYC. Listed leftover that the official Pool / logic / vToken tree opens is exhausted at this money-path level. Remaining listed: PoolConfigurator / ACL / oracles / periphery / rewards / GHO instances.
2026-09-03: Wormhole leftover ETH core + TokenBridge leftover (Sourcify)
Immunefi program
wormhole
($1,000,000,
kyc: true).
Unique unused
standing program.
Ethereum Sourcify
match Core
0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
impl
0x3c3d457f1522D3540AB3325Aa5f1864E34cBA9D0,
TokenBridge
0x3ee18B2214AFF97000D974cf647E7C347E8fa585
impl
0x381752f5458282d317d12C30D2Bd4D6E1FD8841e,
NFTBridge
0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
impl
0x3e41904B3766F4cCEb145Cc53D75fEB61722a96C.
Relayer
0x27428DD766d4699713D3Bd22A30df974c1167a4E
Sourcify 404.
Official SHAs
(git ls-remote):
wormhole HEAD
c58827e,
NTT 250d810,
circle-integration
2342025.
Extract
/tmp/wh-core-impl,
/tmp/wh-tb-impl,
/tmp/wh-nft-impl.
No mainnet
interaction.
Files:
contracts/Implementation.sol,
contracts/Messages.sol,
contracts/Governance.sol,
contracts/bridge/Bridge.sol,
contracts/nft/NFTBridge.sol.
Checked for: a
stranger
publishMessage
that emits as
another emitter;
completeTransfer
that pays a
user's principal
to the caller;
transferTokens
/ transferNFT
that pull another
account; guardian
set upgrade
without a
governance VAA.
Result: no user-exploitable finding. Not submitted.
publishMessageusesuseSequence(msg.sender)and requiresmsg.value == messageFee().parseAndVerifyVM/verifyVMcheck guardian set, expiry, quorum, and signatures.- Token bridge
_transferTokenssafeTransferFromsmsg.sender. Wrapped assets burn. completeTransferis permissionless after a valid guardian VAA and unused hash. PayloadID 3 requiresmsg.sender == transferRecipient. Arbiter fee can paymsg.senderwhennativeFee > 0 && transferRecipient != msg.sender(documented; principal goes totransfer.to).- NFT
transferNFTsafeTransferFromsmsg.sender.completeTransfermints or transfers totransfer.to. submitNewGuardianSetis governance VAA gated.
Do not file
permissionless
complete of a
guardian-attested
VAA to the
recorded
recipient, or
the documented
arbiter-fee
payout to
msg.sender.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH core / TokenBridge / NFTBridge types is exhausted. Remaining listed: Relayer 404, NTT, circle-integration (excl. Circle Bridge), Solana / CosmWasm / other chains, guardian node / wormchain.
2026-09-03: Ondo Finance leftover remaining oracles leftover (Sourcify)
Immunefi program
ondofinance
($1,000,000,
kyc: true).
Already leftover-
logged (TokenRouter
- rOUSG,
TokenManager).
This slice is
remaining ETH
oracle / hours /
view types.
Sourcify
RWADynamicOracle
0xA0219AA5B31e65Bc920B5b6DFb8EdF0988121De0, OndoSanityCheckOracle0x914D5Cb27cb30E80BdE8215ff577eD63Eb986B79, IssuanceHours0xE59dbF08CccF8D1ab90156b9664d31Fd20BB2AC7, OndoIDRegistryView0x56A5D911052323D688C731d516530878557463e7, OndoOracle0x9Cad45a8BF0Ed41Ff33074449B357C7a1fAb4094, RWAOracleExternalComparisonCheck0x0502c5ae08E7CD64fe1AEDA7D6e229413eCC6abe, OndoComplianceGMView0x54a8757c2FEF8649830b158a8C19D3a670e80318. Extract/tmp/ondo-dynoracle,/tmp/ondo-sanity,/tmp/ondo-hours,/tmp/ondo-idview,/tmp/ondo-oracle,/tmp/ondo-ousg-oracle,/tmp/ondo-gmview. No mainnet interaction.
Files:
contracts/rwaOracles/RWADynamicOracle.sol,
contracts/globalMarkets/tokenManager/sanityCheckOracle/OndoSanityCheckOracle.sol,
contracts/globalMarkets/tokenManager/issuanceHours/IssuanceHours.sol,
contracts/xManager/OndoIDRegistry/OndoIDRegistryView.sol,
contracts/xManager/OndoOracle/OndoOracle.sol,
contracts/lending/rwaOracles/RWAOracleExternalComparisonCheck.sol,
contracts/globalMarkets/gmTokenCompliance/OndoComplianceGMView.sol.
Checked for: a
stranger
setPrice /
postPrice /
setRange that
writes a token
price; a view
hours / registry
check that
mutates user
state; an oracle
type change
without a role.
Result: no user-exploitable finding. Not submitted.
- RWADynamicOracle
setRangeisSETTER_ROLE.overrideRangeisDEFAULT_ADMIN_ROLE.getPriceis view. - SanityCheck
postPrice/postPricesareSETTER_ROLE.validatePriceis view. - IssuanceHours
checkIsValidHoursis view.setTimezoneOffsetis owner. - IDRegistryView
getters are
view. Setters
are
DEFAULT_ADMIN_ROLE. - OndoOracle
type / hardcoded
/ RWA /
aggregator
setters are
role-gated.
getAssetPriceis view. - OUSG
comparison
setPriceisSETTER_ROLE. - ComplianceGMView
checkIsCompliantforwards to the compliance contract. Setters are owner.
Do not file setter-role oracle writes or view-only hours / registry / compliance checks as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH oracle / hours / view types is exhausted. Remaining listed: other-chain oracles / remaining 404s / listed types not these views.
2026-09-03: Chainlink leftover CCIP EVM leftover (f0eda24)
Immunefi program
chainlink
($3,000,000,
kyc: true).
Unique unused
standing program.
Official
smartcontractkit/chainlink-ccip
HEAD
f0eda24.
Extract
/tmp/cl-ccip
via jsDelivr.
No mainnet
interaction.
Files:
chains/evm/contracts/Router.sol,
chains/evm/contracts/onRamp/OnRamp.sol,
chains/evm/contracts/offRamp/OffRamp.sol,
chains/evm/contracts/pools/TokenPool.sol,
chains/evm/contracts/pools/LockReleaseTokenPool.sol,
chains/evm/contracts/pools/BurnMintTokenPoolAbstract.sol.
Checked for: a
stranger
ccipSend that
pulls another
account's tokens
or fee; OnRamp
forwardFromRouter
from a non-router;
pool
lockOrBurn /
releaseOrMint
without a ramp;
OffRamp execute
that mints to the
caller.
Result: no user-exploitable finding. Not submitted.
- Router
ccipSendsafeTransferFroms fee and token amounts frommsg.sender, thenforwardFromRouterwithoriginalSender = msg.sender. - OnRamp
forwardFromRouterrequiresmsg.sender == destChainConfig.routerand a non-zerooriginalSender. - TokenPool
lockOrBurnis_onlyOnRamp.releaseOrMintis_onlyOffRampplus remote-pool and RMN curse checks. - LockRelease
deposits /
withdraws the
lock box after
those gates.
BurnMint mints
to
receiver. - OffRamp
executeis permissionless after CCV quorum, allowed onRamp, unused or failed state, and dest-chain match. Tokens go totokenReceiver. withdrawFeeTokensis permissionless and pays onlyfeeAggregator.recoverTokensis owner.
Do not file permissionless execute of a CCV-verified message to the recorded receiver, or permissionless fee sweep to the configured aggregator.
Not submitted. Payment requires user KYC. Listed leftover that official CCIP EVM Router / OnRamp / OffRamp / TokenPool opens is exhausted at this money-path level. Remaining listed: CCIP Solana / Sui / Aptos, chainlink-evm, OCR plugins, core node, LibOCR, owner contracts, websites.
2026-09-03: Optimism leftover L1 portal + StandardBridge leftover (eea9542)
Immunefi program
optimism
($2,000,042,
kyc: true).
Unique unused
standing program.
Official
ethereum-optimism/optimism
HEAD
eea9542.
Sourcify ETH
OptimismPortal
0xbEb5Fc579115071764c7423A4f12eDde41f106Ed
impl OptimismPortal2
0xe89F13c5ee4033B2D3cD76C9d6958eFBfe26D3C2,
listed portal impl
0xe2F826324b2faf99E513D16D266c3F80aE87832B,
L1StandardBridge
0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1
(ChugSplash proxy),
L1CrossDomainMessenger
0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1
(ResolvedDelegateProxy),
L1ERC721Bridge
0x5a7749f83b81B301cAb5f48EB8516B986DAef23D
impl
0x9F164f1d02A81e06D639E55F65a87f0070E3Cb2e.
Extract
/tmp/op-portal2-impl,
/tmp/op-erc721-impl,
/tmp/op-bedrock.
No mainnet
interaction.
Files:
src/L1/OptimismPortal2.sol,
src/L1/L1StandardBridge.sol,
src/universal/StandardBridge.sol,
src/universal/CrossDomainMessenger.sol,
src/L1/L1ERC721Bridge.sol,
src/universal/ERC721Bridge.sol.
Checked for: a
stranger
bridgeERC20 /
depositERC20
that pulls
another account;
finalizeBridgeETH
that pays the
caller; portal
finalizeWithdrawal
that pays a
proven
withdrawal to
the caller;
depositTransaction
that credits
another user's
ETH.
Result: no user-exploitable finding. Not submitted.
- StandardBridge
ETH deposits
charge
msg.value. ERC20safeTransferFroms_from = msg.sender(or burns mintable from that sender). finalizeBridgeETH/ ERC20 areonlyOtherBridgeand pay_to.- Portal
depositTransactionlocksmsg.valueand aliases a contractmsg.sender. proveWithdrawalis permissionless against a proper respected dispute game.finalizeWithdrawalis permissionless after the proven + challenge window and calls_tx.target.- Messenger
sendMessagebindsmsg.sender.relayMessageis other- messenger or failed-replay only. - ERC721
transferFroms_from = msg.sender.
Do not file
permissionless
finalize of a
proven
withdrawal to
the recorded
target, or
other-bridge
finalize that
pays _to.
Not submitted. Payment requires user KYC. Listed leftover that official Bedrock L1 portal / StandardBridge / messenger / ERC721 opens is exhausted at this money-path level. Remaining listed: dispute games / MIPS / PreimageOracle, op-node / op-dispute-mon, L2 contracts, PolicyEngineStaking, websites.
2026-09-03: Arbitrum leftover token-bridge + Inbox leftover (1bdf3cd / 7fc6624)
Immunefi program
arbitrum
($2,000,000,
kyc: true).
Unique unused
standing program.
Official
OffchainLabs/token-bridge-contracts
HEAD
1bdf3cd
and
OffchainLabs/nitro-contracts
HEAD
7fc6624.
Extract
/tmp/arb/tb,
/tmp/arb/nitro
via jsDelivr.
No mainnet
interaction.
Files:
contracts/tokenbridge/ethereum/gateway/L1ArbitrumGateway.sol,
contracts/tokenbridge/ethereum/gateway/L1GatewayRouter.sol,
contracts/tokenbridge/ethereum/gateway/L1ERC20Gateway.sol,
contracts/tokenbridge/arbitrum/gateway/L2ArbitrumGateway.sol,
src/bridge/Inbox.sol,
src/bridge/AbsInbox.sol,
src/bridge/AbsOutbox.sol,
src/bridge/Bridge.sol.
Checked for: a
stranger
outboundTransfer
that escrow-
pulls another
account; L1
finalizeInbound
that pays the
caller; Inbox
depositEth
that credits
another user's
ETH; Outbox
executeTransaction
that pays a
proven
withdrawal to
the caller.
Result: no user-exploitable finding. Not submitted.
- L1 router
outboundTransferCustomRefundencodesmsg.senderas_from. GatewayoutboundEscrowTransfersafeTransferFroms that_from. Gateway outbound requiresisRouter. - L1
finalizeInboundTransferisonlyCounterpartGatewayandsafeTransfers_to. - L2 outbound
burns /
escrows
_from(router- encodedmsg.senderor the caller). - Inbox
depositEthcreditsmsg.sender(or its L1→L2 alias). Retryable tickets bindmsg.sender. - Outbox
executeTransactionis permissionless after a spent merkle proof and calls recordedto.
Do not file
permissionless
outbox execute
of a merkle-
proven L2→L1
message to the
recorded to,
or counterpart-
gateway finalize
that pays _to.
Not submitted. Payment requires user KYC. Listed leftover that official token-bridge L1 / L2 gateways and nitro Inbox / Outbox / Bridge open is exhausted at this money-path level. Remaining listed: nitro challenge leftover is logged; custom reverse gateway leftover is logged; governance / fund-distribution / remaining token-bridge libs / websites (if still unused).
2026-09-03: zkSync Era leftover L1 Mailbox + AssetRouter leftover (Sourcify / ad5a478)
Immunefi program
zksyncera
($300,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
Diamond
0x32400084c286cf3e17e7b677ea9583e60a000324
Mailbox facet
0x1e34aB39a9682149165ddeCc0583d238A5448B45,
Bridgehub
0x303a465B659cBB0ab36eE643eA362c509EEb5213
impl
0xc89423b4909080fB8F8A43dF5E1C27001e55C24B,
L1ERC20Bridge
0x57891966931Eb4Bb6FB81430E6cE0A03AAbDe063
impl
0x6ed98623e0B51be68748aB5091Aa891Adb883e13
Sourcify 404.
Official
matter-labs/era-contracts
HEAD
ad5a478.
Extract
/tmp/zks-mailbox,
/tmp/zks-bridgehub-impl,
/tmp/zks-era.
No mainnet
interaction.
Files:
contracts/state-transition/chain-deps/facets/Mailbox.sol,
contracts/bridgehub/Bridgehub.sol,
l1-contracts/contracts/bridge/L1ERC20Bridge.sol,
l1-contracts/contracts/bridge/asset-router/L1AssetRouter.sol,
l1-contracts/contracts/bridge/ntv/L1NativeTokenVault.sol,
l1-contracts/contracts/bridge/L1Nullifier.sol.
Checked for: a
stranger
deposit that
pulls another
account; AssetRouter
bridgehubDeposit
from a non-
Bridgehub;
finalizeDeposit
that pays the
caller; Mailbox
requestL2Transaction
that credits
another user's
ETH.
Result: no user-exploitable finding. Not submitted.
- Legacy
L1ERC20Bridge
depositsafeTransferFromsmsg.senderand forwards_originalCaller = msg.sender. - Bridgehub
requestL2TransactionDirectdepositsmsg.sendervia AssetRouteronlyBridgehub. - Mailbox
requestL2Transactionbindssender: msg.senderandmsg.value. - NTV burn
pulls
_originalCaller(or the legacy bridge allowance). - Nullifier
finalizeDepositis permissionless afterproveL2MessageInclusionand unused index. Tokens go to the encoded receiver. - AssetRouter
finalizeDepositisonlyNullifier.
Do not file permissionless finalize of a merkle-proven L2→L1 withdrawal to the recorded receiver, or deposit to a named L2 receiver that pays the caller.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify / official L1 Mailbox / Bridgehub / AssetRouter / legacy ERC20 open is exhausted at this money-path level. Remaining listed: L2 contracts, circuits / SNARK wrapper, governance (ProtocolUpgradeHandler / SecurityCouncil / Guardians / governors), websites.
2026-09-03: Polygon leftover LXLY AggLayer leftover (Sourcify)
Immunefi program
polygon
($250,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
PolygonBridgeV2
0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe
impl AgglayerBridge
0x66E0120e3c965552a89AcC37b03f762624baC5Ad,
RollupManager
0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2
impl AgglayerManager
0x15cAF18dEd768e3620E0f656221Bf6B400ad2618,
GlobalExitRoot
0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb
impl AgglayerGER
0x7F1655d9d570167B2a3FfD1Ef809D3Fdd74427C5,
AggLayer Gateway
0x046Bb8bb98Db4ceCbB2929542686B74b516274b3
impl
0xD062B7f9fbB89bdA59262E77015C34a27Dc9aB49.
Extract
/tmp/pol-bridge-impl,
/tmp/pol-manager-impl,
/tmp/pol-ger-impl,
/tmp/pol-gateway-impl.
No mainnet
interaction.
Files:
contracts/AgglayerBridge.sol,
contracts/AgglayerManager.sol,
contracts/AgglayerGER.sol,
contracts/AgglayerGateway.sol.
Checked for: a
stranger
bridgeAsset
that pulls
another
account;
claimAsset
that pays the
caller; GER
updateExitRoot
from a non-
bridge /
manager.
Result: no user-exploitable finding. Not submitted.
bridgeAssetchargesmsg.valuefor native orsafeTransferFromsmsg.sender. Wrapped assetsburn(msg.sender).claimAsset/claimMessageare permissionless after SMT proofs and unusedglobalIndex. Funds go todestinationAddress.- GER
updateExitRootis bridge or rollup-manager only. - Manager
onSequenceBatchesis an added rollup only. Verify paths are trusted- aggregator gated. - Gateway
verifyPessimisticProofis a verification key route, not a user escrow.
Do not file
permissionless
claim of a
merkle-proven
leaf to the
recorded
destinationAddress.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH LXLY / AggLayer types is exhausted at this money-path level. Remaining listed: POS Bridge & Staking, sPOL, POL token, CometBFT / Bor / Heimdall.
2026-09-03: Parallel leftover ETH savings + sPRL leftover (Sourcify)
Immunefi program
parallel
($250,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
sUSDp
0x0d45b129dc868963025Db79A9074EA9c9e32Cae4
impl SavingsSunset
0xb6C4D50729C1563fbC8d83628F0EbBA6fF1F5bB1,
sPRL1
0xeAd729472f82E5eC2FF4e691d67633077C1B5901,
sPRL2
0xe8a2d848fe656e34a6caa35f375b42979e322135,
PRL
0x6c0aeceeDc55c9d55d8B99216a670D85330941c3,
PRL Lockbox
0xdE91eb8206c228f4208c34510cf0C61C9302a434.
USDp proxy
0x9B3a8f7CEC208e247d97dEE13313690977e24459
impl
0x83dE446e5076877263828E9120b0EA8B0BC0d0e4
Sourcify 404.
Listed Parallelizer
facets Sourcify 404.
Extract
/tmp/par-susdp-impl,
/tmp/par-sprl1,
/tmp/par-sprl2,
/tmp/par-prl,
/tmp/par-lockbox.
No mainnet
interaction.
Files:
contracts/savings/Savings.sol,
contracts/sPRL/sPRL1.sol,
contracts/sPRL/sPRL2.sol,
contracts/sPRL/TimeLockPenaltyERC20.sol,
contracts/principal/LockBox.sol.
Checked for: a
stranger
4626 withdraw
that burns
another owner
without
allowance; sPRL
deposit that
pulls another
account;
withdraw of
someone else's
unlock request;
Lockbox send
of another
user's PRL.
Result: no user-exploitable finding. Not submitted.
- Savings
deposit/mintpull_msgSender()and mint toreceiver.withdraw/redeemuse ERC-4626 owner / allowance. - sPRL1
depositsafeTransferFromsmsg.sender._withdrawreadsuserVsWithdrawals[msg.sender]. - sPRL2
BPT / PRL /
WETH deposits
pull
msg.sender. ETH deposit chargesmsg.value. - Lockbox
sendis OFT_debitof the caller. - PRL is a standard ERC-20.
Do not file
4626 deposit to
a named
receiver that
pays the
caller, or
owner-only
sPRL unlock
that pays
msg.sender.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for these ETH savings / sPRL / Lockbox types is exhausted. Remaining listed: Parallelizer facets (Sourcify 404), TokenP 404, other-chain twins.
2026-09-03: Avail leftover ETH bridge leftover (f3bd9d9)
Immunefi program
avail
($250,000,
kyc: true).
Unique unused
standing program.
Official
availproject/contracts
HEAD
f3bd9d9.
Extract
/tmp/avail
via jsDelivr.
No mainnet
interaction.
Files:
src/AvailBridgeV1.sol,
src/Fusion.sol,
src/AvailWormhole.sol,
src/Avail.sol.
Checked for: a
stranger
sendAVAIL
that burns
another
account;
receiveAVAIL
that mints to
the caller;
Fusion
execute
deposit that
pulls another
user.
Result: no user-exploitable finding. Not submitted.
sendAVAILburnsmsg.senderviadelegateAvailBurn.sendMessagebindsmsg.senderand chargesmsg.value.receiveAVAILis permissionless after a Merkle leaf + unused hash. Mints tomessage.to. ETH / ERC20 receive revert unimplemented.- Fusion
executedepositssafeTransferFrommsg.sender. Withdraw / claim / unbond are Avail-side intentions bound tomsg.sender. - AvailWormhole
mintisMINTER_ROLE.burnburnsmsg.sender.
Do not file
permissionless
receive of a
Merkle-proven
Avail→ETH
message to the
recorded to.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
availproject/contracts
opens is
exhausted at
this money-path
level.
Remaining listed:
Bridge UI.
2026-09-03: Chainlink leftover remaining VRF leftover (c75c193)
Immunefi program
chainlink
($3,000,000,
kyc: true).
Already leftover-logged
as CCIP EVM.
Official
smartcontractkit/chainlink-evm
HEAD
c75c193.
Extract
/tmp/cl-evm
via jsDelivr.
Functions /
Automation /
Keystone / LLO
CDN fetch 404
at this SHA —
leftover this
slice as VRF
only. No
mainnet
interaction.
Files:
contracts/src/v0.8/vrf/VRFCoordinatorV2_5.sol,
contracts/src/v0.8/vrf/VRFCoordinatorV2.sol.
Checked for: a
stranger
requestRandomWords
billed to
another
consumer's
subscription;
a commitment
swap so
fulfill
delivers to a
different
consumer; a
stranger
cancelSubscription
that drains
LINK to the
caller.
Result: no user-exploitable finding. Not submitted.
requestRandomWordson V2.5 requiress_consumers[msg.sender][subId].activeand writes a commitment bound tomsg.sender.fulfillRandomWordsis permissionless after a valid VRF proof plus matching commitment, then delivers entropy torc.sender.cancelSubscription/requestSubscriptionOwnerTransferareonlySubOwner.ownerCancelSubscriptionisonlyOwner.oracleWithdrawpays the registered oracle.
Do not file permissionless fulfill of a valid VRF proof to the recorded consumer.
Not submitted. Payment requires user KYC. Remaining listed: Functions / Automation if a later SHA opens; CCIP Solana / Sui / Aptos; OCR plugins; core node; LibOCR; owner contracts; websites.
2026-09-03: Stacks leftover pox-5 leftover (1aa80f89)
Immunefi program
stacks
($250,000,
kyc: true).
Unique unused
standing program.
Official
stacks-network/stacks-core
HEAD
1aa80f89.
Extract
/tmp/pox-5.clar
via jsDelivr.
lockup.clar
is a 6-line
stub. Leftover
this slice as
pox-5 money
path. No
mainnet
interaction.
Files:
stackslib/src/chainstate/stacks/boot/pox-5.clar.
Checked for: a
stranger
stake /
stake-update
that locks
another
account's STX;
a stranger
unstake /
announce-l1-early-exit
that hijacks a
stake; a
claim-rewards
that pays sBTC
to an
arbitrary
caller.
Result: no user-exploitable finding. Not submitted.
stake/stake-update/unstakebindtx-senderand checkstx-accountoftx-sender.announce-l1-early-exitrequirescontract-caller == tx-sender == staker.setup-bondisbond-admin.register-for-bondrequirestx-senderon the allowlist.claim-rewardspayscontract-caller(the signer) viaas-contractsBTC transfer of computed rewards.grant-signer-keyiscontract-caller == signer-managerplus a secp256k1 grant sig.
Do not file signer-claimed rewards as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: costs.clar / lockup if a later SHA opens a real lockup; stacks-node / stackslib / stacks-signer; stacks-common; Clarity VM.
2026-09-03: Boba Network leftover ETH LightBridge leftover (Sourcify)
Immunefi program
bobanetwork
($100,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
proxy
0x2dE73Bd1660Fbf4D521a52Ec2a91CCc106113801
is
Lib_ResolvedDelegateProxy.
Impl
0x3f7Da9C51138E0475aA26E80677d27A568cFD6b9
is
LightBridge
exact_match
(same source on
Arb 42161 and
OP 10). Boba
288
0x670b130112C6f03E17192e63c67866e67D77c3ee
is the same
LightBridge;
0x0dfFd3Efe9c3237Ad7bf94252296272c96237FF5
resolves to
that impl.
Extract
/tmp/boba-impl.
Official
bobanetwork/boba
HEAD
a004def
no longer
ships
LightBridge.sol.
No mainnet
writes.
Files:
contracts/LightBridge.sol,
contracts/Lib_ResolvedDelegateProxy.sol.
Checked for: a
stranger
teleportAsset
that pulls
another
account; a
permissionless
disburseAsset
that pays the
caller; a
stranger
retryDisburseNative
or
withdrawBalance
that drains
the lock.
Result: no user-exploitable finding. Not submitted.
teleportAssetpulls ERC20 frommsg.senderor requires_amount == msg.value. TheAssetReceivedemitter ismsg.sender.disburseAsset/retryDisburseNativeareonlyDisburser. Native retry pays the recordedaddr.withdrawBalance/ token support / pause areonlyOwner.- Proxy
setTargetContract/transferProxyOwnershipare owner-only (proxyCallIfNotOwner).
Do not file
disburser-gated
release of a
backend-attested
deposit to the
recorded
addr.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens is exhausted at this money-path level. Remaining listed: RPC / gateway / websocket.
2026-09-03: Starknet Staking leftover L1 mint + cairo staking leftover (7a7add2 / @staking/contracts-v1.0.1-dev.854)
Immunefi program
starknet-staking
($100,000,
kyc: true).
Unique unused
standing program.
Official tag
@staking/contracts-v1.0.1-dev.854.
Repo HEAD
7a7add2.
Extract
/tmp/sns-l1,
/tmp/sns-cairo.
No mainnet
writes.
Files:
workspace/apps/staking/L1/starkware/solidity/stake/RewardSupplier.sol,
workspace/apps/staking/L1/starkware/solidity/stake/MintManager.sol,
workspace/apps/staking/L1/starkware/solidity/stake/PeriodMintLimit.sol,
workspace/apps/staking/L1/starkware/solidity/stake/RewardSupplierStorage.sol,
workspace/apps/staking/contracts/src/staking/staking.cairo,
workspace/apps/staking/contracts/src/pool/pool.cairo,
workspace/apps/staking/contracts/src/reward_supplier/reward_supplier.cairo.
Checked for: a
stranger L1
mintRequest
that mints to
the caller; a
tick that
deposits minted
STRK to an
arbitrary L2;
a cairo stake
that pulls
another
account; a
stranger
claim_rewards
or
unstake_action
that pays the
caller.
Result: no user-exploitable finding. Not submitted.
- L1
mintRequestrequires a registered minter plus allowance and mints to the requester. Allowance setters are token-admin / governor / security roles. - L1
tickis permissionless after L2→L1 mint-request messages, then deposits to the configuredmintDestination. - Cairo
stake/increase_stakepullget_caller_address.claim_rewardsis staker or reward-address gated and paysreward_address.unstake_actionis permissionless after the wait window and returns STRK tostaker_address. - Pool
enter_delegation_poolpulls the caller.exit_delegation_pool_actionis permissionless after the wait window and payspool_member. L2RewardSupplier.claim_rewardsis staking-contract only.
Do not file
permissionless
tick of
attested L2
mint requests
or
permissionless
unstake after
the recorded
wait window.
Not submitted. Payment requires user KYC. Listed leftover that the tagged tree opens is exhausted at this money-path level. Remaining listed: minting_curve config; utils.cairo.
2026-09-03: Katana leftover ETH portal + KAT OFT + vbToken leftover (Sourcify)
Immunefi program
katana
($80,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
portal
0x250D30c523104bf0a06825e7eAdE4Dc46EdfE40E
impl
0x3160738db14B27EAe2D0d1b622259010308f4C38
is
OptimismPortal2.
Aggchain FEP
0x100d3ca4f97776A40A7D93dB4AbF0FEA34230666
impl
0x9532A2F35fc9B18BD4FE8315D9C5B1C1Cf6Ac660.
Base KAT OFT
0xD5390300c5DB71F80d46f0fA9983Fc72D4d1e3da
impl
0xEB8F9227F5E6012fD4E0d52461a6cD0226A0275F
is
KATOFTUpgradeable.
Katana 747474
vbETH impl
0xBc59c919BBE65aEa7b4A793C1efff4997ca5B6A0
is
WETH +
VaultBridgeToken;
escrow impl
0x4623c119d291Fb2235d0D299E6442b402131fa6F
is
VotingEscrowV1_2_0;
KAT
0x7F1f4b4b29f5058fA32CC7a97141b8D7e5ABDC2d
is
KatToken.
Extract
/tmp/kat-portal-impl,
/tmp/kat-fep-impl,
/tmp/kat-oft-real,
/tmp/kat-impl-vbETH,
/tmp/kat-impl-escrow,
/tmp/kat-impl-KAT.
NativeConverter
impls Sourcify
404. No mainnet
writes.
Files:
src/L1/OptimismPortal2.sol,
contracts/aggchains/AggchainFEP.sol,
contracts/KATOFTUpgradeable.sol,
src/VaultBridgeToken.sol,
src/NativeConverter.sol,
lib/ve-governance/src/escrow/VotingEscrowIncreasing_v1_2_0.sol,
src/KatToken.sol.
Checked for: a
stranger
portal
finalize that
pays the
caller; a
stranger OFT
send that
burns another
account; a
vbToken
deposit that
pulls another
user; a
converter
deconvert
that burns
another
holder; an
escrow
withdraw
that pays an
arbitrary
caller; a
stranger
KatToken.mint.
Result: no user-exploitable finding. Not submitted.
- Portal
depositTransactiondisables ETH / token bridging.finalizeWithdrawalTransactionis permissionless after a proven withdrawal and pays_tx.target. AggchainFEP.onVerifyPessimisticisonlyRollupManager.KATOFTUpgradeableis stock upgradeable OFT;senddebitsmsg.sender.VaultBridgeToken.depositpullsmsg.sender.withdraw/redeemspend allowance whenmsg.sender != owner.claimAndRedeemis permissionless after SMT proofs and redeems fordestinationAddress.NativeConverter.convertpullsmsg.sender._deconvertburnsmsg.sender.migrateBackingToLayerXisMIGRATOR_ROLE.- Escrow
createLockpulls_msgSender.beginWithdrawaltransfers the NFT from the caller.withdrawpays the ticket holder. KatToken.mintspendsmintCapacity[msg.sender].
Do not file permissionless finalize of a proven withdrawal or permissionless claim of an SMT-proven LxLy exit to the recorded destination.
Not submitted. Payment requires user KYC. Remaining listed: NativeConverter impls 404; avKAT 404; remaining Katana-chain converters / Jitosol OFT; Agglayer Bridge already Polygon-leftover.
2026-09-03: Wormhole leftover remaining NTT leftover (250d810)
Immunefi program
wormhole
(already
leftover-logged
as ETH core +
TokenBridge).
Bounty: $1M max,
KYC true.
Official
wormhole-foundation/native-token-transfers
HEAD
250d810.
Extract
/tmp/wh-ntt
via jsDelivr.
No mainnet
writes.
Files:
evm/src/NttManager/NttManager.sol,
evm/src/NttManager/ManagerBase.sol,
evm/src/Transceiver/WormholeTransceiver/WormholeTransceiver.sol,
evm/src/Transceiver/WormholeTransceiver/WormholeTransceiverState.sol.
Checked for: a
stranger
transfer that
burns another
account; a
permissionless
executeMsg
that mints to
the caller; a
stranger
cancelOutboundQueuedTransfer
that unlocks
someone else's
queue; a
receiveMessage
that skips VAA
verification.
Result: no user-exploitable finding. Not submitted.
transferpullsmsg.senderviasafeTransferFromthen locks or burns.attestationReceivedisonlyTransceiver.executeMsgis permissionless after peer verification and mints / unlocks to the recordedto.completeInboundQueuedTransferis permissionless after the rate-limit window and pays the queued recipient.cancelOutboundQueuedTransferrequiresqueuedTransfer.sender == msg.sender.WormholeTransceiver.receiveMessageverifies a Wormhole VAA then delivers to the manager.
Do not file permissionless execute of a transceiver-attested NTT message to the recorded recipient.
Not submitted.
Payment requires
user KYC.
Remaining listed:
circle-integration
2342025
(now leftover-
logged);
other-chain NTT
(Solana /
Sui);
Relayer 404.
2026-09-03: Metronome leftover ETH deposit + debt leftover (Sourcify)
Immunefi program
metronome
($50,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
DepositToken
0x2A464773816CE3C827AcC772476Aa63fBe8F8C32,
DebtToken
0x6e452fD473A0D79A1214511aF0DDEbDb3d00aAde,
NativeTokenGateway
0x10DA15606f98a9c12D1f7e62d88e123D164E1Ce1,
Treasury
0xBB40D96aB45f13904737b6261fbfc48b1F245573,
SmartFarmingManager
0x5772Ad340EeE69123C8e87E152C0C9a0E021Cdb8.
Pool proxy impl
0x0078253265Ca73EB2e81D20920365995F63F7bf8.
MsUSD synth impl
0x206b88b20D9b2709153Ab596aDd007b21124eB26.
AMO impl
0x3B98566F90119b87205Ee64cb9F2dA37E7b3FefA.
Extract
/tmp/metro-deposit,
/tmp/metro-debt,
/tmp/metro-gateway,
/tmp/metro-treasury,
/tmp/metro-sfm,
/tmp/metro-pool,
/tmp/metro-synth,
/tmp/metro-amo.
No mainnet
writes.
Files:
contracts/DepositToken.sol,
contracts/DebtToken.sol,
contracts/NativeTokenGateway.sol,
contracts/Treasury.sol,
contracts/SmartFarmingManager.sol,
contracts/Pool.sol,
contracts/SyntheticToken.sol,
contracts/AMO.sol.
Checked for: a
stranger
deposit that
pulls another
account; a
withdraw that
burns another
holder; a
stranger
issue /
flashIssue
that mints
synth without
collateral; a
repay that
burns another
user's synth; a
stranger
Treasury.pull;
a
permissionless
AMO mint.
Result: no user-exploitable finding. Not submitted.
DepositToken.depositpullsmsg.senderand mints toonBehalfOf_.withdrawburnsmsg.sender.withdrawFrom/flashWithdraware SmartFarmingManager only.DebtToken.issuechecksdebtPositionOf(msg.sender).flashIssue/mintare SmartFarmingManager only.repayburns synth frommsg.sender.- Gateway
depositwrapsmsg.valueand deposits formsg.sender.withdrawpulls the caller's deposit tokens. Treasury.pullisonlyIfDepositToken.SyntheticToken.mint/burnare OFT / AMO / Pool / DebtToken only.AMO.mintAndDepositisonlyAuthorized.Pool.liquidaterequires an unhealthy position and pays the liquidator the seized bonus.
Do not file liquidation of an unhealthy position or deposit-to-named receiver.
Not submitted. Payment requires user KYC. Remaining listed: OP / Base twins (now leftover- logged); CrossChainDispatcher / ProxyOFT / Quoter (now leftover- logged).
2026-09-03: Glo Dollar leftover USDGLO leftover (Sourcify)
Immunefi program
glodollar
($50,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
impl
0xF8Dbe4f52b7d4fe90CD360AA4f49B7A66783C56f
is
GloDollarV3
(same impl
listed on
Polygon).
Extract
/tmp/glo-impl.
No mainnet
writes.
Files:
contracts/v3/USDGLO_V3.sol.
Checked for: a
stranger
mint /
burn; a
permissionless
denylist or
upgrade; a
transfer that
bypasses pause
/ denylist.
Result: no user-exploitable finding. Not submitted.
mintisMINTER_ROLEand mints toto.burnisMINTER_ROLEand burns_msgSender.denylist/destroyDenylistedFundsareDENYLISTER_ROLE. Pause isPAUSER_ROLE. Upgrade isUPGRADER_ROLE.
Do not file role-gated stablecoin mint or denylist privilege.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens is exhausted at this money-path level.
2026-09-03: The Graph leftover ETH L1 staking leftover (Sourcify)
Immunefi program
thegraph
($50,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
L1Staking proxy
0xF55041E37E12cD407ad00CE2910B8269B01263b9
impl
0x20a14D78848BC8B3F3d4B77239F2adC3C0259A10.
RewardsManager
proxy
0x9Ac758AB77733b4150A901ebd659cbF8cB93ED66
impl
0xD92944C84826Be7d1D168B239D30AF4583E085e5.
GRT
0xc944E90C64B2c07662A292be6244BDf05Cda44a7.
Extract
/tmp/graph-stake,
/tmp/graph-rewards,
/tmp/graph-grt.
No mainnet
writes.
Files:
contracts/staking/Staking.sol,
contracts/staking/L1Staking.sol,
contracts/rewards/RewardsManager.sol,
GraphToken.sol.
Checked for: a
stranger
stake that
pulls another
account; a
withdraw that
pays the
caller
someone else's
thawed GRT; a
stranger
transferStakeToL2;
a
permissionless
takeRewards
that mints to
the caller.
Result: no user-exploitable finding. Not submitted.
stakeTopulls GRT frommsg.senderand credits_indexer.unstake/withdrawbindmsg.sender.collectis authorized asset-holder only.takeRewardsis staking contract only and mints to staking.transferStakeToL2/transferDelegationToL2bindmsg.senderas indexer / delegator.GraphToken.mintisonlyMinter.
Do not file stake-to-named indexer or staking-gated reward mint.
Not submitted. Payment requires user KYC. Remaining listed: Arbitrum HorizonStaking / PaymentsEscrow / BillingConnector (now leftover- logged); L2 gateway 404; Curation / DisputeManager / SubgraphService.
2026-09-03: Kleidi leftover ETH Safe + timelock leftover (Sourcify)
Immunefi program
kleidi
($50,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
InstanceDeployer
0xE138136bFF8c6A9337805DE19177E3b29fef2783,
Guard
0xFE49DD6d0CD41C4EC8F151C79f2d4019f5C5AD18,
TimelockFactory
0xCe90BA68BbcdCCe9aed1fCDDcb114d1DCdBc68C9,
RecoverySpellFactory
0x56b6d03b995022A612aF6a212C74902f233F52Cc.
Same addresses
on Base and
Optimism. Extract
/tmp/kleidi-deployer,
/tmp/kleidi-guard,
/tmp/kleidi-tl,
/tmp/kleidi-rec.
No mainnet
writes.
Files:
src/InstanceDeployer.sol,
src/Guard.sol,
src/Timelock.sol,
src/TimelockFactory.sol,
src/RecoverySpell.sol,
src/RecoverySpellFactory.sol.
Checked for: a
stranger
createSystemInstance
that steals the
Safe; a
permissionless
schedule of an
unscheduled op;
a stranger
executeWhitelisted
without the hot
signer role; a
stranger
executeRecovery
without owner
sigs.
Result: no user-exploitable finding. Not submitted.
createSystemInstanceCREATE2 salt is bound to instance params. A front-run of the same salt lands the same Safe with the factory as owner; the factory assertsisOwner(address(this)).- Timelock
schedule/scheduleBatch/cancelareonlySafe.execute/executeBatchare permissionless after the delay of a Safe-scheduled op. executeWhitelisted/executeWhitelistedBatchareonlyRole(HOT_SIGNER_ROLE)aftercheckCalldata.- Guard
checkTransactionblocks self-calls with payload or value and blocks delegatecall. RecoverySpell.executeRecoveryis permissionless after delay +recoveryThresholdunique owner ECDSA sigs; then rewrites Safe owners via module calls.
Do not file permissionless execute of a Safe-scheduled timelock op or permissionless recovery after valid owner sigs + delay.
Not submitted. Payment requires user KYC. Remaining listed: none at the opened-contract level (same bytecode on Base / OP); AddressCalculation if not covered.
2026-09-03: Wormhole leftover remaining circle-integration leftover (2342025)
Immunefi program
wormhole
($1,000,000,
kyc: true).
Already leftover-
logged as ETH
core + TokenBridge
and remaining NTT.
Official
wormhole-foundation/wormhole-circle-integration
HEAD
2342025.
jsDelivr extract
/tmp/wh-circ.
No mainnet
writes.
Files:
CircleIntegration.sol,
CircleIntegrationImplementation.sol,
CircleIntegrationGovernance.sol,
CircleIntegrationGetters.sol,
CircleIntegrationSetters.sol,
CircleIntegrationMessages.sol.
Checked for: a
stranger
transferTokensWithPayload
that pulls
another
account; a
permissionless
redeemTokensWithPayload
that mints to
the caller.
Result: no user-exploitable finding. Not submitted.
transferTokensWithPayloadrequiresmsg.value == wormholeFee.custodyTokenssafeTransferFrommsg.sender. Then CircledepositForBurnWithCallerto recordedmintRecipient.redeemTokensWithPayloadverifies a Wormhole VAA- registered
emitter +
unused hash;
requires
msg.sender == mintRecipient; then CirclereceiveMessageto mint to that recipient.
- registered
emitter +
unused hash;
requires
Do not file
permissionless
redeem of a
VAA + Circle-
attested burn
to the
recorded
mintRecipient
(caller must
be that
recipient).
Not submitted. Payment requires user KYC. Remaining listed: Relayer 404 / other-chain NTT (Solana / Sui).
2026-09-03: Ante Finance leftover ETH pool leftover (Sourcify)
Immunefi program
antefinance
($25,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
factory
0xa03492a9a663f04c51684a3c172fc9c4d7e02edc
is
AntePoolFactory.
Pool
0xE48f6A36f3712E389ce666BCEcD88BA60c30aE50
is
AntePool.
Other listed
pools are the
same
AntePool
bytecode.
Extract
/tmp/ante-factory,
/tmp/ante-pool.
No mainnet
writes.
Files:
contracts/AntePoolFactory.sol,
contracts/AntePool.sol.
Checked for: a
stranger
stake that
credits
another
account; a
withdrawStake
that pays the
caller someone
else's delayed
ETH; a
stranger
checkTest
without being
a challenger;
a
permissionless
claim of
another
challenger's
payout.
Result: no user-exploitable finding. Not submitted.
stakecreditsmsg.valuetoside.userInfo[msg.sender].unstake/unstakeAll/withdrawStake/cancelPendingWithdrawbindmsg.sender.withdrawStakepaysmsg.senderafter a 24h delay.checkTestis challenger- only after a 12-block delay; on failure setsverifier = msg.senderandpendingFailure.claimrequirespendingFailureand challengerstartAmount; pays_calculateChallengerPayouttomsg.sender.
Do not file
challenger-
claimed payout
after a failed
Ante test or
stake of
msg.value.
Not submitted. Payment requires user KYC. Remaining listed: other listed Ante Pool addresses (same type).
2026-09-03: YO Protocol leftover yoVault leftover (Sourcify)
Immunefi program
yo-protocol
($10,000,
kyc: true).
Unique unused
standing program.
Sourcify Base
8453 yoVault
impl
0xfd62e454a75357b039fed34a0c92b60ef115c713
is
yoVault.
YOGateway impl
0x0cf9a84bb9e916229f3037dc079ef418b97bb0cf
is
YoGateway.
Proxies: yoETH
0x3a43aec53490cb9fa922847385d82fe25d0e9de7,
yoBTC
0xbCbc8cb4D1e8ED048a6276a5E94A3e952660BcbC,
yoUSD
0x0000000f2eb9f69274678c76222b35eec7588a65,
YOGateway
0xF1EeE0957267b1A474323Ff9CfF7719E964969FA.
Extract
/tmp/yo-vault,
/tmp/yo-gw.
No mainnet
writes.
Files:
src/yoVault/yoVault.sol,
src/YoGateway.sol.
Checked for: a
stranger
deposit that
pulls another
account; a
withdraw /
redeem that
pays the
caller someone
else's shares;
a stranger
requestRedeem
of another
owner; a
stranger
fulfillRedeem
without auth.
Result: no user-exploitable finding. Not submitted.
yoVault.deposit/mintare stock 4626 + pause;_deposittakes a fee tofeeRecipient.withdraw/redeemrevertUseRequestRedeem().requestRedeemrequiresowner == msg.senderand `balanceOf(owner)= shares
. Instant redeem when the vault has enough assets; otherwise shares move to the vault and a pending request is stored forreceiver`.fulfillRedeem/cancelRedeem/onUnderlyingBalanceUpdatearerequiresAuth.YoGateway.depositsafeTransferFrommsg.senderthen vaultdeposittoreceiver.YoGateway.redeempulls shares frommsg.senderthenrequestRedeem(shares, receiver, address(this)).
Do not file
4626 deposit
to a named
receiver or
owner-only
requestRedeem.
Not submitted. Payment requires user KYC. Remaining listed: multisig / website.
2026-09-03: Autonolas leftover ETH Depository + Treasury leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
Depository
0xfF8697d8d2998d6AA2e09B405795C6F4BEeB0C81,
Treasury
0xa0DA53447C0f6C4987964d8463da7e6628B30f82,
OLAS
0x0001A500A6B18995B03f44bb040A5fFc28E45CB0,
Dispenser
0x5650300fCBab43A0D7D02F8Cb5d0f039402593f0.
Extract
/tmp/olas-dep,
/tmp/olas-treasury,
/tmp/olas-token,
/tmp/olas-dispenser.
No mainnet
writes.
Files:
contracts/Depository.sol,
contracts/Treasury.sol,
contracts/OLAS.sol,
contracts/Dispenser.sol.
Checked for: a
stranger
deposit that
pulls another
account; a
redeem that
pays the
caller someone
else's matured
bond; a
stranger
withdraw of
treasury
reserves; a
permissionless
mint of OLAS.
Result: no user-exploitable finding. Not submitted.
Depository.depositrecords the bond tomsg.senderthenTreasury.depositTokenForOLASwhich is depository- only andtransferFromthe recorded account.redeemrequiresmapUserBonds[id].account == msg.senderafter maturity and transfers OLAS tomsg.sender.Treasury.withdrawisowner-only.withdrawToAccountis dispenser- only.rebalanceTreasuryis tokenomics- only.drainServiceSlashedFundsisowner-only.OLAS.mintisminter-only.burnburnsmsg.sender.Dispenser.claimOwnerIncentivesaccountsmsg.senderunits then paysmsg.sender.claimStakingIncentivesis permissionless and deposits minted OLAS to the recorded staking target.
Do not file owner-only treasury withdraw, minter-gated OLAS mint, or permissionless claim of staking incentives to the recorded target.
Not submitted. Payment requires user KYC. Remaining listed: L2 dispensers / veOLAS / Bridge2Burner (now leftover- logged); marketplace / registries (now leftover- logged); ServiceRegistry / ServiceManager / governance / LiquidityManager / Tokenomics.
2026-09-03: Zerion leftover ETH Premium Purchaser leftover (Sourcify)
Immunefi program
zerion
($25,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
0x1AB3747DA0F88E883895DE58c105Fd25C21491ce
is
PurchaserL1.
Same address
on many L2s.
Extract
/tmp/zerion-prem.
No mainnet
writes.
Files:
contracts/purchaser/Purchaser.sol,
contracts/purchaser/PurchaserL1.sol,
contracts/shared/InputHandler.sol.
Checked for: a
stranger
purchasePremium
that pulls
another
account; a
permissionless
mintAndPurchasePremium
that mints DNA
to the caller.
Result: no user-exploitable finding. Not submitted.
purchasePremium/requestPremiumhandleInputfrommsg.senderto the owner- setbeneficiary. The signature is emitted, not verified on-chain.mintAndPurchasePremiumisonlyOwnerand mints DNA toreceiver.setBeneficiaryisonlyOwner.
Do not file purchase that pulls the caller's tokens to the configured beneficiary.
Not submitted. Payment requires user KYC. Remaining listed: other-chain same purchaser / zkSync variant / Paymaster / websites / apps.
2026-09-03: NUVA leftover ETH depositor + withdrawal leftover (Sourcify)
Immunefi program
nuva
($40,000,
kyc: true).
Unique unused
standing program.
Sourcify ETH
Depositor
0xCB74517bfDe9Af6692C5C7D4A125b20bA7FA14D5,
Withdrawal
0xBB2f90A20AbC107161c0C66e2f7015bdb1D2c2f9,
nvYLDS token
0x5965f8e28eC14B58E49569f382A50F4f0B238327
is
CustomToken.
nvPRIME vault
proxy
0xC360e625F19A7ea47e47810B13E386221d5187D1
impl
0x7aBb7b7cA500BcEb4F1936820Bf34D7481b9A652
(Sourcify
404).
Router proxy
0x50AE1e4A612A4623b747aEeFb30aFBA82804e12c
impl
0x027207E16E2BB920dc89AA9FeF7826e23091588a
(Sourcify
404).
Extract
/tmp/nuva-dep,
/tmp/nuva-wd,
/tmp/nuva-token.
No mainnet
writes.
Files:
contracts/Depositor.sol,
contracts/Withdrawal.sol,
contracts/CustomToken.sol.
Checked for: a
stranger
deposit that
pulls another
account
without a
permit; a
withdraw
that spends
someone else's
shares; a
permissionless
mint.
Result: no user-exploitable finding. Not submitted.
Depositor.depositrequires an AML ECDSA overmsg.sender- amount +
destination +
deadline then
safeTransferFrommsg.senderto an allowlisted destination.
- amount +
destination +
deadline then
depositWithPermitis the same plus apermitfrommsg.sender.Withdrawal.withdrawrequires an AML ECDSA overmsg.sender- amount +
deadline then
pulls shares
from
msg.sender.burnisBURN_ROLE.
- amount +
deadline then
pulls shares
from
CustomToken.mintisMINTER_ROLEand mints toto.burnburns_msgSender.burnFromspends allowance.
Do not file AML-signed deposit of the caller's tokens to an allowlisted destination or role-gated mint / burn.
Not submitted. Payment requires user KYC. Remaining listed: vault / router impls 404 / Provenance vaults / website.
2026-09-03: KAST leftover Solana USDK/USDKY extension leftover (c22b6b8)
Immunefi program
KAST
($50,000,
kyc: true).
Unique unused
standing program.
Official
m0-foundation/solana-m-extensions
HEAD
c22b6b89.
Extract
/tmp/kast.
No mainnet
writes.
Files:
programs/m_ext/src/instructions/wrap.rs,
programs/m_ext/src/instructions/unwrap.rs,
programs/m_ext/src/instructions/claim_fees.rs,
programs/ext_swap/src/instructions/swap.rs.
Checked for: a
stranger
wrap that
mints extension
tokens without
pulling M; a
unwrap that
pays M without
burning the
caller's
extension
tokens; a
stranger
claim_fees.
Result: no user-exploitable finding. Not submitted.
wraprequires awrap_authoritiessigner. The token program pulls M fromfrom_m_token_accountusingtoken_authoritythen mints ext toto_ext_token_account.unwraprequires a wrap-authority signer. The token program burns ext fromfrom_ext_token_accountusingtoken_authoritythen sends M from the vault PDA toto_m_token_account.claim_feesisadmin-only.ext_swap.swapunwraps the signer's from ext into the swap M account then wraps that M intoto_token_accountvia CPI to whitelisted extension programs.
Do not file authority- gated wrap / unwrap of the signer's tokens or admin fee claim.
Not submitted. Payment requires user KYC. Remaining listed: none at the opened-program level.
2026-09-03: XOXNO leftover MultiversX lending leftover (bffbbd9 / 2e8c81d)
Immunefi program
xoxno
($50,000,
kyc: true).
Unique unused
standing program.
Official
XOXNO/rs-lending
HEAD
bffbbd92
and
XOXNO/rs-liquid-staking-sc
HEAD
2e8c81d9.
Extract
/tmp/xoxno,
/tmp/xoxno-ls.
No mainnet
writes.
Files:
controller/src/lib.rs,
controller/src/positions/account.rs,
controller/src/positions/liquidation.rs,
liquidity_layer/src/liquidity.rs,
liquid-staking/src/lib.rs.
Checked for: a
stranger
withdraw /
borrow of
another
account; a
liquidate of
a healthy
position; a
stranger
withdraw of
someone else's
unbonded EGLD.
Result: no user-exploitable finding. Not submitted.
- Controller
supplycredits the caller aftervalidate_supply_payment.withdraw/borrowrequire the account NFT viavalidate_account. repaypays down a named account with the caller's transfers.liquidaterequires health factor < 1.0 then seizes collateral for the liquidator.- Liquidity
layer
borrow/withdraw/repayareonly_owner(the controller). - Liquid
staking
delegateusescall_valueEGLD forget_caller.unDelegateburns the paid LS tokens.withdrawburns the caller's matured unstake tokens and paysget_caller.
Do not file NFT-gated withdraw / borrow, anyone repay of a named account, or liquidation of an unhealthy position.
Not submitted. Payment requires user KYC. Remaining listed: common utils (shared types) already opened with the controller.
2026-09-03: OpenZeppelin leftover Stellar packages leftover (v0.7.2)
Immunefi program
openzeppelin-stellar
($25,000,
kyc: true).
Unique unused
standing program.
Official
OpenZeppelin/stellar-contracts
tag
v0.7.2
(a9c42169).
Extract
/tmp/oz-stellar.
No mainnet
writes.
Files:
packages/tokens/src/fungible/storage.rs,
packages/tokens/src/vault/storage.rs,
packages/tokens/src/vault/mod.rs.
Checked for: a
stranger
transfer that
moves another
account's
tokens; a
vault
withdraw /
redeem that
burns someone
else's shares
without
allowance.
Result: no user-exploitable finding. Not submitted.
- Fungible
transferrequiresfrom.require_auth().transfer_fromrequiresspender.require_auth()and spends allowance. - Vault
deposit/mint/withdraw/redeemrequireoperator.require_auth().deposit_internalpullsfromviatransferortransfer_from.withdraw_internalspends share allowance whenoperator != ownerthen paysreceiver. - Trait wrappers document that higher-level contracts must add authorization.
Do not file
operator-gated
vault
deposit /
withdraw or
from-authed
fungible
transfer.
Not submitted. Payment requires user KYC. Remaining listed: RWA / governance / accounts (now leftover- logged).
2026-09-03: Autonolas leftover remaining L2 dispenser + veOLAS leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Already leftover-
logged as ETH
Depository +
Treasury.
Sourcify
Polygon
0x17d96ba4532fe91809326092fE4D5606A7B7a0d8
is
PolygonTargetDispenserL2.
Optimism
0xaea9ef993d8a1A164397642648DF43F053d43D85
is
OptimismTargetDispenserL2.
ETH veOLAS
0x7e01A500805f8A52Fad229b3015AD130A332B7b3.
Extract
/tmp/olas-poly-disp,
/tmp/olas-op-disp,
/tmp/olas-ve.
No mainnet
writes.
Files:
contracts/staking/DefaultTargetDispenserL2.sol,
contracts/staking/PolygonTargetDispenserL2.sol,
contracts/staking/OptimismTargetDispenserL2.sol,
contracts/veOLAS.sol.
Checked for: a
stranger
redeem that
deposits OLAS
to an
unqueued
target; a
processDataMaintenance
without owner;
a
withdraw of
someone else's
expired lock.
Result: no user-exploitable finding. Not submitted.
_receiveMessagerequires the configured L2 relayer and L1 processor then_processData.processDataMaintenanceisowner-only.redeemis permissionless after a queuedtarget+amount+batchHashand deposits OLAS to that recorded target.veOLAS.createLock/increaseAmountpullmsg.sender.createLockForlocks foraccountbut stilltransferFrommsg.sender.withdrawpaysmsg.senderafter expiry.
Do not file permissionless redeem of a queued L2 staking batch to the recorded target or lock-for-named account with the caller's OLAS.
Not submitted. Payment requires user KYC. Remaining listed: Bridge2Burner (now leftover- logged); marketplace / registries (now leftover- logged); ServiceRegistry / ServiceManager / governance / LiquidityManager / Tokenomics.
2026-09-03: Pragma leftover cairo oracle leftover (83094b9)
Immunefi program
pragmaoracle
($50,000,
kyc: true).
Unique unused
standing program.
Official
Astraly-Labs/pragma-oracle
HEAD
83094b93.
Voyager
oracle /
PublisherRegistry
/
TWAP listed.
Extract
/tmp/pragma-oracle.
No mainnet
writes.
Files:
pragma-oracle/src/oracle/oracle.cairo,
pragma-oracle/src/publisher_registry/publisher_registry.cairo,
pragma-oracle/src/erc4626/erc4626.cairo.
Checked for: a
stranger
publish_data
as an
unregistered
publisher; a
stranger
add_publisher;
a live
erc4626
withdraw of
someone else's
assets.
Result: no user-exploitable finding. Not submitted.
publish_datarequiresvalidate_sender_for_source: caller must be the registered publisher address and allowed for that source.add_publisheris admin-only.update_publisher_addressrequirescaller == existing_publisher_address.- Listed
erc4626deposit / mint / withdraw / redeem are stubs that return 0. Getters are view.
Do not file publisher- gated oracle writes or admin registry updates.
Not submitted. Payment requires user KYC. Remaining listed: TWAP / randomness (now leftover- logged); website (Astraly-Labs/Pragma is the marketing site).
2026-09-03: Autonolas leftover remaining Bridge2Burner + BuyBack leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Already leftover-
logged as ETH
Depository +
Treasury and
L2 dispenser +
veOLAS.
Sourcify
Polygon
Bridge2Burner
0xE6e03DD62D11f88A11D65663B398ED2B3Be2070c,
Optimism
Bridge2Burner
0x820ca542d5876FDEf240584F6f3924852D527FED,
ETH Burner
0x51eb65012ca5cEB07320c497F4151aC207FEa4E0,
ETH
BuyBackBurnerUniswap
0xCF05126771A21a93Da5A596d5CF67d8Ed9F5e6e5.
Extract
/tmp/olas-b2b-poly,
/tmp/olas-b2b-op,
/tmp/olas-burner,
/tmp/olas-buyback.
No mainnet
writes.
Files:
contracts/Bridge2Burner.sol,
contracts/Bridge2BurnerOptimism.sol,
contracts/Burner.sol,
contracts/BuyBackBurner.sol.
Checked for: permissionless relay of another account's OLAS; permissionless burn of another account's OLAS; permissionless buy-back that spends another account's tokens.
Result: no user-exploitable finding. Not submitted.
- Polygon
relayToL1Burneris permissionless afterMIN_OLAS_BALANCE(100 ether) andtransfers this contract's OLAS to the L2 bridge mediator (l2TokenRelayer). - Optimism
relayToL1Burneris permissionless after the same minimum and routes this contract's OLAS to the hardcoded L1OLAS_BURNER0x51eb65012ca5cEB07320c497F4151aC207FEa4E0. Burner.burnis permissionless and burns this contract's OLAS viaIToken(olas).burn.BuyBackBurner.buyBackis permissionless; it swaps this contract's second-token balance for OLAS thentransfers OLAS tobridge2Burner. It does not pull user tokens.
Do not file
permissionless
buyBack of
contract-owned
tokens to
bridge2Burner,
permissionless
relayToL1Burner
of
contract-owned
OLAS above
min balance,
or
permissionless
burn of
Burner-held
OLAS.
Not submitted. Payment requires user KYC. Remaining listed: marketplace / registries (now leftover- logged); remaining ServiceRegistry / ServiceManager / governance / LiquidityManager / Tokenomics. Gnosis / Arbitrum Bridge2Burner and Polygon BuyBackBurnerBalancer are same-type twins of this leftover.
2026-09-03: The Graph leftover remaining Arb Horizon + payments leftover (Sourcify)
Immunefi program
thegraph
($50,000,
kyc: true).
Already leftover-
logged as ETH
L1 staking.
Sourcify
Arbitrum
HorizonStaking
proxy
0x00669A4CF01450B64E8A2A20E9b1FCB71E61eF03
(impl
0xD3Ba4a3BC240883A42819D0Fa662148f9f035Ea1),
PaymentsEscrow
proxy
0xf6Fcc27aAf1fcD8B254498c9794451d82afC673E
(impl
0x59678950D4766f90C916A82E658B65781228609F),
GraphPayments
proxy
0x7Aae8ae011927BC36Cb4d0d3e81f2E6E30daE06D
(impl
0x6BC86e5D64C6c4882670804ca7eE4919cCCca86a),
Billing
0x1B07D3344188908Fb6DEcEac381f3eE63C48477a,
ETH
BillingConnector
0x8017B9AF3F199CC6b08A48DA3859410F20bbea72,
ETH
L1GraphTokenGateway
proxy
0x01cDC91B0A9bA741903aA3699BF4CE31d6C5cC06
(impl
0xD41ca6A1d034D178c196DFa916f22f7D1a1B8222).
Extract
/tmp/graph-horizon-impl,
/tmp/graph-escrow-impl,
/tmp/graph-payments-impl,
/tmp/graph-billing,
/tmp/graph-billconn,
/tmp/graph-l1gw-impl.
No mainnet
writes.
Files:
contracts/HorizonStaking.sol,
contracts/PaymentsEscrow.sol,
contracts/GraphPayments.sol,
contracts/Billing.sol,
contracts/L1BillingConnector.sol,
contracts/L1GraphTokenGateway.sol.
Checked for: stake that spends another account's GRT; withdraw of another account's stake; escrow collect of another collector's funds; gateway finalize to an attacker-chosen recipient.
Result: no user-exploitable finding. Not submitted.
HorizonStaking.stake/stakeTo_graphToken().pullTokens(msg.sender, tokens)then credit the named provider.unstakeunstakesmsg.senderidle stake and paysmsg.sender.withdraw/forceWithdrawpay recorded__DEPRECATED_tokensLockedto the service provider (legacy pre-Horizon thaw).PaymentsEscrow.deposit/depositTo_depositcredits the named payer tuple butpullTokens(msg.sender).thaw/withdrawbindescrowAccounts[msg.sender].collectspendsescrowAccounts[payer][msg.sender][receiver](collector ismsg.sender).GraphPayments.collectpullTokens(msg.sender)then splits protocol / data-service / delegation / receiver.L1GraphTokenGateway.outboundTransfertransferFrom(from, escrow)wherefromis the router-encoded sender ormsg.sender.finalizeInboundTransferisonlyL2Counterpartand pays recorded_to.Billing.addTopullsmsg.sender.removespendsuserBalances[msg.sender].removeFromL1isonlyL1BillingConnector.BillingConnector.addToL2pullsmsg.sender.
Do not file
stake-to-named
provider,
permissionless
forceWithdraw
of recorded
legacy thawed
tokens to the
service
provider,
collector-gated
escrow
collect,
or
counterpart-gated
gateway
finalize to
recorded
_to.
Not submitted. Payment requires user KYC. Remaining listed: L2GraphTokenGateway 404 / Curation / DisputeManager / SubgraphService (now leftover- logged); L2GNS / AllocationExchange / GraphTallyCollector.
2026-09-03: Serai leftover bitcoin-serai leftover (4b89cf02)
Immunefi program
serai
($30,000,
kyc: true).
Unique unused
standing program.
Listed assets
are crypto
crates plus
networks/bitcoin
plus primacy
of impact.
Official
serai-dex/serai
develop
HEAD
4b89cf0206184886e96d0663861596312e5b47d2.
Extract
/tmp/serai
(networks/bitcoin/src/{lib,crypto,rpc,wallet/mod,wallet/send}.rs).
No mainnet
writes.
Files:
networks/bitcoin/src/lib.rs,
networks/bitcoin/src/crypto.rs,
networks/bitcoin/src/rpc.rs,
networks/bitcoin/src/wallet/mod.rs,
networks/bitcoin/src/wallet/send.rs.
Checked for: a stranger spending another account's Bitcoin without threshold key shares.
Result: no user-exploitable finding. Not submitted.
wallet/send.rsTransactionSignMachine::signis FROST threshold signing of a constructed Bitcoin tx;completeaggregates shares. No stranger can spend without threshold keys.rpc.rssend_raw_transactionbroadcasts a signed tx (library / RPC helper only). There is no on-chain EVM money path in this leftover.
Do not file FROST threshold signing of a constructed Bitcoin tx.
Not submitted.
Payment requires
user KYC.
Remaining listed:
listed crypto
crates
(now leftover-
logged after
## Next candidates
as Serai
leftover listed
crypto +
bitcoin leftover);
primacy of
impact.
2026-09-03: Autonolas leftover remaining marketplace leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Already leftover-
logged as ETH
Depository +
Treasury, L2
dispenser +
veOLAS, and
Bridge2Burner +
BuyBack.
Sourcify ETH
MechMarketplace
impl
0x6B149a00E40cC6C148992C6AADd232d958C35Fa3,
MechMarketplaceProxy
0x3d6494CE09a9f40c0B5a92BdBD7c7A9b0e3912b1,
Karma
0xB01B4154047e51F01b22017079367341ea73d744,
KarmaProxy
0xf0B1Fc3A3D412Ea73136925B831D6203De310650,
MechFactoryFixedPriceToken
0xF95BfBBA428dfb454Cd59C9c2d309bd6452d12A8,
MechFactoryFixedPriceNative
0x3515a36AF270070635Fa3E957e006aaF6078e658,
BalanceTrackerFixedPriceToken
0x897aee2e6F3d37740D334C55Caea2e0caC82aa14,
BalanceTrackerFixedPriceNative
0x528befb0F8c6a988C9F42345DA6d053d66b3B9B6,
AgentRegistry
0x2F1f7D38e4772884b88f3eCd8B6b9faCdC319112,
ComponentRegistry
0x15bd56669F57192a97dF41A2aa8f4403e9491776,
RegistriesManager
0x9eC9156dEF5C613B2a7D4c46C383F9B58DfcD6fE,
StakingFactory
0xEBdde456EA288b49f7D5975E7659bA1Ccf607efc.
Extract
/tmp/olas-mech-impl,
/tmp/olas-mech-proxy,
/tmp/olas-karma,
/tmp/olas-karma-proxy,
/tmp/olas-mechfact-token,
/tmp/olas-mechfact-native,
/tmp/olas-bal-token,
/tmp/olas-bal-native,
/tmp/olas-agent-reg,
/tmp/olas-comp-reg,
/tmp/olas-reg-mgr,
/tmp/olas-stake-fact.
No mainnet
writes.
Files:
contracts/MechMarketplace.sol,
contracts/BalanceTrackerBase.sol,
contracts/mechs/native/BalanceTrackerFixedPriceNative.sol,
contracts/mechs/token/BalanceTrackerFixedPriceToken.sol,
contracts/Karma.sol,
contracts/UnitRegistry.sol,
contracts/staking/StakingFactory.sol.
Checked for: a stranger request that debits another account; permissionless deliver that pays a stranger's balance to the caller; registry create that pulls another account's tokens.
Result: no user-exploitable finding. Not submitted.
MechMarketplace.request/requestBatchrecordrequester = msg.senderand call marketplace-onlycheckAndRecordDeliveryRates{value: msg.value}(msg.sender, ...).createrequiresmsg.senderto be the service owner or service multisig.deliverMarketplacerequirescheckMech(msg.sender).- Native
depositForcredits the named account withmsg.value. Tokendeposit/depositFortransferFrom(msg.sender).processPaymentpaysmsg.sender's mech balance.drainis permissionless ofcollectedFeesto the hardcodeddrainer. UnitRegistry.create/updateHashare manager-only NFT mint / hash update (no token pull).StakingFactory.createStakingInstanceis permissionless CREATE2 of a new proxy (no token pull).Karmais reputation accounting only.
Do not file
marketplace
request that
debits
msg.sender,
deposit-for-named
account that
pulls the
caller, or
permissionless
drain of
already-collected
marketplace
fees to the
recorded
drainer.
Not submitted. Payment requires user KYC. Remaining listed: ServiceRegistry / ServiceManager / Tokenomics / LiquidityManager (now leftover- logged); remaining L2 ServiceRegistry / deposit processors / oracles / proxy 404s.
2026-09-03: The Graph leftover remaining Curation + Dispute leftover (Sourcify)
Immunefi program
thegraph
($50,000,
kyc: true).
Already leftover-
logged as ETH
L1 staking and
Arb Horizon +
payments.
Sourcify ETH
Curation proxy
0x8FE00a685Bcb3B2cc296ff6FfEaB10acA4CE1538
(impl
0xDeb46851907fd85DD475780CcE2eE0D67c969825),
ETH
DisputeManager
proxy
0x97307b963662cCA2f7eD50e38dCC555dfFc4FB0b
(impl
0x444c138bf2B151F28a713b0EE320240365A5BFC2),
Arb L2Curation
proxy
0x22d78fb4bc72e191C765807f8891B5e1785C8014
(impl
0xD6e26e680FeF5cEc449b74298AA98B8CA67eCf96),
Arb
DisputeManager
proxy
0x2FE023a575449AcB698648eD21276293Fa176f96
(impl
0x40B17388b078d24ccC6bd3D3d64E475a7b0383Fb),
Arb
SubgraphService
proxy
0xb2Bb92d0DE618878E438b55D5846cfecD9301105
(impl
0x03a2D29d5CaC0373A73f29c8D03B08e634A86939).
Extract
/tmp/graph-curation-impl,
/tmp/graph-dispute-impl,
/tmp/graph-l2curation-impl,
/tmp/graph-arb-dispute-impl,
/tmp/graph-subgraph-svc-impl.
No mainnet
writes.
Files:
contracts/curation/Curation.sol,
contracts/disputes/DisputeManager.sol,
contracts/l2/curation/L2Curation.sol,
contracts/DisputeManager.sol,
contracts/SubgraphService.sol.
Checked for: mint that spends another account's GRT; burn of another account's signal; dispute deposit that pulls another account; permissionless slash of a healthy indexer.
Result: no user-exploitable finding. Not submitted.
- ETH
Curation.mintpullTokensmsg.senderthen mints signal to the curator.burnrequires the curator to own the signal and paysmsg.sender.collectis staking-only bookkeeping. - L2
Curation.mintis the same pull-from- curator path.mintTaxFreeisonlyGNSand still pullsmsg.sender.collectis SubgraphService- only. - ETH
DisputeManager.createQueryDispute/createIndexingDispute_pullSubmitterDepositfrommsg.sender. Accept / reject / draw are arbitrator-only. - Arb
Horizon
DisputeManagercreate*pullTokens(msg.sender, disputeDeposit). SubgraphService.collectisenforceService(registered indexer).slashisonlyDisputeManager.closeStaleAllocationis permissionless resize-to-zero of a stale non-altruistic allocation (no token steal).
Do not file
curation mint
that pulls
the caller,
burn of the
caller's own
signal,
fisherman
dispute
deposit that
pulls
msg.sender,
or
arbitrator-gated
slash.
Not submitted. Payment requires user KYC. Remaining listed: L2GraphTokenGateway 404 / L2GNS / AllocationExchange / GraphTallyCollector (now leftover- logged); Governor / TokenLockWallet.
2026-09-03: Mars leftover BSC swap + farm leftover (Sourcify)
Immunefi program
marsecosystem
($10,000,
kyc: false).
Unique unused
standing program.
Sourcify BSC
Core
0x00789Cfb69499c65ac9A3a68fb4917c9b4FcA2a7,
MarsSwapFactory
0x6f12482D9869303B998C54D91bCD8bCcba81f3bE,
MarsSwapRouter
0xb68825C810E67D4e444ad5B9DeB55BA56A66e72D,
AirDrop
0x01D152fF991E76b6cb310387c07cAfdFda790a25,
Timelock
0xC35a8BdBB93abFAb362aF6dC3383cD2c6aEA6cBc,
LiquidityMiningMaster
0xc7B8285a9E099e8c21CA5516D23348D8dBADdE4a,
LiquidityMiningMaster
V1.1
0x22D8d50454203bd5a41B49ef515891f1aD9f3e53,
VestingMaster
0x381Facb9282770a5E3Ac6c8637096b442039C3dB.
XMS
0x7859B01BbF675d67Da8cD128a50D155cd881B576
Sourcify 404.
Extract
/tmp/mars-core,
/tmp/mars-factory,
/tmp/mars-router,
/tmp/mars-airdrop,
/tmp/mars-timelock,
/tmp/mars-lm,
/tmp/mars-lm11,
/tmp/mars-vest.
No mainnet
writes.
Files:
contracts/core/Core.sol,
contracts/liquidity/MarsSwapRouter.sol,
contracts/liquidity/LiquidityMiningMaster.sol,
contracts/liquidity/VestingMaster.sol,
contracts/airdrop/AirDrop.sol.
Checked for: farm withdraw of another account's LP; router swap that spends another account; airdrop claim of another account's allocation.
Result: no user-exploitable finding. Not submitted.
Coreis governor-gated role / token wiring. ListedXMSToken.mintin the Core extract isonlyGovernor.- Router
addLiquidity/ swapssafeTransferFrom(msg.sender)or spendmsg.value(Uniswap V2 clone). - Farm
depositsafeTransferFrom(msg.sender)and creditsuserInfo[pid][msg.sender].withdraw/emergencyWithdrawpaymsg.sender. VestingMaster.lockisonlyFarms.claimpays matured locks ofmsg.sender.AirDrop.claimpays the recordeduserClaimed[msg.sender].amountonce.addList/recoverare governor-only.
Do not file Uniswap-style router transfers of the caller, MasterChef deposit / withdraw of the caller's LP, or airdrop claim of the caller's recorded allocation.
Not submitted. Remaining listed: XMS Sourcify 404 / website.
2026-09-03: Autonolas leftover remaining Tokenomics + ServiceRegistry leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Already leftover-
logged as
Depository /
Treasury, L2
dispenser,
Bridge2Burner,
and
marketplace.
Sourcify ETH
Tokenomics
0xaeeC8bC8E5Fe28BC4dF2e9586b222924b8a0d5e9,
TokenomicsProxy
0xc096362fa6f4A4B1a9ea68b1043416f3381ce300,
LiquidityManagerETH
0x0171D7178fbf3B48E75675DEE2EA3EfecEf775C1,
ServiceRegistry
0x48b6af7B12C71f09e2fC8aF4855De4Ff54e775cA,
ServiceManager
0x4443ddD8EC67CbCf7E291ee3198f81dD0326b3A1,
ServiceRegistryTokenUtility
0x3Fb926116D454b95c669B6Bf2E7c3bad8d19affA,
GovernorOLAS
0x060D0CBdDFb0498d610E2EF55C01516B5B1251E6.
ServiceManagerProxy
and
LiquidityManagerProxy
Sourcify 404.
Extract
/tmp/olas-tokenomics,
/tmp/olas-tok-proxy,
/tmp/olas-liq-eth,
/tmp/olas-svc-reg,
/tmp/olas-svc-mgr-impl,
/tmp/olas-svc-util,
/tmp/olas-gov.
No mainnet
writes.
Files:
contracts/Tokenomics.sol,
contracts/pol/LiquidityManagerETH.sol,
contracts/pol/LiquidityManagerCore.sol,
contracts/ServiceRegistry.sol,
contracts/ServiceRegistryTokenUtility.sol.
Checked for: permissionless tokenomics payout of another account; service bond that pulls another owner; POL collect that steals user LP.
Result: no user-exploitable finding. Not submitted.
Tokenomics.checkpointis permissionless epoch close afterepochLenand not in the same block as a donation (flash-loan guard). It rebalances protocol accounting, not user wallets.LiquidityManagerETHmanages protocol-owned Uniswap positions and_burns this contract's OLAS.collectFeesis permissionless of protocol position fees (owner gates config).ServiceRegistry.activateRegistration/registerAgents/terminate/unbondare manager-only and refund the recorded owner / operator.ServiceRegistryTokenUtility.activateRegistrationTokenDepositis manager-only andtransferFromthe service owner.GovernorOLASis Governor-style voting (no user token pull).
Do not file
permissionless
epoch
checkpoint,
permissionless
collectFees
of
protocol-owned
Uniswap
fees, or
manager-gated
service bond
refund to
the recorded
owner.
Not submitted. Payment requires user KYC. Remaining listed: ServiceManagerProxy 404 / LiquidityManagerProxy 404 / L2 ServiceRegistry / deposit processors (now leftover- logged); oracles / VoteWeighting.
2026-09-03: The Graph leftover remaining AllocationExchange + Tally leftover (Sourcify)
Immunefi program
thegraph
($50,000,
kyc: true).
Already leftover-
logged as ETH
L1 staking,
Arb Horizon +
payments, and
Curation +
Dispute.
Sourcify Arb
AllocationExchange
0x993F00C98D1678371a7b261Ed0E0D4b6F42d9aEE,
GraphTallyCollector
0x8f69F5C07477Ac46FBc491B1E6D91E2bb0111A9e.
L2GNS proxy
0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec
is
GraphProxy
(impl
0x9B81c7C5A21E65b849FD487540B0A82d3b97b2c7
not extracted
this leftover).
Extract
/tmp/graph-alloc-ex,
/tmp/graph-tally.
No mainnet
writes.
Files:
contracts/statechannels/AllocationExchange.sol,
contracts/payments/collectors/GraphTallyCollector.sol.
Checked for: permissionless redeem of an unsigned voucher to an attacker; tally collect that drains another payer without an authorized RAV.
Result: no user-exploitable finding. Not submitted.
AllocationExchange.redeemis permissionless after an authority ECDSA voucher. It callsstaking.collectfor the recordedallocationIDand marks it redeemed once.withdrawis governor-only.
rav.dataService`, an authorized RAV signer for the payer, and an active provision. It spends escrow of the signed payer up to the unused aggregate.GraphTallyCollector.collectrequires `msg.sender
Do not file permissionless redeem of an authority-signed allocation voucher or data-service collect of an authorized RAV.
Not submitted. Payment requires user KYC. Remaining listed: L2GraphTokenGateway 404 / L2GNS impl / TokenLockWallet (now leftover- logged); Governor.
2026-09-03: Velvet leftover Base deposit + withdraw leftover (Sourcify)
Immunefi program
velvet-capital-v2
($10,000,
kyc: true).
Unique unused
standing program.
Sourcify Base
DepositBatch
0x6E3e0fe13DAE2C42CCa7ae2E849b0976E2E63e05,
DepositManager
0xe4e23120a38c4348D7e22Ab23976Fa0c4Bf6e2ED,
WithdrawBatch
0xAeaD7d9202f3EFB73657cA031f645c6B46cfe177,
WithdrawManager
0xa9452eAf5AA440790E6CA90e38c10b40fb611e59,
EnsoHandler
0x6eC2A3a88A72943d2E87ed05cDF25914983Ab7F6,
Portfolio
0x3475dD4b852Baf51279A463f0e5F38e5AED2E784.
PortfolioFactory
Sourcify 404.
Extract
/tmp/velvet-dep-batch,
/tmp/velvet-dep-mgr,
/tmp/velvet-wd-batch,
/tmp/velvet-wd-mgr,
/tmp/velvet-enso,
/tmp/velvet-port.
No mainnet
writes.
Files:
contracts/bundle/DepositBatch.sol,
contracts/bundle/DepositManager.sol,
contracts/bundle/WithdrawBatch.sol,
contracts/bundle/WithdrawManager.sol.
Checked for: deposit that spends another account's tokens; withdraw that burns another account's portfolio shares.
Result: no user-exploitable finding. Not submitted.
DepositManager.depositsafeTransferFrom(msg.sender)into DepositBatch thenmultiTokenSwapAndDeposit(..., user=msg.sender).DepositBatch.multiTokenSwapETHAndTransferspendsmsg.valueand refunds leftover ETH tomsg.sender. Named-usermultiTokenSwapAndDepositdeposits tokens already on the batch contract.WithdrawManager.withdrawcallsmultiTokenWithdrawalFor(msg.sender, WITHDRAW_BATCH, amount)then swaps the batch output tomsg.sender.- Enso swaps
are
delegatecallto a hardcoded SWAP_TARGET.
Do not file deposit that pulls the caller or withdraw that burns the caller's portfolio shares.
Not submitted. Payment requires user KYC. Remaining listed: rebalancing / fee / oracle (now leftover- logged); PortfolioFactory 404; website primacy.
2026-09-03: Autonolas leftover remaining L1 deposit processors + L2 ServiceRegistry leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Already leftover-
logged through
Tokenomics +
ServiceRegistry.
Sourcify ETH
EthereumDepositProcessor
0x15CD7fAeE048c7673aB818C9e582630F1a924593,
PolygonDepositProcessorL1
0x7EB5824Bb78e971284e2140059f8755B3d2BB525,
OptimismDepositProcessorL1
0x990aBa4b05adc3761EfAf38FB871b93C7b162D03,
ArbitrumDepositProcessorL1
0xFceFB015372e84FC465Cf2778889ee231a6E2e67,
Polygon
ServiceRegistryL2
0xE3607b00E75f6405248323A9417ff6b39B244b50.
Extract
/tmp/olas-eth-dep,
/tmp/olas-poly-dep,
/tmp/olas-op-dep,
/tmp/olas-arb-dep,
/tmp/olas-svc-l2.
No mainnet
writes.
Files:
contracts/staking/EthereumDepositProcessor.sol,
contracts/staking/DefaultDepositProcessorL1.sol,
contracts/ServiceRegistryL2.sol.
Checked for: permissionless deposit of another account's OLAS to a staking target; L2 service bond that pulls another owner.
Result: no user-exploitable finding. Not submitted.
EthereumDepositProcessor.sendMessage/sendMessageBatchare dispenser-only and deposit this contract's OLAS into factory-verified staking targets (refund excess to timelock).- L1
DefaultDepositProcessorL1.sendMessage/sendMessageBatchare dispenser-only bridge posts; leftover native is refunded totx.origin. ServiceRegistryL2create / activate / terminate / unbond are manager-only and refund the recorded owner / operator (same pattern as ETH ServiceRegistry).
Do not file dispenser-gated staking deposit of contract-owned OLAS or manager-gated L2 service bond refund to the recorded owner.
Not submitted. Payment requires user KYC. Remaining listed: GnosisDepositProcessorL1 if a later pass wants the same-type twin; oracles / VoteWeighting / proxy 404s.
2026-09-03: The Graph leftover remaining L2GNS + TokenLock leftover (Sourcify)
Immunefi program
thegraph
($50,000,
kyc: true).
Already leftover-
logged through
AllocationExchange
- Tally.
Sourcify Arb
L2GNS impl
0x9B81c7C5A21E65b849FD487540B0A82d3b97b2c7(proxy0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec), ETH GraphTokenLockWallet0xbE5e630383b5BAEcF0Db7b15C50d410edD5A2255. Extract/tmp/graph-l2gns-impl,/tmp/graph-lock. No mainnet writes.
Files:
contracts/discovery/GNS.sol,
contracts/l2/discovery/L2GNS.sol,
contracts/GraphTokenLock.sol.
Checked for: mint that spends another account's GRT; withdraw of another curator's deprecated share; release of another beneficiary's vest.
Result: no user-exploitable finding. Not submitted.
GNS.mintSignalpullTokens(msg.sender)and creditscuratorNSignal[msg.sender].burnSignal/withdrawrequire the caller's nSignal and paymsg.sender.transferSignalmoves the caller's nSignal.GraphTokenLock.release/withdrawSurplusareonlyBeneficiary.revokeisonlyOwnerand returns unvested tokens to the owner.
Do not file name-signal mint that pulls the caller, withdraw of the caller's deprecated share, or beneficiary-only vest release.
Not submitted. Payment requires user KYC. Remaining listed: L2GraphTokenGateway 404 / Governor.
2026-09-03: Tetu leftover empty-assets leftover
Immunefi program
tetu
($2,000,
kyc: false).
Unique unused
standing program.
Unofficial
mirror
assets
array is
empty
(rechecked
3 Sep 2026).
No in-scope
smart-contract
or website
URL to open.
Checked for: a listed money path that this pass can review.
Result: no user-exploitable finding. Not submitted. Listed leftover exhausted until Immunefi adds assets.
2026-09-03: Autonolas leftover remaining oracle + VoteWeighting leftover (Sourcify)
Immunefi program
autonolas
($5,000,
kyc: true).
Already leftover-
logged through
L1 deposit
processors.
Sourcify
Polygon
BalancerPriceOracle
0x43117542A48588be59018A16443Ae75942ffDe91,
ETH VoteWeighting
0x95418b46d5566D3d1ea62C12Aea91227E566c5c1,
ETH
GnosisDepositProcessorL1
0x48d4631f24dAce505c04D5A39458BED209e80A3c.
UniswapPriceOracle
Sourcify 404.
Extract
/tmp/olas-bal-oracle,
/tmp/olas-vote-w,
/tmp/olas-gnosis-dep.
No mainnet
writes.
Files:
contracts/oracles/BalancerPriceOracle.sol,
contracts/VoteWeighting.sol,
contracts/staking/DefaultDepositProcessorL1.sol.
Checked for: oracle write that moves user OLAS; vote that spends another account's veOLAS.
Result: no user-exploitable finding. Not submitted.
BalancerPriceOracleis a permissionless TWAP observer of vault balances (no token transfer).VoteWeighting.voteForNomineeWeightsusesveOLAS.getLastUserPoint(msg.sender)and the caller's lock end. No token pull.- Gnosis
DepositProcessorL1is the same dispenser-onlysendMessagetwin as the previous leftover.
Do not file
permissionless
TWAP
updatePrice
or
veOLAS-weighted
gauge voting
by the
caller.
Not submitted. Payment requires user KYC. Remaining listed: UniswapPriceOracle 404 / VoteWeighting is leftover- logged / listed Autonolas smart-contract leftover that Sourcify opens is exhausted except proxy 404s.
2026-09-03: The Graph leftover remaining Governor leftover (Sourcify)
Immunefi program
thegraph
($50,000,
kyc: true).
Already leftover-
logged through
L2GNS +
TokenLock.
Sourcify ETH
Governor
0x74Db79268e63302d3FC69FB5a7627F7454a41732
is a
Proxy to
GnosisSafe
impl
0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552.
Extract
/tmp/graph-gov.
No mainnet
writes.
Checked for: a custom governor money path beyond a standard Safe.
Result: no user-exploitable finding. Not submitted. The listed Governor is a Safe multisig, not a custom token minter.
Do not file standard Safe threshold execution.
Not submitted. Payment requires user KYC. Remaining listed: L2GraphTokenGateway 404. Listed The Graph leftover that Sourcify opens is exhausted except that 404.
2026-09-03: Xterio leftover website leftover
Immunefi program
xterio
($80,000,
kyc: true).
Unique unused
standing program.
Listed assets
are
https://app.xter.io/
plus primacy
of impact
(no
smart-contract
source URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: website / primacy of impact only.
2026-09-03: Metronome leftover remaining OP + Base twins leftover (Sourcify)
Immunefi program
metronome
($50,000,
kyc: true).
Already leftover-
logged as ETH
deposit + debt.
Sourcify OP
DepositToken
0x850C8d57F6c5FEf42D9A44Df9e99feaa807e4cCc,
DebtToken
0x2f6EF744B1f47F5A4e91213B55C69dAb10c6D535,
Pool
0xbdF0380E921b4c0d73B9EF86a5b4c08869ACc23D,
Treasury
0x22C799230d837958Fc24920f8DA9Bd1254A5538c;
Base
DepositToken
0x9bF24739310FB7F79af48ECc38557E2172469EEE,
DebtToken
0x94020A4636bcdCA343014988114d755984B44175,
Pool
0x2144B696bEbA98f077531e96023A7DF821Bc4586,
Treasury
0x934aB2262C6258fafd619Cb63bE7d89B20C19633,
NativeTokenGateway
0xBd700f301DC8e644DC074023369fe5Bdf6051b29.
Extract
/tmp/metro-op-dep,
/tmp/metro-op-debt,
/tmp/metro-op-pool,
/tmp/metro-op-treas,
/tmp/metro-base-dep,
/tmp/metro-base-debt,
/tmp/metro-base-pool,
/tmp/metro-base-treas,
/tmp/metro-base-gw.
No mainnet
writes.
Files:
contracts/DepositToken.sol,
contracts/DebtToken.sol,
contracts/Pool.sol,
contracts/Treasury.sol,
contracts/NativeTokenGateway.sol.
Checked for: deposit that spends another account's collateral; liquidation of a healthy position.
Result: no user-exploitable finding. Not submitted.
- OP / Base
DepositToken.depositsafeTransferFrom(msg.sender)and mints toonBehalfOf_(same as ETH). Pool.liquidaterequires an unhealthy position and forbids self- liquidation.flashWithdrawisonlyIfSmartFarmingManager.
Do not file deposit-to-named receiver or liquidation of an unhealthy position.
Not submitted. Payment requires user KYC. Remaining listed: listed leftover that Sourcify opens is exhausted except same-type OFT twins (now leftover- logged).
2026-09-03: Velvet leftover remaining rebalance + fee leftover (Sourcify)
Immunefi program
velvet-capital-v2
($10,000,
kyc: true).
Already leftover-
logged as Base
deposit +
withdraw.
Sourcify Base
TokenExclusionManager
0x4f69982392bA29E98c62B07482be190301D12Ca7,
Rebalancing
0x0827cf431c2f2a4F12584fddB6F01Ab0E26cCbE0,
AssetManagementConfig
0x17E14a8BC2380096f9e9EAfEa47fe1015502a09D,
FeeModule
0xc05D2e4Bbe442172C649Faa1FDc503E627062bd3,
PriceOracleL2
0x608E93AD410F3E3288dfc1A60446925A0fcf967E.
Extract
/tmp/velvet-excl,
/tmp/velvet-rebal,
/tmp/velvet-amcfg,
/tmp/velvet-fee,
/tmp/velvet-oracle.
No mainnet
writes.
Files:
contracts/rebalance/Rebalancing.sol,
contracts/fee/FeeModule.sol,
contracts/core/management/TokenExclusionManager.sol,
contracts/oracle/PriceOracleL2.sol.
Checked for: permissionless rebalance that drains user vaults; fee mint that dilutes without a role.
Result: no user-exploitable finding. Not submitted.
Rebalancing.updateWeightsisonlyAssetManagerand swaps via a protocol solver handler.FeeModule.chargePerformanceFeeisonlyAssetManager.chargeProtocolAndManagementFeesis permissionless mint of accrued protocol / management shares (not a user steal).TokenExclusionManager.claimRemovedTokens/claimTokenAtIdpay the recorded user's snapshot share.PriceOracleL2is a Chainlink- sequencer uptime reader (no token transfer).
Do not file asset-manager rebalance, permissionless accrued-fee charge, or permissionless claim of a recorded user's removed-token share.
Not submitted. Payment requires user KYC. Remaining listed: PortfolioFactory 404 / ProtocolConfig 404. Listed Velvet V2 leftover that Sourcify opens is exhausted except those 404s.
2026-09-03: Pragma leftover remaining TWAP + randomness leftover (83094b9)
Immunefi program
pragmaoracle
($50,000,
kyc: true).
Already leftover-
logged as cairo
oracle.
Official
Astraly-Labs/pragma-oracle
HEAD
83094b93.
Extract
/tmp/pragma-oracle
(compute_engines/summary_stats,
randomness).
No mainnet
writes.
Files:
pragma-oracle/src/compute_engines/summary_stats/summary_stats.cairo,
pragma-oracle/src/randomness/randomness.cairo.
Checked for: TWAP write that moves user funds; randomness request that pulls another account.
Result: no user-exploitable finding. Not submitted.
calculate_twapis a view over oracle checkpoints (window capped).update_options_datarequires a merkle proof against the latest generic oracle entry.request_randomtransferFromthe caller for premium- callback
fee.
update_statusis admin-only.
- callback
fee.
Do not file view TWAP, merkle-proven options-feed update, or randomness request that pulls the caller.
Not submitted. Payment requires user KYC. Remaining listed: website (Astraly-Labs/Pragma marketing site). Listed Pragma cairo leftover that the official repo opens is exhausted.
2026-09-03: Kiln leftover website leftover
Immunefi program
kiln-webapp
($100,000,
kyc: true).
Unique unused
standing program.
Listed assets
are kiln.fi
websites /
API / widget
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no
user-exploitable
finding.
Not submitted.
Remaining listed:
website /
API only.
Kiln on-chain
leftovers are
already logged
under kiln
/ Kiln DeFi.
2026-09-03: 1inch leftover wallet leftover
Immunefi program
1inch-wallet
($100,000,
kyc: true).
Unique unused
standing program.
Listed assets
are Apple /
Play wallet
store pages
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no
user-exploitable
finding.
Not submitted.
Remaining listed:
mobile wallet
store pages
only.
1inch on-chain
leftovers are
already logged
under
1inch-aqua
/ token-plugins.
2026-09-03: Metronome leftover remaining CrossChainDispatcher + ProxyOFT leftover (Sourcify)
Immunefi program
metronome
($50,000,
kyc: true).
Already leftover-
logged as ETH
deposit + debt
and OP / Base
twins.
Sourcify ETH
CrossChainDispatcher
proxy
0x8BD81c99a2D349F6fB8E8a0B32C81704e3FE7302
impl
0x50361AFAAfd269c1e9B74866a14579BBc512a41c,
ProxyOFT
0xD6d14C4A2AEc7B3FA179B77E202bFAd0B93A51b5,
Quoter proxy
0xEC37f547B27d8cB216B145744875A5861E3DF6AF
impl
0x5F6C71F41232A1AeAe2623c4ac7b111c38406834,
MsETH / MsUSD
ProxyOFT impl
0x965498a6888a60c2E799679cedc64e0890890E40;
OP
CrossChainDispatcher
proxy
0xCEA698Cf2420433E21BeC006F1718216c6198B52
impl
0xb6Ecf1a552B0f4E520fF2934E60B756055F0C362,
ProxyOFT
0x0EcC84DA119Bd5539Dc489d4009106534cfAa542.
Extract
/tmp/metro-ccd-impl,
/tmp/metro-oft,
/tmp/metro-oft-impl,
/tmp/metro-quoter-impl,
/tmp/metro-op-ccd-impl,
/tmp/metro-op-oft.
No mainnet
writes.
Files:
contracts/CrossChainDispatcher.sol,
contracts/ProxyOFT.sol,
contracts/Quoter.sol.
Checked for:
a stranger
sendFrom that
burns another
account's synth;
a permissionless
CCD trigger that
moves tokens
without an SFM
request; a retry
that swaps a
cached payload
to a different
account.
Result: no user-exploitable finding. Not submitted.
ProxyOFT._debitFromrequiresmsg.sender == from_then burnsfrom_.sendAndCallis CCD-gated.triggerFlashRepaySwap/triggerLeverageSwapareonlyIfSmartFarmingManageronlyIfBridgingIsNotPaused.onOFTReceivedisonlyIfProxyOFTand requiresfrom== registered remote CCD.sgReceiveisonlyIfStargateComposerwith the same remote-CCD check. Callbacks approve the recorded SmartFarmingManager request.- Retry
functions are
permissionless
of a cached
failed
Stargate / OFT
payload.
Only the
recorded
_accountcan lowerswapAmountOutMin. - Quoter is view-only.
Do not file OFT send of the caller's tokens, permissionless retry of a cached LZ / Stargate payload, or SFM-gated cross-chain swap.
Not submitted. Payment requires user KYC. Remaining listed: listed leftover that Sourcify opens is exhausted except same-type OFT twins.
2026-09-03: OpenZeppelin leftover remaining RWA + governance leftover (v0.7.2)
Immunefi program
openzeppelin-stellar
($25,000,
kyc: true).
Already leftover-
logged as
fungible + vault.
Official
OpenZeppelin/stellar-contracts
tag
v0.7.2
(a9c42169).
Extract
/tmp/oz-stellar.
No mainnet
writes.
Files:
packages/tokens/src/rwa/storage.rs,
packages/tokens/src/rwa/mod.rs,
packages/governance/src/governor/storage.rs,
packages/governance/src/governor/mod.rs,
packages/governance/src/timelock/storage.rs,
packages/accounts/src/smart_account/mod.rs,
packages/accounts/src/policies/spending_limit.rs.
Checked for: a
stranger
transfer that
moves another
account's RWA
tokens; a
permissionless
mint /
burn; a
Governor
execute that
runs a
non-succeeded
proposal.
Result: no user-exploitable finding. Not submitted.
- RWA
transferrequiresfrom.require_auth().transfer_fromrequiresspender.require_auth()and spends allowance. - Trait
mint/burn/forced_transferhave no default impl and document that callers must enforce operator RBAC before calling the storage helpers. - Governor
proposechecks previous- ledger voting power.execute/queue/ Timelockexecute_operationare documented no-auth helpers for a succeeded / queued proposal after delay. - Accounts
spending-
limit is a
policy that
blocks
over-limit
transfers;
it does not
move tokens.
Smart-account
__check_authrequires caller- selected rule + signatures.
Do not file from-authed RWA transfer, operator-gated RWA mint / burn, or permissionless execute of a queued succeeded proposal after delay.
Not submitted.
Payment requires
user KYC.
Remaining listed:
listed leftover
that official
v0.7.2
opens is
exhausted.
2026-09-03: Folks leftover sc-library leftover (c5f2531)
Immunefi program
folks-sc-library
($30,000,
kyc: false).
Unique unused
standing program
(separate from
Folks Finance
spoke / hub
leftovers).
Official
Folks-Finance/algorand-smart-contract-library
c5f25311.
Extract
/tmp/folks-sc-lib.
No mainnet
writes.
Files:
folks_contracts/library/AccessControl.py,
RateLimiter.py,
Upgradeable.py,
Initialisable.py,
extensions/InitialisableWithCreator.py,
UInt64SetLib.py.
Checked for:
permissionless
grant_role;
a rate-limit
consume that
moves tokens;
an upgrade
complete
without the
admin role
or delay.
Result: no user-exploitable finding. Not submitted.
grant_role/revoke_rolerequire the role's admin.renounce_rolerevokes onlyTxn.sender.- RateLimiter
_consume_amount/_fill_amount/_add_bucketare internal subroutines. No token transfer. complete_contract_upgraderequires upgradable admin, the scheduled timestamp, and SHA256 of the new programs.
creator`.InitialisableWithCreatorrequires `Txn.sender
Do not file admin-gated role grant or admin-gated scheduled upgrade after delay.
Not submitted. Listed leftover exhausted.
2026-09-03: 1inch leftover business leftover
Immunefi program
1inch-business
($100,000,
kyc: true).
Unique unused
standing program.
Listed assets
are
api.1inch.com
and
business.1inch.com
portal / docs
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no
user-exploitable
finding.
Not submitted.
Remaining listed:
API / portal
pages only.
1inch on-chain
leftovers are
already logged
under
1inch-aqua
/ token-plugins.
2026-09-03: 1inch leftover web leftover
Immunefi program
1inch-web
($50,000,
kyc: true).
Unique unused
standing program.
Listed assets
are 1inch.com /
blog / network
marketing pages
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: marketing pages only.
2026-09-03: Hibachi leftover website leftover
Immunefi program
hibachi
($20,000,
kyc: true).
Unique unused
standing program.
Listed assets
are
api.hibachi.xyz
and
data-api.hibachi.xyz
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: API pages only.
2026-09-03: Cosmos leftover solidity-ibc-eureka leftover (8f33f35)
Immunefi program
cosmos
($50,000,
kyc: true).
Unique unused
standing program.
Official
cosmos/solidity-ibc-eureka
8f33f351.
Extract
/tmp/ibc-eureka-repo.
No mainnet
writes.
Files:
ibc-solidity/contracts/ICS20Transfer.sol,
ICS26Router.sol,
utils/Escrow.sol,
utils/IBCERC20.sol.
Checked for:
a stranger
sendTransfer
that pulls
another
account's
tokens; a
recvPacket
that pays
msg.sender;
an escrow
send that
is not
ICS20-gated.
Result: no user-exploitable finding. Not submitted.
sendTransfer/sendTransferWithPermit2safeTransferFrom/ Permit2 the caller into the client escrow.sendTransferWithSenderisrestrictedand still pulls_msgSender().onRecvPacketisonlyRouterand pays the recorded packetreceiver. Ack error / timeout refunds the recorded packet sender.Escrow.sendisonlyICS20and rate- limited.IBCERC20.mint/burnareonlyICS20and only to / from the escrow.ICS26Router.recvPacketisrestrictedand verifies light-client membership before the app callback.sendPacketrequires the caller to be the registered source-port app.
Do not file transfer of the caller's tokens or relayer- gated receive of a membership- proven IBC packet to the recorded receiver.
Not submitted. Payment requires user KYC. Remaining listed: cosmos-sdk / ibc-go / cometbft / CosmWasm / gaia DLT (skip unless a small money path is isolated).
2026-09-03: 1inch leftover infrastructure leftover
Immunefi program
1inch-infrastructure
($20,000,
kyc: true).
Unique unused
standing program.
Listed assets
are 1inch.com /
blog / API /
business portal
pages only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: website / API pages only.
2026-09-03: Exodus leftover website leftover
Immunefi program
exodus
($18,000,
kyc: true).
Unique unused
standing program.
Listed assets
are exodus.com
/ desktop /
store pages
and
passkeys.foundation
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: wallet store / site pages only.
2026-09-03: Ofza leftover website leftover
Immunefi program
ofza-1
($10,000,
kyc: true).
Unique unused
standing program.
Listed assets
are ofza.com
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: website only.
2026-09-03: EdgeX leftover website leftover
Immunefi program
edgex
($10,000,
kyc: true).
Unique unused
standing program.
Listed assets
are
pro / quote /
spot
edgex.exchange
pages only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: exchange pages only.
2026-09-03: Avalanche leftover ICTT TokenHome + TokenRemote leftover (0b68b03)
Immunefi program
avalanche
($100,000,
kyc: true).
Unique unused
standing program.
Official
ava-labs/icm-contracts
0b68b03c.
Extract
/tmp/avax-ictt.
No mainnet
writes.
Files:
contracts/ictt/TokenHome/TokenHome.sol,
ERC20TokenHomeUpgradeable.sol,
contracts/ictt/TokenRemote/TokenRemote.sol,
ERC20TokenRemoteUpgradeable.sol.
Checked for:
a stranger
send that
pulls another
account's
tokens; a
Teleporter
receive that
pays
msg.sender;
an unregistered
remote that
unlocks home
collateral.
Result: no user-exploitable finding. Not submitted.
- Home
send/addCollateralsafeTransferFromthe caller. Remotesendburns the caller after spending allowance. - Home
_receiveTeleporterMessagerequires a registered and collateralized remote, then deducts that remote's transferred balance and pays the recorded recipient. - Remote receive requires source == home blockchain and origin == home address, then mints to the recorded recipient.
- Multi-hop
routes
through
home; zero
scaled
amount
refunds
multiHopFallback.
Do not file transfer of the caller's tokens or Teleporter- gated withdraw to the recorded recipient.
Not submitted. Payment requires user KYC. Remaining listed: avalanchego / libevm / snowtrace bridged tokens (skip unless a small money path is isolated).
2026-09-03: Berachain leftover webapps leftover
Immunefi program
berachain-webapps
($10,000,
kyc: true).
Unique unused
standing program
(separate from
berachain
contracts
leftovers).
Listed assets
are berachain.com
/ honeypaper /
ecosystem /
safe /
buildabera
pages only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no
user-exploitable
finding.
Not submitted.
Remaining listed:
website pages
only.
On-chain
Berachain
leftovers are
already logged
under
berachain.
2026-09-03: Ava Labs leftover website leftover
Immunefi program
avalabs
($10,000,
kyc: true).
Unique unused
standing program
(separate from
avalanche
ICTT leftover).
Listed assets
are avax.network
/ explorer /
API / Core
wallet store
and Wallet SDK
docs only (no
in-scope
ICTT contract
URL on this
slug).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: website / SDK pages only.
2026-09-03: BlockPI leftover website leftover
Immunefi program
blockpinetwork
($5,000,
kyc: false).
Unique unused
standing program.
Listed assets
are blockpi.io
and dashboard
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: website only.
2026-09-03: Unstoppable leftover wallet leftover
Immunefi program
unstoppablewallet
($1,000,
kyc: false).
Unique unused
standing program.
Listed assets
are Apple /
Play wallet
store pages
only (no
smart-contract
URL).
No in-scope
on-chain
money path
to open
this pass.
Checked for: a listed contract URL.
Result: no user-exploitable finding. Not submitted. Remaining listed: mobile wallet store pages only.
2026-09-03: Velvet leftover BSC v1 IndexSwap leftover (Sourcify)
Immunefi program
velvetcapital
($51,000,
kyc: false).
Unique unused
standing program
(separate from
leftover-logged
velvet-capital-v2
Base V2).
31 BSC listed
contracts.
Sourcify
extracts
/tmp/velvet-v1-indexswap,
/tmp/velvet-v1-rebalancing,
/tmp/velvet-v1-exchange,
/tmp/velvet-v1-offchain-rebal,
/tmp/velvet-v1-feemodule,
/tmp/velvet-v1-assetmgr,
/tmp/velvet-v1-offchain-swap,
/tmp/velvet-v1-new-indexswap,
/tmp/velvet-v1-new-offchain-rebal.
No mainnet
writes.
Files:
contracts/core/IndexSwap.sol,
contracts/rebalance/Rebalancing.sol,
contracts/core/Exchange.sol,
contracts/rebalance/OffChainRebalance.sol,
contracts/fee/FeeModule.sol,
contracts/registry/AssetManagerConfig.sol,
contracts/core/OffChainIndexSwap.sol.
Checked for:
a stranger
investInFund
that spends
another
wallet;
withdrawFund
that pays
msg.sender
another
account's
shares;
permissionless
rebalance /
updateWeights
that drains
the vault;
swapETHToToken
that spends
vault ETH.
Result: no user-exploitable finding. Not submitted.
investInFund(old + new IndexSwap)safeTransferFromthe caller or takesmsg.valueif WETH, then mints tomsg.sender.withdrawFundchecks cooldown formsg.sender, burns that caller, and paysmsg.sender.mintShares/burnSharesareonlyMinter.updateWeights/updateTokensareonlyAssetManager.rebalanceis internal.- Off-chain
rebalance
enableRebalance/externalSell/externalRebalanceareonlyAssetManager. User revert after 15 minutes restores vault tokens. - Exchange
swapETHToToken/_swapTokenToETHareonlyIndexManager. FeeModule.chargeFeesis permissionless fee-share mint to treasuries.chargeFeesFromIndexisonlyIndexManager.- Asset
manager
fee /
treasury /
whitelist
writes are
onlyAssetManager.
Do not file invest or withdraw of the caller's tokens, asset-manager rebalance, permissionless fee mint to the listed treasuries, or user revert after the 15-minute pause as stranger theft.
Not submitted. Remaining listed: handlers (Pancake / Venus / Beefy / 1inch / Paraswap / ZeroEx), VelvetSafeModule, PriceOracle, RebalanceAggregator, ERC1967Proxy twins, and Primacy of Impact.
2026-09-03: Velvet leftover remaining BSC handlers leftover (Sourcify)
Immunefi program
velvetcapital
($51,000,
kyc: false).
Listed remaining
after BSC v1
IndexSwap leftover.
Sourcify extracts
under
/tmp/velvet-v1-rest.
Two listed
addrs 404
(0xB966…3775,
0xE614…798B).
No mainnet
writes.
Files:
contracts/rebalance/RebalanceAggregator.sol,
contracts/vault/VelvetSafeModule.sol,
contracts/oracle/PriceOracle.sol,
contracts/handler/PancakeSwapHandler.sol,
contracts/handler/venus/VenusHandler.sol,
contracts/handler/Beefy/BeefyHandler.sol,
contracts/handler/ExternalSwapHandler/ZeroExHandler.sol,
contracts/handler/ExternalSwapHandler/OneInchHandler.sol.
Checked for:
a stranger
swapRewardToken
that drains
the vault;
executeWallet
that spends
the Safe;
handler
swap /
redeem that
pulls vault
tokens.
Result: no user-exploitable finding. Not submitted.
- RebalanceAggregator
swapRewardToken/swapPrimaryToken/redeem/revertRedeemareonlyAssetManager.executeSwapis internal and pulls from the vault via the aggregator. - VelvetSafeModule
executeWallet/executeWalletDelegateareonlyOwner.setUptransfers ownership to the Exchange. - PriceOracle
reads are
view.
Feed /
expiration
writes are
onlyOwner. - Pancake /
Venus /
Beefy /
LP /
ZeroEx /
1inch /
Paraswap
handlers
operate on
tokens
already on
the handler.
They do
not
transferFroma stranger's wallet. Publicswap/redeemof leftover handler dust is donated balance, not vault funds.
Do not file asset-manager aggregator swaps, Exchange- owned Safe module calls, or sweeping donated tokens on a handler as stranger theft.
Not submitted. Listed leftover that Sourcify opens for velvetcapital handlers / Safe module / oracle / aggregator is exhausted at the opened-file level. Remaining listed: two Sourcify 404 proxies and Primacy of Impact.
2026-09-03: Wormhole leftover remaining Solana + Sui NTT leftover (250d810)
Immunefi program
wormhole
($1,000,000,
kyc: true).
Listed remaining
after EVM NTT
leftover
(250d810).
Official
wormhole-foundation/native-token-transfers
250d810.
Extract
/tmp/wh-ntt-full
solana/ +
sui/.
No mainnet
writes.
Files:
solana/programs/example-native-token-transfers/src/instructions/transfer.rs,
redeem.rs,
release_inbound.rs,
transceivers/wormhole/instructions/receive_message.rs,
sui/packages/ntt/sources/ntt.move,
sui/packages/wormhole_transceiver/sources/wormhole_transceiver.move.
Checked for:
a stranger
transfer
that spends
another
wallet;
redeem /
release
that mints
to the
caller;
a VAA
receive
that skips
peer check.
Result: no user-exploitable finding. Not submitted.
- Solana
transfer_burn/transfer_lockpullfromvia a session authority seeded byfrom.owner- args hash, then burn or lock into custody. Outbox records that sender and recipient.
receive_messagerequires aPostedVaawhose emitter matches the transceiver peer PDA.redeemvotes a validated transceiver message and records the message recipient on a content- addressed inbox item.
recipient_address`).release_inbound_*is permissionless after quorum + delay and pays the inbox item's associated token account (`authority- Sui
transfer_*burns or locks the ticket coins (caller- supplied).validate_messageconsumes a VAA and checks the peer.redeemvotes that validated message.releasepublic_transfers minted / unlocked coins to the recorded recipient.
Do not file transfer of the signer's tokens or permissionless release of a quorum- attested NTT message to the recorded recipient.
Not submitted. Payment requires user KYC. Remaining listed: Relayer 404.
2026-09-03: Hedera leftover remaining CryptoTransfer leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after json-rpc-
relay leftover
(2b51a98).
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
Extract
/tmp/hedera-consensus
hedera-token-service-impl.
No mainnet
writes.
Files:
handlers/CryptoTransferHandler.java,
handlers/transfer/TransferExecutor.java,
util/CryptoTransferValidationHelper.java.
Checked for:
a stranger
CryptoTransfer
that debits
another
account
without that
account's
key.
Result: no user-exploitable finding. Not submitted.
preHandlewalks HBAR and token transfer lists. A debit withoutisApprovalor an allowance hookrequireKeyOrThrowthe debit account (or a hollow-account signature).- Credits
with
receiverSigRequiredrequire the receiver key (optional only for airdrop pending). - NFT
senders
requireKeyunlessisApprovalor a sender hook. handlethenvalidateSemanticsandexecuteCryptoTransferfor the signed payer.
Do not file debit of a signed sender, approval- gated debit, or hook-gated skip as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules, SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Filecoin leftover builtin-actors market + paych leftover (d894a1a)
Immunefi program
filecoin
($50,000,
kyc: true).
Unique unused
standing DLT
program
(updated
2026-09-01).
Official
filecoin-project/builtin-actors
d894a1a.
Extract
/tmp/filecoin-actors
actors/market,
actors/paych,
actors/multisig.
No mainnet
writes.
Files:
actors/market/src/lib.rs,
actors/paych/src/lib.rs,
actors/multisig/src/lib.rs.
Checked for:
a stranger
withdraw_balance
that pays
the caller
another
escrow;
collect
that drains
a payment
channel to
msg.sender;
propose
that spends
the msig
without a
signer.
Result: no user-exploitable finding. Not submitted.
- Market
add_balancecreditsvalue_receivedto the named escrow (caller pays).withdraw_balancerequires the approved owner / worker / client set andsends to the recorded recipient. - Paych
update_channel_staterequires callerfromortoplus a voucher signed by the other party.settleis from/to.collectafter the delay paysto_sendtotoand the remainder tofrom. - Multisig
propose/approve/cancelrequire the caller to be a signer. Execution waits for threshold.
Do not file escrow deposit of the caller's FIL, approved withdraw to the recorded recipient, or threshold msig spend as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus / miner / proofs / boost / go-f3 / other builtin-actors (miner, power, reward, account) and filecoin.io.
2026-09-03: Filecoin leftover remaining miner + account leftover (d894a1a)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
after market +
paych leftover.
Official
filecoin-project/builtin-actors
d894a1a.
Extract
/tmp/filecoin-actors
actors/miner,
actors/account.
No mainnet
writes.
Files:
actors/miner/src/lib.rs,
actors/account/src/lib.rs.
Checked for:
a stranger
withdraw_balance
that pays
the caller;
change_owner_address
that steals
the miner;
account
authenticate_message
that skips
signature
check.
Result: no user-exploitable finding. Not submitted.
- Miner
withdraw_balancerequires caller owner or beneficiary andsends toinfo.beneficiaryafter vesting and fee debt. change_owner_addressis a two-step owner propose + pending owner confirm.change_beneficiaryis owner propose then current / proposed beneficiary confirm (FIP-0029).- Account
constructor
is
system-
only.
authenticate_messageverifies the stored pubkey over the message. Fallback is a no-op for exported methods (no transfer).
Do not file owner / beneficiary withdraw to the beneficiary, two-step owner change, or pubkey auth as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus / proofs / boost / go-f3 / power / reward and filecoin.io.
2026-09-03: Hedera leftover remaining TokenMint leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after
CryptoTransfer
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
Extract
/tmp/hedera-consensus
TokenMintHandler
/
TokenBurnHandler.
No mainnet
writes.
Files:
handlers/TokenMintHandler.java,
handlers/TokenBurnHandler.java.
Checked for:
a stranger
TokenMint
that mints
without the
supply key;
TokenBurn
that burns
another
account's
tokens.
Result: no user-exploitable finding. Not submitted.
TokenMintpreHandlerequireKeythe token supply key when present. An empty HIP-540 sentinel is treated as no supply key (mint disabled).TokenBurnlikewiserequireKeythe supply key. Handle burns from the treasury after that check.
Do not file supply-key mint or burn as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules, SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining CryptoApproveAllowance leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after TokenMint
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
Extract
/tmp/hedera-consensus
CryptoApproveAllowanceHandler
/
TokenAccountWipeHandler
/
TokenAssociateToAccountHandler
/
TokenDissociateFromAccountHandler
/
CryptoCreateHandler.
No mainnet
writes.
Files:
handlers/CryptoApproveAllowanceHandler.java,
handlers/TokenAccountWipeHandler.java,
handlers/TokenAssociateToAccountHandler.java,
handlers/TokenDissociateFromAccountHandler.java,
handlers/CryptoCreateHandler.java.
Checked for:
a stranger
CryptoApproveAllowance
that grants
another
account's
allowance;
TokenWipe
without the
wipe key;
TokenAssociate
that binds
another
account.
Result: no user-exploitable finding. Not submitted.
CryptoApproveAllowancepreHandlerequireKeyOrThrowthe allowance owner when owner != payer (crypto + token). NFTapprovedForAllrequires the owner; otherwise the delegating spender or owner.TokenAccountWiperequireKeythe wipe key when present. Handle rejects an empty wipe key (TOKEN_HAS_NO_WIPE_KEY).TokenAssociateandTokenDissociaterequireKeyOrThrowthe target account.CryptoCreaterequires the alias key or hollow EVM signature when the alias is not the payer / account key.receiverSigRequiredrequires the new account key.
Do not file owner-signed allowance grant, wipe-key wipe, target- signed associate, or alias- proven create as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules, SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining TokenCreate leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after
CryptoApproveAllowance
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
Extract
/tmp/hedera-consensus
TokenCreateHandler
/
CryptoUpdateHandler
/
CryptoDeleteAllowanceHandler
/
TokenFreezeAccountHandler.
No mainnet
writes.
Files:
handlers/TokenCreateHandler.java,
handlers/CryptoUpdateHandler.java,
handlers/CryptoDeleteAllowanceHandler.java,
handlers/TokenFreezeAccountHandler.java.
Checked for:
a stranger
TokenCreate
that binds
another
treasury;
CryptoUpdate
that
replaces
another
account
key;
TokenFreeze
without
the freeze
key.
Result: no user-exploitable finding. Not submitted.
TokenCreatepreHandlerequireKeyOrThrowthe treasury and auto-renew account when present, plus the admin key and custom fee collectors that require a signature. Initial supply mints to the signed treasury.CryptoUpdaterequires the target account key unless a system waiver applies, and the new key when rotating.CryptoDeleteAllowancerequires the NFT owner unless the payer is the owner or alreadyapprovedForAll.TokenFreezerequireKeythe freeze key; handle rejects an empty freeze key.
Do not file treasury- signed token create, target- signed account update, owner- signed allowance delete, or freeze-key freeze as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules, SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining TokenUpdate leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after TokenCreate
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
Extract
/tmp/hedera-consensus
TokenUpdateHandler
/
TokenDeleteHandler
/
CryptoDeleteHandler
/
TokenGrantKycToAccountHandler
/
TokenPauseHandler
/
TokenRejectHandler
/
TokenAirdropHandler
/
TokenClaimAirdropHandler
/
TokenCancelAirdropHandler.
No mainnet
writes.
Files:
handlers/TokenUpdateHandler.java,
handlers/TokenDeleteHandler.java,
handlers/CryptoDeleteHandler.java,
handlers/TokenGrantKycToAccountHandler.java,
handlers/TokenPauseHandler.java,
handlers/TokenRejectHandler.java,
handlers/TokenAirdropHandler.java,
handlers/TokenClaimAirdropHandler.java,
handlers/TokenCancelAirdropHandler.java.
Checked for:
a stranger
TokenUpdate
that
replaces
treasury
without
the admin
key;
TokenDelete
of an
immutable
token;
CryptoDelete
that
sweeps
another
account;
TokenClaimAirdrop
that
claims
another
receiver's
pending
drop.
Result: no user-exploitable finding. Not submitted.
disabled).TokenUpdaterequires the admin key for treasury / auto-renew / admin / memo changes, plus the new treasury or auto-renew key. Role-key updates need the role key or admin (HIP-540 empty sentinelTokenDeleterequireKeythe admin key; handle rejects an empty admin key (TOKEN_IS_IMMUTABLE).CryptoDeleterequireKeyOrThrowthe deleted account andrequireKeyIfReceiverSigRequiredthe transfer account.
disabled).TokenGrantKycrequires the KYC key (empty sentinelTokenPauserequires the pause key; handle rejects an empty pause key.TokenRejectrequires the owner when specified.TokenAirdropreuses transfer preHandle for senders.TokenClaimAirdroprequires the receiver.TokenCancelAirdroprequires the sender.
Do not file admin-gated token update or delete, owner- signed account delete, KYC-key grant, pause-key pause, owner reject, sender airdrop, or receiver claim as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules, SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining TokenFeeSchedule leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after TokenUpdate
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
Extract
/tmp/hedera-consensus
TokenFeeScheduleUpdateHandler
/
TokenUnfreezeAccountHandler
/
TokenUnpauseHandler
/
TokenRevokeKycFromAccountHandler
/
TokenUpdateNftsHandler.
Listed
token-service
handler leftover
that this
extract
opens is
exhausted
after this
slice
(views /
live-hash
omitted).
No mainnet
writes.
Files:
handlers/TokenFeeScheduleUpdateHandler.java,
handlers/TokenUnfreezeAccountHandler.java,
handlers/TokenUnpauseHandler.java,
handlers/TokenRevokeKycFromAccountHandler.java,
handlers/TokenUpdateNftsHandler.java.
Checked for:
a stranger
TokenFeeScheduleUpdate
without the
fee-schedule
key;
TokenUnfreeze
without the
freeze key;
TokenUpdateNfts
that
rewrites
another
account's
NFT
metadata.
Result: no user-exploitable finding. Not submitted.
TokenFeeScheduleUpdaterequireKeythe fee- schedule key when present; handle rejects an empty key (TOKEN_HAS_NO_FEE_SCHEDULE_KEY). Collectors withreceiverSigRequiredmust sign.TokenUnfreezerequires the freeze key; handle rejects an empty freeze key.TokenUnpauserequires the pause key; handle rejects an empty pause key.TokenRevokeKycrequires the KYC key (empty sentinelTOKEN_HAS_NO_KYC_KEY).TokenUpdateNftsrequires metadata or supply key for treasury- owned serials, else the metadata key. HIP-540 empty sentinel is treated as absent.
Do not file fee- schedule- key update, freeze-key unfreeze, pause-key unpause, KYC-key revoke, or metadata / supply-key NFT update as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules
(contract /
file /
schedule /
consensus
if a
narrow
money path
isolates),
SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining File leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after
TokenFeeSchedule
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
CDN extract
/tmp/hedera-other/file
FileCreateHandler
/
FileAppendHandler
/
FileUpdateHandler
/
FileDeleteHandler
/
FileServiceUtils.
No mainnet
writes.
Files:
handlers/FileCreateHandler.java,
handlers/FileAppendHandler.java,
handlers/FileUpdateHandler.java,
handlers/FileDeleteHandler.java,
utils/FileServiceUtils.java.
Checked for:
a stranger
FileAppend
that
rewrites
another
file;
FileDelete
without a
file key;
system-file
append
without a
waiver.
Result: no user-exploitable finding. Not submitted.
FileCreatevalidateAndAddRequiredKeysrequires every key in the new key list.FileAppend/FileUpdaterequire the existing file keys unless a privileged waiver applies. Software- update file numbers take a separate upgrade path.FileDeletewraps the file key list as a threshold-1 key (validateAndAddRequiredKeysForDelete). Handle rejects a file with no keys (UNAUTHORIZED).
Do not file file-key append / update / delete as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules
(contract /
schedule /
consensus
if a
narrow
money path
isolates),
SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining Schedule leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after File
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
CDN extract
/tmp/hedera-other/schedule
and
/tmp/hedera-other/consensus.
No mainnet
writes.
Files:
handlers/ScheduleCreateHandler.java,
handlers/ScheduleSignHandler.java,
handlers/ScheduleDeleteHandler.java,
handlers/ConsensusCreateTopicHandler.java,
handlers/ConsensusSubmitMessageHandler.java,
handlers/ConsensusDeleteTopicHandler.java.
Checked for:
a stranger
ScheduleSign
that
executes
without
required
keys;
ScheduleDelete
of an
immutable
schedule;
ConsensusSubmitMessage
without
the submit
key.
Result: no user-exploitable finding. Not submitted.
ScheduleCreaterequires the admin key when present. Scheduled payer / non-payer keys are optional on create and must still satisfygetRequiredKeysbefore execute.ScheduleSigncollects optional keys and only executes whentryToExecuteSchedulesees every required key.ScheduleDeleterequires an admin key (SCHEDULE_IS_IMMUTABLEotherwise) and verifies it in handle.ConsensusCreateTopicrequires the admin key and auto-renew account when present.ConsensusSubmitMessagerequires the submit key when present.ConsensusDeleteTopicrequires the admin key.
Do not file key- threshold schedule execute, admin-gated schedule delete, or submit- key topic message as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules
(contract
if a
narrow
money path
isolates),
SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining Contract leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after Schedule
leftover.
ContractCall
is already
leftover-logged.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
CDN extract
/tmp/hedera-other/contract.
No mainnet
writes.
Files:
handlers/ContractCreateHandler.java,
handlers/ContractUpdateHandler.java,
handlers/ContractDeleteHandler.java,
handlers/EthereumTransactionHandler.java.
Checked for:
a stranger
ContractDelete
that
sweeps
another
contract;
ContractUpdate
of an
immutable
contract;
EthereumTransaction
that
spends
from an
unrelated
account.
Result: no user-exploitable finding. Not submitted.
ContractCreaterequires the admin key unless it is a contract- ID key, plus the auto-renew account when present.ContractUpdaterequires the target contract key when admin signature is required, rejects a contract- ID admin (MODIFYING_IMMUTABLE_CONTRACT), and requires a new crypto admin key / auto-renew account when set.ContractDeleterequires a non- contract admin key andrequireKeyIfReceiverSigRequiredon the obtainer. HandledeleteAndTransfers to the recorded obtainer.EthereumTransactionrecovers the ECDSA sender and, for a finalized account, checks the stored admin key matches that pubkey. Value to the burn address is rejected.
Do not file admin-gated contract create / update / delete or ECDSA- scoped ethereum tx as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules,
SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining Node leftover (0d3d9a2)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
after Contract
leftover.
Official
hiero-ledger/hiero-consensus-node
0d3d9a2.
CDN extract
/tmp/hedera-other/node
NodeCreateHandler
/
NodeUpdateHandler
/
NodeDeleteHandler.
UtilPrng
has no
funds
path.
No mainnet
writes.
Files:
handlers/NodeCreateHandler.java,
handlers/NodeUpdateHandler.java,
handlers/NodeDeleteHandler.java.
Checked for:
a stranger
NodeCreate
that binds
another
account;
NodeUpdate
that
replaces
admin
without
the
existing
admin
key;
NodeDelete
without
admin or
system
payer.
Result: no user-exploitable finding. Not submitted.
NodeCreaterequireKeyOrThrowthe new admin key and, if the account exists, that account key.NodeUpdaterequires the existing admin key, plus a new account key when changingaccountIdand the new admin key when rotating.NodeDeleterequires the admin key unless the payer is treasury, system admin, or address- book admin.
Do not file admin- signed node create / update / delete as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-mirror-node,
hiero-cryptography,
other consensus
modules,
SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Hedera leftover remaining mirror-node leftover (abfc59f)
Immunefi program
hedera
($30,000,
kyc: true).
Listed remaining
DLT after
consensus-node
leftovers.
Official
hiero-ledger/hiero-mirror-node
abfc59f.
CDN / raw
extract
/tmp/hedera-mirror
Rosetta
construction
- web3
/call. No mainnet writes.
Files:
rosetta/app/services/construction_service.go,
rosetta/app/services/construction/crypto_transfer_transaction_constructor.go,
web3/.../ContractCallService.java,
web3/.../TransactionExecutionService.java,
web3/.../ContractController.java.
Checked for:
a stranger
Rosetta
ConstructionSubmit
that
broadcasts
an unsigned
transfer;
web3
/call
that
mutates
mainnet.
Result: no user-exploitable finding. Not submitted.
- Rosetta
ConstructionCombineverifies each Ed25519 signature over the frozen body before attaching it.ConstructionSubmitbroadcasts that already- signed payload. - Crypto
transfer
construct
requires
HBAR
operations
that sum
to zero
and
records
negative
amounts
as
senders
(payer
is
signers[0]). - Web3
POST /callisETH_CALL/ETH_ESTIMATE_GASagainst a local mirror EVM. It does not submit a consensus transaction.
Do not file
client-
signed
Rosetta
submit or
local
eth_call
as
stranger
theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
hiero-cryptography,
SDKs,
and the
transaction-tool
website leftover.
2026-09-03: Filecoin leftover remaining boost leftover (240aa6e)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
after builtin-
actors leftovers.
Official
filecoin-project/boost
240aa6e.
Extract
/tmp/filecoin-boost
storagemarket
+
fundmanager.
No mainnet
writes.
Files:
storagemarket/provider.go,
storagemarket/deal_acceptance.go,
storagemarket/deal_execution.go,
fundmanager/fundmanager.go.
Checked for:
a stranger
ExecuteDeal
that
locks
another
miner's
collateral;
MoveFundsToEscrow
that
pulls a
third
party's
FIL.
Result: no user-exploitable finding. Not submitted.
ExecuteDealvalidateDealProposalchecks the client signature over the proposal (sigVerifier.VerifySignatureonProposal.Client) and the client's market escrow balance.FundManager.TagFundsreserves the provider's own tagged collateral / publish balance.MoveFundsToEscrowcallsMarketAddBalancefrom the configuredCollatWallet(operator node API).
Do not file client- signed deal accept or operator- wallet escrow top-up as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus / proofs / go-f3 / filecoin.io.
2026-09-03: Filecoin leftover remaining lotus miner leftover (7740217)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
lotus/tree/master/miner
after boost
leftover.
Official
filecoin-project/lotus
7740217.
Extract
/tmp/lotus-miner.go.
No mainnet
writes.
Files:
miner/miner.go.
Checked for:
a stranger
mine
that
submits a
block
credited
to another
miner;
createBlock
that
spends
another
worker's
FIL.
Result: no user-exploitable finding. Not submitted.
NewMinerbinds a concrete mineraddressand WinningPoSt prover.mineOneasksIsRoundWinnerfor that address, thencreateBlockcallsMinerCreateBlockon the operator node API with the same address.minesubmits the resulting block viaSyncSubmitBlock. Rewards still flow through the already leftover- logged builtin reward actor (SYSTEM only).
Do not file operator- bound block mining as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: proofs / FVM / filecoin.io.
2026-09-03: Filecoin leftover remaining proofs leftover (d451d23)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
rust-fil-proofs /
bellperson /
merkletree /
neptune
after proofs-ffi leftover.
Official
filecoin-project/rust-fil-proofs
d451d23.
Extract
/tmp/filecoin-proofs.
Do not rematch
proofs-api leftover
(7637843)
or proofs-ffi leftover
(59f46f4).
No mainnet
writes.
Files:
filecoin-proofs/src/api/seal.rs,
window_post.rs,
winning_post.rs,
fake_seal.rs.
Checked for:
a stranger
verify_seal
that
accepts a
forged Groth16
and credits
another
miner's
sector;
verify_window_post
/
verify_winning_post
that
skip the
verifying
key;
fauxrep
that
forges a
live
replica
commitment.
Result: no user-exploitable finding. Not submitted.
verify_sealrejects all-zero comm_d / comm_r and empty proofs, thenStackedCompound::verifyagainst the cached Groth16 verifying key.verify_window_postandverify_winning_postrunFallbackPoStCompound::verifyonMultiProofplus challenge count.- API / FFI wrappers only return bool; they do not move FIL.
fauxrep/fauxrep2write local null-byte replicas for genesis tooling.- Sector update verify takes old/new comm_r and comm_d.
- Funds still flow through leftover- logged builtin actors after consensus accepts a proven sector.
- bellperson / merkletree / lurk-lab/neptune are library- only SNARK / hash crates.
Do not file Groth16 verify of the caller's proof as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: filecoin.io / go-graphsync / remaining go-* / lotus non-miner / paired / filecoin-ffi.
2026-09-03: Filecoin leftover remaining filecoin.io website leftover
Immunefi program
filecoin
($50,000,
kyc: true).
Hashed remaining
listed
filecoin.io
after proofs
leftover.
Fetched
https://www.filecoin.io
200.
No wallet
connect,
no deposit
form,
no custody
path.
testFIL
Faucet is
docs copy
only.
Checked for: a listed on-chain money path on the marketing site.
Result: no user-exploitable finding. Not submitted.
Do not file a marketing site as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: go-graphsync / remaining go-* / lotus non-miner / paired / filecoin-ffi.
2026-09-03: Filecoin leftover remaining filecoin-ffi leftover (17b1c64)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/filecoin-ffi
after rust-fil-proofs leftover.
Official
filecoin-project/filecoin-ffi
17b1c64.
Extract
/tmp/filecoin-ffi.
Do not rematch
proofs /
proofs-api /
proofs-ffi leftovers.
No mainnet
writes.
Files:
cgo/proofs.go,
rust/src/proofs/api.rs.
Checked for:
a stranger
VerifySeal
that
accepts a
proof without
the named
proverId;
verify_winning_post
/
verify_window_post
that
drop
prover_id.
Result: no user-exploitable finding. Not submitted.
- Go
VerifySeal/VerifyWinningPoSt/VerifyWindowPoStpassproverIdinto Cverify_*. - Rust
verify_winning_post/verify_window_postforwardprover_idinto leftover- loggedfilecoin_proofs_api. verify_aggregate_seal_proofrebuilds seal inputs fromprover_idplus each commit input.- Wrappers return bool only; they do not move FIL.
Do not file
an FFI
that
forwards
prover_id
as stranger
theft.
Not submitted. Payment requires user KYC. Remaining listed: go-graphsync / remaining go-* / lotus non-miner / paired.
2026-09-03: Filecoin leftover remaining go-graphsync leftover (12cbffa)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
ipfs/go-graphsync
after filecoin-ffi leftover.
Official
ipfs/go-graphsync
12cbffa.
Extract
/tmp/go-graphsync.
No mainnet
writes.
Files:
impl/graphsync.go,
requestmanager/client.go.
Checked for: a GraphSync request that spends another peer's FIL; a voucher or payment channel in the IPLD exchange.
Result: no user-exploitable finding. Not submitted.
GraphSyncis an IPLD block exchange over libp2p.- Request manager tracks outgoing CID selectors and incoming blocks.
- No wallet, voucher, or FIL transfer in this crate.
Do not file an IPLD block exchange as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner / paired / go-data-transfer.
2026-09-03: Filecoin leftover remaining go-amt-ipld leftover (04938b0)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-amt-ipld
after go-fil-commcid leftover.
Official
filecoin-project/go-amt-ipld
04938b0.
Extract
/tmp/filecoin-amt.
Do not rematch
go-address leftover.
Do not rematch
go-fil-commcid leftover.
No mainnet
writes.
Files:
amt.go,
node.go.
Checked for:
a
LoadAMT
that
trusts
height
or
count
enough
to
overflow
and
rewrite
an
actor
array;
a
node
that
is
both
leaf
and
link.
Result: no user-exploitable finding. Not submitted.
LoadAMTrequires bitWidth match, height<= 64, andcount<=nodesForHeight.newNoderejects links plus values, a wrong bitmap width, and a bitmap that claims more values than the compacted list.- This crate is an IPLD array map. It does not move FIL.
Do not file an AMT codec as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-bitfield leftover (1602662)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-bitfield
after go-amt-ipld leftover.
Official
filecoin-project/go-bitfield
1602662.
Extract
/tmp/filecoin-bitfield.
No mainnet
writes.
Files:
bitfield.go.
Checked for:
an
UnmarshalCBOR
that
expands
an
unbounded
RLE
into
memory;
a
decode
that
sets
bits
the
caller
did
not
encode.
Result: no user-exploitable finding. Not submitted.
MaxEncodedSizeis 32 KiB.UnmarshalCBORrejectsextraabove that before allocating.MarshalCBORrejects an encoded RLE over the same cap.NewFromBytesdecodes RLE+ only. This crate does not move FIL.
Do not file an RLE bitfield as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-cbor-util leftover (c99ffda)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-cbor-util
after go-bitfield leftover.
Official
filecoin-project/go-cbor-util
c99ffda.
Extract
/tmp/filecoin-cborutil.
No mainnet
writes.
Files:
rpc.go.
Checked for:
a
ReadCborRPC
path
that
forges
a
signed
message
or
moves
FIL.
Result: no user-exploitable finding. Not submitted.
WriteCborRPC/ReadCborRPC/Dump/AsIpld/Equalsencode or decode CBOR only.- Fast
path
uses
cbor-genmarshalers. This crate does not move FIL.
Do not file a CBOR helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-padreader leftover (2d55fc9)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-padreader
after go-cbor-util leftover.
Official
filecoin-project/go-padreader
2d55fc9.
Extract
/tmp/filecoin-padreader.
No mainnet
writes.
Files:
padreader.go.
Checked for:
a
New
/
NewInflator
that
changes
caller
payload
bytes
or
claims
a
piece
size
that
is
not
a
power
of
two.
Result: no user-exploitable finding. Not submitted.
PaddedSizerounds a payload to the next unpadded piece size.New/NewInflatorsuffix NUL bytes only.NewInflatorrejects a non power-of-two target and a payload larger than the target. This crate does not move FIL.
Do not file a pad reader as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Hedera leftover remaining hashed transaction-tool leftover (224dfd2)
Immunefi program
hedera
($30,000,
kyc: true).
Hashed remaining
listed
hashgraph/hedera-transaction-tool
after SDK leftovers.
Official
hashgraph/hedera-transaction-tool
224dfd2.
README
marks it
Council /
staff
only.
No mainnet
writes.
Files:
README.md.
Checked for: a listed public on-chain money path a stranger can hit without Council keys.
Result: no user-exploitable finding. Not submitted.
- Frontend is an Electron signer. Private keys never leave the user's computer.
- Backend collates signatures and submits only after local sign.
- Not intended for public custody.
Do not file a Council- only signer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: Hedera listed leftover that official trees open is exhausted.
2026-09-03: Filecoin leftover remaining go-statemachine leftover (029d947)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-statemachine
after go-padreader leftover.
Official
filecoin-project/go-statemachine
029d947.
Extract
/tmp/filecoin-sm.
Do not rematch
go-cbor-util leftover.
No mainnet
writes.
Files:
machine.go,
fsm/fsm.go,
fsm/eventprocessor.go.
Checked for: an event that applies a transition the table does not allow; a planner that mutates another machine's state by id.
Result: no user-exploitable finding. Not submitted.
Applyrequires a listed(event, src)or(event, nil)fallback. Unknown transitions error.Planapplies one event (or all queued when configured) then runs the host entry func.- This crate is a generic FSM. It does not move FIL.
Do not file a host- defined FSM as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-statestore leftover (14f1c4b)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-statestore
after go-statemachine leftover.
Official
filecoin-project/go-statestore
14f1c4b.
Extract
/tmp/filecoin-ss.
No mainnet
writes.
Files:
store.go,
state.go.
Checked for:
a
Mutate
that
rewrites
another
key;
a
Begin
that
overwrites
tracked
state.
Result: no user-exploitable finding. Not submitted.
Beginrefuses an existing key.Mutateloads that key, runs the caller mutator, and writes back only if bytes change.- CBOR encode uses leftover- logged go-cbor-util. This crate does not move FIL.
Do not file a local KV store as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-sectorbuilder leftover (5177536)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/go-sectorbuilder
after go-statestore leftover.
Official
filecoin-project/go-sectorbuilder
5177536.
Extract
/tmp/filecoin-sb.
Do not rematch
filecoin-ffi leftover.
Do not rematch
lotus miner leftover.
No mainnet
writes.
Files:
sectorbuilder.go,
sectorbuild_cgo.go,
interface.go.
Checked for: a seal or PoSt that lets a stranger claim another miner's reward without that miner's local paths.
Result: no user-exploitable finding. Not submitted.
Config.Minerbinds cache and sealed paths.AddPiece/SealPreCommit/SealCommit/ PoSt helpers call leftover- logged filecoin-ffi on those local files.- This crate is miner disk tooling. It does not debit FIL.
Do not file local seal FFI as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-hamt-ipld leftover (eb80f85)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
ipfs/go-hamt-ipld
after go-sectorbuilder leftover.
Official
ipfs/go-hamt-ipld
eb80f85.
Extract
/tmp/filecoin-hamt.
No mainnet
writes.
Files:
hamt.go,
README.md.
Checked for: a listed HAMT that rewrites an actor map or moves FIL.
Result: no user-exploitable finding. Not submitted.
- Listed
ipfs/go-hamt-ipldis a deprecated shim. It re-exports unlistedfilecoin-project/go-hamt-ipld. - This repo has no FIL path. Do not leftover- log the unlisted upstream as if it were listed.
Do not file a HAMT shim as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-ipld-cbor leftover (22f1772)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
ipfs/go-ipld-cbor
after go-hamt-ipld leftover.
Official
ipfs/go-ipld-cbor
22f1772.
Extract
/tmp/filecoin-ipldcbor.
No mainnet
writes.
Files:
node.go.
Checked for:
a
DecodeBlock
that
rewrites
a
CID
to
point
at
attacker
bytes
as
if
they
were
the
original
block.
Result: no user-exploitable finding. Not submitted.
DecodeBlockkeeps the caller'sblock.Cid()and raw bytes. It does not recompute or swap the CID.- This crate is an IPLD CBOR node. It does not move FIL.
Do not file an IPLD CBOR node as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining cbor-gen leftover (443b860)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
whyrusleeping/cbor-gen
after go-ipld-cbor leftover.
Official
whyrusleeping/cbor-gen
443b860.
Extract
/tmp/filecoin-cborg.
No mainnet
writes.
Files:
validate.go,
gen.go.
Checked for:
a
ValidateCBOR
that
accepts
trailing
or
oversize
objects
as
a
single
value;
a
codegen
helper
that
moves
FIL.
Result: no user-exploitable finding. Not submitted.
ValidateCBORwalks one CBOR value. Byte strings cap atByteArrayMaxLen(2 MiB). Arrays and maps cap atMaxLength(8192). Trailing bytes error.- This crate generates and checks CBOR. It does not move FIL.
Do not file a CBOR codegen as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus non-miner / bellperson / merkletree / neptune.
2026-09-03: Filecoin leftover remaining merkletree leftover (34825e6)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
filecoin-project/merkletree
after bellperson leftover.
Official
filecoin-project/merkletree
34825e6.
Extract
/tmp/filecoin-mt.
Do not rematch
bellperson leftover.
Do not rematch
rust-fil-proofs leftover.
No mainnet
writes.
Files:
src/proof.rs,
src/merkle.rs.
Checked for:
a
validate
that
accepts
a
path
whose
rebuilt
node
is
not
the
claimed
root;
a
validate_with_data
that
skips
the
leaf
hash.
Result: no user-exploitable finding. Not submitted.
validaterebuilds each arity node from the lemma and path index. A missing sibling returns false. The last hash must equalroot().validate_with_datahashes the caller leaf first. Mismatch is false.- This crate is a Merkle library. It does not move FIL.
Do not file an inclusion proof as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus non-miner / neptune.
2026-09-03: Filecoin leftover remaining neptune leftover (b06f03c)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
lurk-lab/neptune
after merkletree leftover.
Official
lurk-lab/neptune
b06f03c.
Extract
/tmp/filecoin-nep.
Do not rematch
bellperson leftover.
No mainnet
writes.
Files:
src/poseidon.rs,
src/lib.rs.
Checked for:
a
hash
that
skips
full
or
partial
rounds;
a
constant-length
pad
that
accepts
the
wrong
preimage
length.
Result: no user-exploitable finding. Not submitted.
hash_optimized_staticruns half full rounds, then partial rounds, then the remaining full rounds. Constants consumed must match the table.apply_paddingforConstantLengthasserts the preimage length.- This crate is a Poseidon hash. It does not move FIL.
Do not file a Poseidon hash as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus non-miner / neptune-triton.
2026-09-03: Filecoin leftover remaining neptune-triton leftover (9f2c2f4)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
lurk-lab/neptune-triton
after neptune leftover.
Official
lurk-lab/neptune-triton
9f2c2f4.
Extract
/tmp/filecoin-ntr.
Do not rematch
neptune leftover.
No mainnet
writes.
Files:
README.md,
library/neptune-triton/src/lib.rs.
Checked for: a GPU Poseidon that moves FIL or swaps round constants so a false tree matches CPU neptune.
Result: no user-exploitable finding. Not submitted.
- This crate is a Futhark / OpenCL Poseidon used by leftover- logged neptune for batched hashes. Round constants come from the caller at runtime.
- It does not debit FIL.
Do not file a GPU Poseidon as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus non-miner.
2026-09-03: Filecoin leftover remaining lotus mpool leftover (7740217)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
lotus
non-miner
after lotus
paych leftover.
Official
filecoin-project/lotus
7740217.
Extract
/tmp/lotus-paych
(node/impl/full/mpool.go,
chain/messagepool/messagepool.go).
Do not rematch
lotus miner leftover.
Do not rematch
lotus paych leftover.
No mainnet
writes.
Files:
node/impl/full/mpool.go,
chain/messagepool/messagepool.go.
Checked for:
an
MpoolPush
that
accepts
an
unsigned
or
wrong-signer
message;
an
MpoolPushMessage
that
signs
as
a
key
this
node
does
not
hold.
Result: no user-exploitable finding. Not submitted.
checkMessagesize- caps, checks inclusion, rejectsTo == Undefand value over total FIL, thenVerifyMsgSigviaconsensus.AuthenticateMessageagainstFrom.addTsrequires nonce>=state nonce, a valid sender actor, and enough balance including pending.MpoolPushMessageforces nonce 0, estimates gas, andSignMessages the local wallet key forFrom. This pool queues signed messages. It does not debit FIL by itself.
Do not file a signature- checked mpool as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Filecoin leftover remaining lotus market leftover (7740217)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
lotus
non-miner
after lotus
wallet leftover.
Official
filecoin-project/lotus
7740217.
Extract
/tmp/lotus-market.
Do not rematch
lotus miner leftover.
Do not rematch
lotus paych leftover.
Do not rematch
lotus mpool leftover.
Do not rematch
lotus wallet leftover.
Do not rematch
builtin-actors
market leftover.
No mainnet
writes.
Files:
node/impl/market/market.go,
chain/market/fundmanager.go.
Checked for:
a
MarketAddBalance
or
Withdraw
that
spends
a
wallet
this
node
does
not
hold;
a
withdraw
that
takes
reserved
escrow.
Result: no user-exploitable finding. Not submitted.
MarketAddBalanceandAddFundsMpoolPushMessagea marketAddBalancefromwallet. Leftover- logged mpool / wallet sign only a local key.Withdraw/WithdrawFundssendWithdrawBalancefromwallet.processWithdrawalscaps the batch at escrow minus reserved and one wallet per batch.- On-chain market escrow is leftover- logged on builtin- actors. This API only queues signed messages.
Do not file a wallet- signed market helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining periphery leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
periphery
after Rewards
leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-periph.
Do not rematch
Pool leftover.
Do not rematch
Oracle leftover.
Do not rematch
ACL +
PoolConfigurator
leftover.
Do not rematch
Rewards leftover.
No mainnet
writes.
Files:
src/contracts/protocol/configuration/PoolAddressesProvider.sol,
src/contracts/helpers/UiPoolDataProviderV3.sol,
src/contracts/helpers/WalletBalanceProvider.sol,
src/contracts/helpers/AaveProtocolDataProvider.sol.
Checked for:
a
stranger
setPoolImpl
or
setACLManager;
a
wallet-balance
helper
that
transfers
tokens.
Result: no user-exploitable finding. Not submitted.
PoolAddressesProvidersetters (setAddress,setPoolImpl,setPoolConfiguratorImpl,setPriceOracle,setACLManager,setACLAdmin,setPriceOracleSentinel,setPoolDataProvider) areonlyOwner. ConstructortransferOwnerships the supplied owner.UiPoolDataProviderV3andAaveProtocolDataProviderare view readers of pool / oracle state. They do not move tokens.WalletBalanceProviderbalanceOf/batchBalanceOf/getUserWalletBalancesonly readIERC20.balanceOfand native ETH. The file states it is not used inside the protocol.
Do not file an owner- gated address registry or a view balance helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: transfer strategies.
2026-09-03: Aave leftover remaining WrappedTokenGateway leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after periphery
leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-gw.
Do not rematch
Pool leftover.
Do not rematch
periphery leftover.
No mainnet
writes.
Files:
src/contracts/helpers/WrappedTokenGatewayV3.sol.
Checked for:
a
withdrawETH
that
pulls
another
user's
aWETH
without
allowance;
a
borrowETH
that
credits
ETH
to
the
caller
on
a
stranger's
debt.
Result: no user-exploitable finding. Not submitted.
depositETHwrapsmsg.valueandPOOL.deposits toonBehalfOf.withdrawETH/withdrawETHWithPermittransferFrommsg.sender's aWETH, withdraw to this contract, unwrap, and send ETH toto. Permit is try/catch; pull still needs allowance.repayETHwraps up to the on-behalf debt and refunds dust tomsg.sender.borrowETHborrows on behalf ofmsg.sender(credit delegation) and sends ETH tomsg.sender.emergencyTokenTransfer/emergencyEtherTransferareonlyOwner.receiverequiresmsg.sender == WETH.
Do not file an allowance- gated ETH wrapper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: Collector / transfer strategies.
2026-09-03: Aave leftover remaining transfer-strategy leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after Collector
leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-periph.
Do not rematch
Rewards leftover.
Do not rematch
Collector leftover.
No mainnet
writes.
Files:
src/contracts/rewards/transfer-strategies/TransferStrategyBase.sol,
src/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol,
src/contracts/rewards/transfer-strategies/StakedTokenTransferStrategy.sol.
Checked for:
a
stranger
performTransfer
from
the
rewards
vault;
an
emergencyWithdrawal
without
the
rewards
admin.
Result: no user-exploitable finding. Not submitted.
performTransferon pull and staked strategies isonlyIncentivesController. PullsafeTransferFromsREWARDS_VAULT. Staked requiresreward == STAKE_CONTRACTandstakes toto.emergencyWithdrawalisonlyRewardsAdminandsafeTransfers the chosen token.renewApproval/dropApprovalareonlyRewardsAdmin. Controller installs strategies via leftover- loggedonlyEmissionManager.
Do not file an incentives- controller payout as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: IR strategy / other helpers.
2026-09-03: Filecoin leftover remaining lotus eth leftover (7740217)
Immunefi program
filecoin
($50,000,
kyc: true).
Listed remaining
lotus
non-miner
after lotus
market leftover.
Official
filecoin-project/lotus
7740217.
Extract
/tmp/lotus-eth-send.go.
Do not rematch
lotus mpool leftover.
Do not rematch
lotus wallet leftover.
Do not rematch
lotus stmgr leftover.
No mainnet
writes.
Files:
node/impl/eth/send.go.
Checked for:
an
EthSendRawTransaction
that
broadcasts
an
unsigned
or
wrong-signer
tx;
an
untrusted
push
that
skips
signature
checks.
Result: no user-exploitable finding. Not submitted.
ethSendRawTransactionParseEthTransactions the raw bytes, buildsToSignedFilecoinMessage, andMpoolPushs (orMpoolPushUntrustedwhen flagged).- Leftover-
logged
mpool
checkMessagestillVerifyMsgSigs againstFrom. This API does not sign. - The returned hash is the ETH tx hash indexed to the signed message CID.
Do not file a signed-raw-tx broadcast helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining IR strategy leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after transfer-
strategy leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-ir.sol.
Do not rematch
Pool leftover.
Do not rematch
PoolConfigurator
leftover.
Do not rematch
L2Encoder leftover.
No mainnet
writes.
Files:
src/contracts/misc/DefaultReserveInterestRateStrategyV2.sol.
Checked for:
a
stranger
setInterestRateParams
that
zeros
borrow
rates;
a
calculateInterestRates
that
mints
liquidity
to
the
caller.
Result: no user-exploitable finding. Not submitted.
setInterestRateParamsisonlyPoolConfigurator(ADDRESSES_PROVIDER.getPoolConfigurator()).calculateInterestRatesisview. It returns liquidity and variable borrow rates from cached slopes and usage ratios. This contract does not move tokens.
Do not file a configurator- gated rate curve as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: GHO remaining (Gsm4626 / flash minter / FixedFee) / stk / governance.
2026-09-03: Aave leftover remaining Gsm4626 leftover (23859bb)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after GHO
FlashMinter
leftover.
Official
aave-dao/gho-origin
23859bb.
Extract
/tmp/gho-next.
Do not rematch
GHO GSM leftover.
Do not rematch
GHO token leftover.
Do not rematch
FlashMinter leftover.
No mainnet
writes.
Files:
src/contracts/facilitators/gsm/Gsm4626.sol.
Checked for:
a
stranger
backWithGho
that
mints
uncapped
GHO;
yield
_cumulateYieldInGho
paying
the
caller.
Result: no user-exploitable finding. Not submitted.
backWithGho/backWithUnderlyingareonlyRole(CONFIGURATOR_ROLE)andnotSeized. They only restore up to the current deficit.- Buy
/
sell
inherit
leftover-
logged
GSM
notFrozen/notSeizedpaths. _cumulateYieldInGhomints GHO only for excess 4626 backing, capped by the remaining facilitator bucket, into_accruedFeesfor the treasury. It does not pay the caller.
Do not file a configurator- gated deficit backfill or treasury yield accrual as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: stk / StakeToken / OwnableFacilitator / governance.
2026-09-03: Aave leftover remaining GHO DirectFacilitator leftover (23859bb)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
OwnableFacilitator
after Gsm4626
leftover.
Official
aave-dao/gho-origin
23859bb.
Extract
/tmp/gho-direct.sol.
Do not rematch
GHO token leftover.
Do not rematch
Gsm4626 leftover.
Do not rematch
FlashMinter leftover.
No mainnet
writes.
Files:
src/contracts/facilitators/gsm/GhoDirectFacilitator.sol.
Checked for:
a
stranger
mint
of
GHO
without
MINTER_ROLE.
Result: no user-exploitable finding. Not submitted.
- Constructor
grants
DEFAULT_ADMIN_ROLE,MINTER_ROLE, andBURNER_ROLEto a nonzeroadmin. mintisonlyRole(MINTER_ROLE)and forwards to leftover- loggedGhoToken.mint(facilitator bucket).burnisonlyRole(BURNER_ROLE)and burnsmsg.sender's GHO.
Do not file a role-gated direct facilitator as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: stk / StakeToken / governance.
2026-09-03: Aave leftover remaining VotingStrategy leftover (497226e)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after governance
voting leftover.
Official
bgd-labs/aave-governance-v3
497226e.
Extract
/tmp/aave-gov.
Do not rematch
governance-v3 leftover.
Do not rematch
governance voting leftover.
No mainnet
writes.
Files:
src/contracts/voting/VotingStrategy.sol.
Checked for:
a
getVotingPower
that
credits
caller-
supplied
balances
without
a
proven
slot;
a
write
that
mints
voting
power.
Result: no user-exploitable finding. Not submitted.
getVotingPowerisview. It decodes a packed slot for AAVE / stkAAVE / aAAVE and applies the leftover- logged DataWarehouse slashing rate for stkAAVE.hasRequiredRootsisviewand only requires registered storage roots. This contract does not move tokens.
Do not file a view voting-power decoder as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: L2Pool / CCIP GHO pools / protocol-v2.
2026-09-03: Aave leftover remaining L2Pool leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after VotingStrategy
leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-l2pool.sol.
Do not rematch
Pool leftover.
Do not rematch
L2Encoder leftover.
No mainnet
writes.
Files:
src/contracts/protocol/pool/L2Pool.sol.
Checked for:
a
compact
withdraw
or
borrow
that
credits
a
stranger
instead
of
msg.sender;
a
liquidation
that
decodes
a
different
user
than
the
packed
args.
Result: no user-exploitable finding. Not submitted.
- Compact
supply/withdraw/borrow/repay/repayWithATokens/setUserUseReserveAsCollateraldecode via leftover- loggedCalldataLogicand always pass_msgSender()asonBehalfOf/to. liquidationCalldecodes collateral, debt, user, andreceiveATokenfrom the packed args and forwards to leftover- logged Pool liquidation. This wrapper does not change who is credited.
Do not file a msg.sender- bound L2 wrapper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: CCIP GHO pools / protocol-v2.
2026-09-03: Aave leftover remaining protocol-v2 LendingPool leftover (ce53c4a)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after CCIP GHO
leftover.
Official
aave/protocol-v2
ce53c4a.
Extract
/tmp/aave-v2-lp.sol.
Do not rematch
v3 Pool leftover.
Do not rematch
StableDebtToken leftover.
No mainnet
writes.
Files:
contracts/protocol/lendingpool/LendingPool.sol.
Checked for:
a
withdraw
that
burns
another
user's
aTokens
without
allowance;
a
flashLoan
that
skips
repay;
finalizeTransfer
from
a
non-aToken.
Result: no user-exploitable finding. Not submitted.
depositsafeTransferFromsmsg.senderand mints aTokens toonBehalfOf.withdrawburnsmsg.sender's aTokens and sends underlying toto.flashLoanrequiresexecuteOperationsuccess then pulls amountpremium (or opens debt for
onBehalfOfin a borrow mode).finalizeTransferrequiresmsg.senderequal the reserve aToken. Config / pause areonlyLendingPoolConfigurator.
Do not file a standard v2 pool as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 configurator / oracle / tokens.
2026-09-03: Aave leftover remaining v3 AToken leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after protocol-v2
pin
exhaustion.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-v3/AToken.sol.
Do not rematch
v2 AToken leftover
(ce53c4a).
No mainnet
writes.
Files:
src/contracts/protocol/tokenization/AToken.sol.
Checked for:
stranger
mint
/
burn
/
transferUnderlyingTo
without
the
Pool;
user
transfer
skipping
finalizeTransfer.
Result: no user-exploitable finding. Not submitted.
mint,burn,mintToTreasury,transferOnLiquidation, andtransferUnderlyingToareonlyPool.TREASURYis immutable.- User
_transferscales by the reserve income index thenPOOL.finalizeTransfers (HF check on leftover-logged Pool). permitis EIP-2612ecrecover. This token does not let a stranger pull another user's underlying.
Do not file a pool-gated v3 aToken as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: EmissionManager / GhoReserve / v2 etherscan oracles / wrappers.
2026-09-03: Aave leftover remaining EmissionManager leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after v3 AToken
leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-v3/EmissionManager.sol.
Do not rematch
RewardsController
leftover.
No mainnet
writes.
Files:
src/contracts/rewards/EmissionManager.sol.
Checked for:
stranger
setEmissionPerSecond
or
configureAssets
without
being
the
reward's
emission
admin;
setClaimer
without
owner.
Result: no user-exploitable finding. Not submitted.
onlyEmissionAdmin(reward)gates transfer strategy, reward oracle, and distribution end.configureAssets/setEmissionPerSecondrequire every listed reward's admin ismsg.sender.setClaimer,setEmissionAdmin, andsetRewardsControllerareonlyOwner. This contract does not hold reward tokens.
Do not file an emission-admin config as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: GhoReserve / FixedPrice / v2 etherscan leftovers.
2026-09-03: Aave leftover remaining GhoReserve leftover (23859bb)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after
EmissionManager
leftover.
Official
aave-dao/gho-origin
23859bb.
Extract
/tmp/aave-v3/GhoReserve.sol.
Do not rematch
GSM
/
Gsm4626
leftovers.
No mainnet
writes.
Files:
src/contracts/facilitators/gsm/GhoReserve.sol.
Checked for:
stranger
use
draining
GHO
without
a
limit;
restore
crediting
another
entity;
transfer
without
TRANSFER_ROLE.
Result: no user-exploitable finding. Not submitted.
userequireslimit >= used + amountformsg.senderthen transfers GHO to the caller. Unlisted entities have limitrestoredecreasesmsg.sender's used (checked underflow) andtransferFroms GHO in.addEntity/removeEntityareENTITY_MANAGER_ROLE.setLimitisLIMIT_MANAGER_ROLE.transferisTRANSFER_ROLE.initializeisVersionedInitializable.
Do not file a limit-capped entity draw as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: FixedPriceStrategy / v2 Lending Rate Oracle / WrappedTokenGatewayV2 / v2 Collector.
2026-09-03: Aave leftover remaining Lending Rate Oracle leftover (Sourcify)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
etherscan
0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D
(v2
Lending
Rate
Oracle).
Sourcify
fields=all
exact
LendingRateOracle.sol.
Do not rematch
v2 AaveOracle
leftover.
No mainnet
writes.
Files:
Sourcify
LendingRateOracle.sol.
Checked for:
stranger
setMarketBorrowRate
rewriting
stable
borrow
quotes.
Result: no user-exploitable finding. Not submitted.
getMarketBorrowRateis view.setMarketBorrowRateisonlyOwner. This contract does not move tokens.
Do not file an owner-gated rate oracle as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: WrappedTokenGatewayV2 / v2 Collector / FixedPriceStrategy / v3 VariableDebtToken.
2026-09-03: Aave leftover remaining WrappedTokenGatewayV2 leftover (Sourcify)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
etherscan
0xEFFC18fC3b7eb8E676dac549E0c693ad50D1Ce31.
Sourcify
exact
WrappedTokenGatewayV2.sol.
Do not rematch
v3 WrappedTokenGateway
leftover
(cff15de).
No mainnet
writes.
Files:
Sourcify
contracts/WrappedTokenGatewayV2.sol.
Checked for:
withdrawETH
pulling
another
user's
aWETH
without
allowance;
borrowETH
opening
debt
on
a
stranger;
emergency
sweeps
without
owner.
Result: no user-exploitable finding. Not submitted.
withdrawETH/withdrawETHWithPermittransferFrommsg.sender's aWETH then unwrap toto.borrowETHborrowsonBehalfOf = msg.senderand sends ETH tomsg.sender.depositETH/repayETHspendmsg.value.- Emergency
ERC20
/
ETH
sweeps
are
onlyOwner.
Do not file an allowance-gated ETH wrapper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 Collector impl / FixedPriceStrategy / v3 VariableDebtToken / GhoOracle 404.
2026-09-03: Aave leftover remaining v3 VariableDebtToken leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after
WrappedTokenGatewayV2
leftover.
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-v3/VariableDebtToken.sol.
Do not rematch
v2 debt tokens leftover
or
v3 StableDebtToken leftover.
No mainnet
writes.
Files:
src/contracts/protocol/tokenization/VariableDebtToken.sol.
Checked for:
stranger
mint
of
debt
onto
onBehalfOf
without
borrow
allowance;
ERC20
transfer
of
debt;
burn
without
the
Pool.
Result: no user-exploitable finding. Not submitted.
mint/burnareonlyPool. Ifuser != onBehalfOf,_decreaseBorrowAllowancespends the actual debt increase (capped at current allowance).transfer/transferFrom/approverevertOperationNotSupported.balanceOf/totalSupplyare view scaled by the variable debt index.
Do not file a credit-delegation-gated v3 debt mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: FixedPriceStrategy / v2 Collector impl / GhoOracle.
2026-09-03: Aave leftover remaining FixedPriceStrategy leftover (23859bb)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
after v3
VariableDebtToken
leftover.
Official
aave-dao/gho-origin
23859bb.
Extract
/tmp/aave-v3/{FixedPriceStrategy,FixedPriceStrategy4626}.sol.
Do not rematch
GSM
/
Gsm4626
leftovers.
No mainnet
writes.
Files:
src/contracts/facilitators/gsm/priceStrategy/FixedPriceStrategy.sol,
FixedPriceStrategy4626.sol.
Checked for:
a
setter
that
rewrites
PRICE_RATIO;
getAssetPriceInGho
that
mints
GHO.
Result: no user-exploitable finding. Not submitted.
- Both
strategies
are
view
mulDivof an immutablePRICE_RATIO(constructor requires> 0). - 4626
converts
shares
to
assets
via
previewMint/convertToAssetsthen applies the same ratio. These contracts do not move tokens.
Do not file a fixed-ratio quote as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 Collector impl / GhoOracle.
2026-09-03: Aave leftover remaining v2 Collector impl leftover (Sourcify)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed remaining
etherscan
0x464C71f6c2F760DdA6093dCB91C24c39e5d6e18c
(EIP-1967
proxy)
impl
0x83b7Ce402A0E756E901C4A9d1cAfa27cA9572afC.
Sourcify
exact
CollectorWithCustomImpl.sol.
Do not rematch
Collector leftover
(308489d).
No mainnet
writes.
Files:
Sourcify
src/CollectorWithCustomImpl.sol,
lib/.../treasury/Collector.sol.
Checked for:
stranger
transfer
/
approve
without
FUNDS_ADMIN;
withdrawFromStream
above
the
recipient
balance;
initialize
rewriting
live
admin
slots
after
init.
Result: no user-exploitable finding. Not submitted.
approve/transfer/createStreamareonlyFundsAdmin.withdrawFromStream/cancelStreamareonlyAdminOrRecipientand pay onlystream.recipientup to streamed balance.- Custom
initializezeros deprecated slots then grantsDEFAULT_ADMIN_ROLEtoadmin. It isinitializer(one shot).
Do not file a funds-admin treasury as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: GhoOracle.
2026-09-03: Aave leftover remaining GhoOracle leftover (23859bb)
Immunefi program
aave
($1,000,000,
kyc: true).
Listed URL
path
.../oracle/GhoOracle.so
404s
on
gho-origin
23859bb
and
main.
Official
file
is
src/contracts/misc/GhoOracle.sol.
Extract
/tmp/aave-v3/GhoOracle.sol.
Do not rematch
v2
/
v3
AaveOracle
leftovers.
No mainnet
writes.
Files:
src/contracts/misc/GhoOracle.sol.
Checked for:
a
setter
that
moves
GHO
off
1
USD;
latestAnswer
returning
0.
Result: no user-exploitable finding. Not submitted.
GHO_PRICEis1e8constant.latestAnswer/decimalsarepure. There is no setter and no token movement.
Do not file
a
hardcoded
1
USD
feed
as
stranger
theft.
Do not loop
the
listed
.so
404.
Not submitted. Payment requires user KYC. Remaining listed: v3 logic libraries (BorrowLogic / SupplyLogic / LiquidationLogic / FlashLoanLogic and siblings) / primacy.
2026-09-03: Aave leftover remaining v3 money-path logic leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-v3-logic/.
Do not rematch
v3 Pool
/
L2Pool
leftovers
or
protocol-v2
logic leftovers
(ce53c4a).
Official
BridgeLogic.sol
/
IsolationModeLogic.sol
/
EModeLogic.sol
404 on
cff15de.
No mainnet
writes.
Files:
src/contracts/protocol/libraries/logic/{SupplyLogic,BorrowLogic,LiquidationLogic,FlashLoanLogic}.sol.
Checked for:
supply that
credits a
stranger
without
transferFrom;
withdraw that
burns another
user’s aTokens;
borrow that
skips HF or
credit
delegation;
repay that
clears a
stranger’s
debt from
someone else’s
aTokens;
flash loan
that skips
repay;
liquidate of
a solvent
account.
Result: no user-exploitable finding. Not submitted.
executeSupplysafeTransferFromsparams.userand mints aTokens toparams.onBehalfOf.executeWithdrawburnsparams.useraTokens (scaled balance ofparams.user) and sends underlying toparams.to. Remaining collateral plus borrowing runsvalidateHFAndLtvzero.executeBorrowmints variable debtmint(user, onBehalfOf). Underlying goes toparams.userwhenreleaseUnderlying. ThenvalidateHFAndLtvononBehalfOf. Credit delegation sits on leftover-logged v3 VariableDebtToken.executeRepayburnsonBehalfOfdebt. aToken repay burnsparams.useraTokens.executeFlashLoanvalidates first, transfers underlying to the receiver, requiresexecuteOperation, then mode NONE pulls amount plus premium from the receiver via_handleFlashLoanRepayment. ElseBorrowLogic.executeBorrowwithreleaseUnderlying: false.executeFlashLoanSimplealways repays amount plus premium.executeLiquidationCallcomputes HF viaGenericLogic.calculateUserAccountData.validateLiquidationCallrequireshealthFactor < 1e18. Close factor is 50% when HF is aboveCLOSE_FACTOR_HF_THRESHOLDand both sides meetMIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD.
Do not file standard v3 supply / withdraw / borrow / repay / flash-loan repay / HF-gated liquidation as stranger theft. Do not loop the three official logic 404s.
Not submitted. Payment requires user KYC. Remaining listed: v3 ValidationLogic / GenericLogic / PoolLogic / ConfiguratorLogic / CalldataLogic / primacy.
2026-09-03: Aave leftover remaining v3 ValidationLogic + GenericLogic leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-v3-logic/.
Do not rematch
v3 money-path
logic leftover
or
protocol-v2
ValidationLogic
+
GenericLogic
leftover
(ce53c4a).
No mainnet
writes.
Files:
src/contracts/protocol/libraries/logic/{ValidationLogic,GenericLogic}.sol.
Checked for:
supply /
withdraw /
borrow
validators
that skip
caps or
pause;
validateRepay
that lets
type(uint256).max
clear a
stranger’s
debt;
HF check
that treats
HF < 1
as healthy;
liquidation
validator
that allows
solvent
accounts;
calculateUserAccountData
that omits
debt or
inflates
collateral.
Result: no user-exploitable finding. Not submitted.
validateSupplyrequires active / unpaused / unfrozen, rejects supply to the aToken, and enforces the supply cap including treasury accrual.validateWithdrawrequires scaled amount<=scaled user balance.validateBorrowrequires variable mode, borrowable flag or eMode bitmap, aToken supply>=amount, and the borrow cap.
onBehalfOf`.validateRepayforbids max-uint repay on behalf unless `uservalidateFlashloan/validateFlashloanSimplerequire unique assets, flash-loan enabled, and aToken supply>=amount.validateLiquidationCallrejects self-liquidation, paused / inactive reserves, grace period, and `healthFactor= 1e18`.
validateHealthFactor/validateHFAndLtvrequire HF>= 1e18. LTV must be non-zero and collateral must cover new borrow.validateHFAndLtvzeroforces a zero-LTV asset to be the first withdraw when the position holds one.calculateUserAccountDatawalks user-config flags. Collateral uses scaled aToken balance*price/unit. Debt usesmulDivCeilof scaled variable debt. HF istype(uint256).maxwhen debt is 0, else weighted liquidation threshold wadDiv debt/ 10000.calculateAvailableBorrowsispercentMulFloor(ltv)minus debt.
Do not file view HF / cap / pause checks as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v3 PoolLogic / ConfiguratorLogic / CalldataLogic / primacy.
2026-09-03: Aave leftover remaining v3 PoolLogic + ConfiguratorLogic + CalldataLogic leftover (cff15de)
Immunefi program
aave
($1,000,000,
kyc: true).
Official
aave-dao/aave-v3-origin
cff15de.
Extract
/tmp/aave-v3-logic/.
Do not rematch
v3 Pool
/
L2Pool
/
ACL +
PoolConfigurator
leftovers
or
v3 money-path
/
ValidationLogic
leftovers.
No mainnet
writes.
Files:
src/contracts/protocol/libraries/logic/{PoolLogic,ConfiguratorLogic,CalldataLogic}.sol.
Checked for:
init that
overwrites
an existing
reserve;
rescue that
a stranger
can call
from the
library;
treasury
mint that
credits a
caller;
configurator
upgrade that
skips the
proxy admin;
L2 decoder
that maps
assetId
to a
stranger’s
reserve.
Result: no user-exploitable finding. Not submitted.
executeInitReserverequires a contract asset and rejects an already added reserve. It fills a legacy gap or appends undermaxNumberReserves.executeRescueTokensis asafeTransferhelper. The Pool entrypoint is leftover-logged and admin-gated.executeMintToTreasuryzerosaccruedToTreasuryand mints that scaled amount to the treasury viamintToTreasury. Inactive reserves are skipped.executeSetLiquidationGracePeriodwritesuntil. The Pool entrypoint is configurator-gated.executeGetUserAccountDatais a view wrapper around leftover-logged GenericLogic.ConfiguratorLogic.executeInitReservecreates aToken / variable debt proxies, callspool.initReserve, and sets decimals plus active. Called from leftover-logged PoolConfigurator (ACL).- Token
upgrades
go
through
upgradeToAndCallon the existing admin proxy. CalldataLogicunpacks L2 packed args (assetId, amount, referral, permit fields) fromreservesList. It does not move tokens.
Do not file admin-gated init / rescue / treasury mint or L2 calldata decode as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: primacy.
2026-09-03: Jito leftover remaining jito-solana bundle + fee leftover (d0e3a47)
Immunefi program
jito
($250,000,
kyc: true).
Official
jito-foundation/jito-solana
d0e3a47.
Extract
/tmp/jito-solana/.
Do not rematch
bundle_stage
/
banking_stage
/
tip_manager
leftovers.
No mainnet
writes.
Files:
bundle/src/lib.rs,
fee/src/lib.rs,
core/src/bundle.rs,
core/src/packet_bundle.rs.
Checked for:
derive_bundle_id
that lets
a stranger
swap a
bundle
after
hashing;
fee calc
that
under-charges
so a
stranger
tx is
free.
Result: no user-exploitable finding. Not submitted.
derive_bundle_idSHA-256s joined signatures.SanitizedBundlestores that id.PacketBundle/VerifiedPacketBundlewrap aPacketBatch. They do not execute txs.calculate_feeis signature countsaturating_mullamports_per_signatureplus the caller’s priority fee. View helper. No token movement.
Do not file a bundle-id hash or view fee helper as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
jito-solana
tokens /
programs /
runtime /
other crates
(if still unused).
2026-09-03: Jito leftover remaining jito-solana tokens leftover (d0e3a47)
Immunefi program
jito
($250,000,
kyc: true).
Official
jito-foundation/jito-solana
d0e3a47.
Extract
/tmp/jito-solana/tokens/.
Do not rematch
scheduler
/
bundle +
fee leftovers.
No mainnet
writes.
Files:
tokens/src/{lib,commands,spl_token,stake}.rs.
Checked for:
transfer
that spends
a stranger’s
SOL;
SPL
transfer_checked
from a
token
account
the signer
does not
own;
process_allocations
that
skips the
local
keypair.
Result: no user-exploitable finding. Not submitted.
transferbuilds a system transfer signed only bysender_keypair.distribution_instructionsusesargs.sender_keypair.pubkey()asfrom. Stake creates make the recipient the new stake / withdraw authority.build_spl_token_instructionstransfers fromspl_token_args.token_account_addresswithsender_keypairas owner.check_spl_token_balances/ SOL balance checks returnInsufficientFundswhen the local fee-payer or source cannot cover the airdrop.- This is
an
operator
CLI
(
solana-tokens). It does not expose a public submit API.
Do not file a local-wallet airdrop CLI as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
jito-solana
programs /
runtime
(if still unused).
2026-09-03: Jito leftover remaining jito-solana programs leftover (d0e3a47)
Immunefi program
jito
($250,000,
kyc: true).
Official
jito-foundation/jito-solana
d0e3a47.
Extract
/tmp/jito-solana/programs/system/.
Do not rematch
tokens
/
scheduler leftovers.
No mainnet
writes.
Files:
programs/system/src/{lib,system_processor,system_instruction}.rs.
Checked for:
Transfer
that moves
lamports
without
the from
signer;
CreateAccount
that
overwrites
an existing
account;
Assign
that
changes
owner
without
a
signature;
TransferWithSeed
that
spends a
PDA
without
the base
signer.
Result: no user-exploitable finding. Not submitted.
Transferrequires thefromaccount to sign.transfer_verifiedrejects a data-carryingfromand insufficient lamports, thenchecked_sub/checked_add.CreateAccount/Allocaterequire thetoaddress to sign and reject an already used account.Assignrequires the account address to sign.TransferWithSeedrequires the base signer and re-derives the address from seed + owner.- Native
system
program.
A
stranger
still
needs
a valid
signature
on
from.
Do not file
standard
system
Transfer
as stranger
theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
jito-solana
vote /
runtime /
other
programs
(if still unused).
2026-09-03: Jito leftover remaining jito-solana remaining runtime leftover (d0e3a47)
Immunefi program
jito
($250,000,
kyc: true).
Official
jito-foundation/jito-solana
d0e3a47.
Extract
/tmp/jito-solana/runtime/src/inflation_rewards/.
Do not rematch
runtime fee
/
vote_reward leftovers.
No mainnet
writes.
Files:
runtime/src/inflation_rewards/{mod,points}.rs,
runtime/src/rent_collector.rs,
runtime/src/reward_info.rs.
Checked for: inflation payout that credits a stranger stake; commission split that overflows into extra voter lamports; rent helper that collects from a funded account.
Result: no user-exploitable finding. Not submitted.
- Validator epoch math, not a stranger IX.
- Points come from vote credits times effective stake. Zero points / disabled inflation / activation epoch skip payout.
- Tower
scales
points by
rewards/pointsin u128. A split that would drop a whole lamport on either side is skipped. - Alpenglow keeps the remainder on the voter. Commission is capped at 10_000 bps.
RentCollectoris a config struct.RewardInfois a DTO.
Do not file validator epoch inflation math as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
jito-solana
check_transactions
/
partitioned
epoch rewards
(if still unused).
2026-09-03: Jito leftover remaining jito-solana partitioned epoch rewards leftover (d0e3a47)
Immunefi program
jito
($250,000,
kyc: true).
Official
jito-foundation/jito-solana
d0e3a47.
Extract
/tmp/jito-solana/runtime/src/bank/partitioned_epoch_rewards/.
Do not rematch
remaining runtime
/
vote_reward leftovers.
No mainnet
writes.
Files:
runtime/src/bank/partitioned_epoch_rewards/{mod,calculation,distribution,epoch_rewards_hasher,sysvar}.rs.
Checked for: distribution that credits a stranger stake; capitalization that mints beyond the partition; sysvar drain that a stranger can call.
Result: no user-exploitable finding. Not submitted.
- Validator bank path, not a stranger IX.
- Credits
only the
stake_pubkeyalready in the partition, viachecked_add_lamports. - Height gates the partition index. Hasher splits by parent blockhash.
- Sysvar tracks distributed vs total and does not move user lamports.
Do not file partitioned epoch credits as stranger theft.
Not submitted.
Payment requires
user KYC.
Remaining listed:
jito-solana
check_transactions
(if still unused).
2026-09-03: Jito leftover remaining jito-solana check_transactions leftover (d0e3a47)
Immunefi program
jito
($250,000,
kyc: true).
Official
jito-foundation/jito-solana
d0e3a47.
Extract
/tmp/jito-solana/runtime/src/bank/check_transactions.rs.
Do not rematch
partitioned
epoch rewards
/
runtime fee leftovers.
No mainnet
writes.
Files:
runtime/src/bank/check_transactions.rs.
Checked for: age check that skips fee payment; nonce advance that a stranger can force; status cache bypass that replays a settled tx.
Result: no user-exploitable finding. Not submitted.
- Validator bank helper, not a stranger IX.
- Age + compute- budget limits then status cache. v1 txs are feature- gated.
- Fee details are computed here. Lamport debit is leftover- logged runtime fee.
- Nonce age uses durable nonce vs blockhash queue.
Do not file a bank tx-age check as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftover that listed trees open is exhausted on this pin.
2026-09-03: Optimism leftover remaining dispute games leftover (eea9542)
Immunefi program
optimism
($2,000,042,
kyc: true).
Official remaining
listed after L1
portal /
StandardBridge
leftover.
Official
ethereum-optimism/optimism
eea9542.
Extract
/tmp/op-dispute/.
Sourcify ETH
FaultDisputeGame
0x4146DF64D83acB0DcB0c1a4884a16f090165e122,
PermissionedDisputeGame
0xE9daD167EF4DE8812C1abD013Ac9570C616599A0,
PreimageOracle
0xD326E10B8186e90F4E2adc5c13a2d0C137ee8b34,
MIPS
0x0f8EdFbDdD3c0256A80AD8C0F2560B1807873C9c,
DelayedWETH proxy
0xE497B094d6DbB3D5E4CaAc9a14696D7572588d14.
Do not rematch
L1 portal /
StandardBridge leftover.
No mainnet
writes.
Files:
packages/contracts-bedrock/src/dispute/{FaultDisputeGame,PermissionedDisputeGame,DelayedWETH,DisputeGameFactory,AnchorStateRegistry}.sol,
packages/contracts-bedrock/src/cannon/{PreimageOracle,MIPS64}.sol.
Checked for:
claimCredit
that pays the
caller;
DelayedWETH.withdraw
that drains
another
account's
unlock;
factory
create
that clones
without the
init bond;
challengeLPP
that pays
without a
failed
keccak.
Result: no user-exploitable finding. Not submitted.
Factory
initBondscreaterequires `msg.value. Clone calldata bindsmsg.sender` as creator.initializerecordsmsg.valueas the creator bond and deposits it into DelayedWETH.claimCreditcloses a finalized game, then unlocks / withdraws for_recipientand pays that address, not the caller.- DelayedWETH
unlock/withdrawonly movewithdrawals [msg.sender] [_guy].recover/holdare owner-only. Permissioned game gates
proposer`.move/stepto proposer or challenger. Init requires `tx.origin- Preimage
challengeLPPpays the bond only after a proven keccak mismatch.
Do not file a finalized credit claim or a proven preimage challenge as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: op-node / op-dispute-mon / L2 contracts / PolicyEngineStaking / websites (if still unused).
2026-09-03: Optimism leftover remaining mintable factory leftover (eea9542)
Immunefi program
optimism
($2,000,042,
kyc: true).
Official unused
listed factory
after L1 portal
leftover.
Official
ethereum-optimism/optimism
eea9542.
Sourcify ETH
OptimismMintableERC20Factory
proxy
0x75505a97BD334E7BD3C476893285569C4136Fa0F
impl
0xaAbEA75Da509fA518Fd8a91Eae4BE5813B829b12.
Extract
/tmp/op-unused/OptimismMintableERC20Factory/.
Do not rematch
L1 portal /
StandardBridge leftover
or L2 ETH
liquidity leftover.
No mainnet
writes.
Files:
packages/contracts-bedrock/src/universal/{OptimismMintableERC20Factory,OptimismMintableERC20}.sol.
Checked for:
createOptimismMintableERC20
that mints
caller-chosen
supply;
mint /
burn that
anyone can
call;
stranger
burn of
another
account.
Result: no user-exploitable finding. Not submitted.
- Factory
initializeis ProxyAdmin gated.create*CREATE2s a token with saltkeccak (remote, name, symbol, decimals)and recordsdeployments [local] = remote. It does not mint. - Token
mint/burnareonlyBridge. Constructor binds immutableBRIDGEandREMOTE_TOKEN. allowancereturnstype(uint256).maxfor the Permit2 preinstall. That is documented Optimism design, not a stranger drain of this factory.
Do not file a bridge-gated mintable token or a CREATE2 factory as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node leftover (p2p / sequencing) / L2OutputOracle / SystemConfig / websites / rust/op-reth (if still unused).
2026-09-03: Optimism leftover remaining L2OutputOracle leftover
Immunefi program
optimism
($2,000,042,
kyc: true).
Official unused
listed L2OutputOracle
after mintable
factory leftover.
Sourcify ETH
L2OutputOracle
proxy
0xdfe97868233d1aa22e815a266982f2cf17685a27
impl
0xF243BEd163251380e78068d317ae10f26042B292.
Extract
/tmp/op-unused/L2OutputOracle/.
GitHub
eea9542
L2OutputOracle.sol
is 404.
Do not rematch
mintable factory
leftover or L1
portal leftover.
No mainnet
writes.
Files:
src/L1/L2OutputOracle.sol.
Checked for:
stranger
proposeL2Output
that writes a
root;
deleteL2Outputs
that truncates
finalized
outputs;
payable
proposeL2Output
that credits
the caller.
Result: no user-exploitable finding. Not submitted.
proposeL2Outputrequiresmsg.sender == proposer, the next expected L2 block number, a non-zero output root, and a past L2 timestamp. Optional L1 blockhash must matchblockhash.msg.valueis unused.deleteL2Outputsrequiresmsg.sender == challenger, an existing index, and that the output is still insidefinalizationPeriodSeconds.- Getters and binary search are view only. This contract does not transfer ETH or tokens.
Do not file a proposer- gated output oracle as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node leftover (p2p / sequencing) / SystemConfig / websites / rust/op-reth (if still unused).
2026-09-03: Optimism leftover remaining SystemConfig leftover
Immunefi program
optimism
($2,000,042,
kyc: true).
Official unused
listed SystemConfig
after L2OutputOracle
leftover.
Sourcify ETH
SystemConfig
proxy
0x229047fed2591dbec1eF1118d64F7aF3dB9EB290
impl
0x42Ad0173051225Ac784100e9acD43349707F4db9.
Extract
/tmp/op-unused/SystemConfig/.
Do not rematch
L2OutputOracle leftover,
mintable factory leftover,
or ETHLockbox leftover.
No mainnet
writes.
Files:
src/L1/SystemConfig.sol.
Checked for:
stranger
setBatcherHash
or
setUnsafeBlockSigner;
setFeature
that flips
ETHLockbox
without
ProxyAdmin;
initialize
that anyone
can call.
Result: no user-exploitable finding. Not submitted.
initializeisreinitializerand_assertOnlyProxyAdminOrProxyAdminOwner.- Config
setters
(
setBatcherHash, gas, EIP-1559, operator fee, DA scalar, unsafe signer) areonlyOwner. setFeatureis ProxyAdmin gated. ETH lockbox disable reverts if the portal still has a lockbox or the system is paused.- Getters
and
pausedread SuperchainConfig. This contract does not transfer ETH or tokens.
Do not file an owner- gated system config as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node leftover (p2p / sequencing) / websites / rust/op-reth (if still unused).
2026-09-03: Optimism leftover remaining ProxyAdmin leftover
Immunefi program
optimism
($2,000,042,
kyc: true).
Official unused
listed ProxyAdmin
and AddressManager
after SystemConfig
leftover.
Sourcify ETH
ProxyAdmin
0x543bA4AADBAb8f9025686Bd03993043599c6fB04,
Lib_AddressManager
0xdE1FCfB0851916CA5101820A69b13a4E276bd81F.
Extract
/tmp/op-unused/ProxyAdmin/.
Do not rematch
SystemConfig leftover
or L1 portal leftover.
No mainnet
writes.
Files:
src/universal/ProxyAdmin.sol,
src/legacy/AddressManager.sol.
Checked for:
stranger
upgrade /
upgradeAndCall
that swaps
an impl;
changeProxyAdmin
that steals
admin;
setAddress
that
rewrites a
name.
Result: no user-exploitable finding. Not submitted.
- ProxyAdmin
mutators
(
setProxyType,setImplementationName,setAddressManager,setAddress,setUpgrading,changeProxyAdmin,upgrade,upgradeAndCall) areonlyOwner. - AddressManager
setAddressisonlyOwner. Getters are view. upgradeAndCallforwardsmsg.valueonly after the owner upgrade. This contract does not hold user funds.
Do not file an owner- gated proxy admin as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: websites / rust/op-reth (if still unused).
2026-09-03: Optimism leftover remaining rust/op-reth flashblocks leftover (a8a3b818)
Immunefi program
optimism
($2,000,042,
kyc: true).
Official remaining
listed after
op-reth leftover /
websites leftover.
Official
ethereum-optimism/optimism
rust/op-reth
on develop
a8a3b818.
eea9542
404s this
tree.
Extract
/tmp/op-reth-fb/.
Do not rematch
op-reth leftover
(payload / rpc)
or consensus
leftover
(txpool).
No mainnet
writes.
Files:
rust/op-reth/crates/flashblocks/src/{lib,payload,consensus,service,sequence,validation,worker,pending_state}.rs,
rust/op-reth/crates/flashblocks/src/ws/{mod,decoding,stream}.rs,
rust/op-reth/crates/storage/src/{lib,chain}.rs.
Checked for: WS flashblock that mints a deposit as canonical L2 ETH; consensus client that pays a caller; storage crate that rewrites balances.
Result: no user-exploitable finding. Not submitted.
OpStorageisEmptyBodyStorage. No credit path.WsFlashBlockStreamdecodes a configured sequencer URL. Index 0 resets; followups need the same block andpayload_id.- Pending build is speculative RPC state. Reorg / catch-up / depth-limit clears it.
- Worker
execute
skips when
parent is
not the
local tip
and no
pending
parent
exists.
post_block_balance_incrementsis empty. FlashBlockConsensusClientsubmitsengine_newPayload/ FCU on the leftover- logged JWT engine handle. Zerostate_rootskips newPayload. This is not a public user entry.
Do not file a configured flashblocks WS or speculative pending block as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftovers if still open. Official Optimism leftover that listed trees open is exhausted except unused official leftovers if still open.
2026-09-03: Arbitrum leftover remaining nitro challenge leftover (7fc6624)
Immunefi program
arbitrum
($2,000,000,
kyc: true).
Official remaining
listed after
token-bridge +
Inbox leftover.
Official
OffchainLabs/nitro-contracts
7fc6624.
Extract
/tmp/arb-nitro/.
Do not rematch
token-bridge +
Inbox leftover.
No mainnet
writes.
Files:
src/challengeV2/{EdgeChallengeManager,IEdgeChallengeManager}.sol,
src/rollup/{RollupUserLogic,RollupCore,RollupLib}.sol,
src/osp/{OneStepProofEntry,IOneStepProofEntry}.sol.
Checked for:
a stranger
confirmAssertion
that refunds
another
validator's
stake;
refundStake
that pays the
caller;
OSP that
confirms a
forged
one-step
and sweeps
bonds.
Result: no user-exploitable finding. Not submitted.
newStake/stakeOnNewAssertion/confirmAssertionareonlyValidator.returnOldDepositwithdraws an inactivemsg.sender.returnOldDepositForneeds the staker's withdrawal address.- Second
child moves
requiredStaketoloserStakeEscrow.withdrawStakerFundspaysmsg.senderfrom that account's withdrawable map. - Fast
confirm is
anyTrustFastConfirmeronly. - Layer-zero
edges
whitelist
when the
rollup does.
Rival stake
goes to
excessStakeReceiver.refundStakepaysedge.stakeraftersetRefunded. - OSP
proveOneStepis view. Confirm needs a length-1 small-step edge plus history proofs.
Do not file validator- gated BOLD stake or a view OSP step as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: custom reverse gateway leftover is logged; governance / fund-distribution / remaining token-bridge libs / websites (if still unused).
2026-09-03: Arbitrum leftover remaining custom reverse gateway leftover (1bdf3cd)
Immunefi program
arbitrum
($2,000,000,
kyc: true).
Official remaining
listed after
nitro challenge
leftover.
Official
OffchainLabs/token-bridge-contracts
1bdf3cd.
Extract
/tmp/arb-tb/.
Do not rematch
token-bridge +
Inbox leftover
or nitro
challenge
leftover.
No mainnet
writes.
Files:
contracts/tokenbridge/ethereum/gateway/{L1CustomGateway,L1ReverseCustomGateway,L1ForceOnlyReverseCustomGateway,L1WethGateway,L1ArbitrumExtendedGateway}.sol,
contracts/tokenbridge/arbitrum/gateway/{L2CustomGateway,L2ReverseCustomGateway,L2WethGateway}.sol,
contracts/tokenbridge/arbitrum/ReverseArbToken.sol,
contracts/tokenbridge/libraries/{L2CustomGatewayToken,aeWETH}.sol.
Checked for:
a stranger
registerTokenToL2
that remaps
another token;
reverse
bridgeMint
that credits
the caller;
WETH unwrap
that pays
someone else's
ETH.
Result: no user-exploitable finding. Not submitted.
- Custom
register
requires
msg.senderisArbitrumEnabledand maps that token only. Force register isonlyOwner. L2registerTokenFromL1isonlyCounterpartGateway. - Reverse L1
inbound
bridgeMints; outboundbridgeBurns leftover- logged router_from. Reverse L2 inboundsafeTransfers escrow; outboundsafeTransferFroms_from. ReverseArbTokenmint/burn revert. Force-only user register is disabled.- WETH L1
unwraps
after
transferFrom_from. Inbound wraps then pays_dest. L2 address is onlyl1Weth. Tradable exit is disabled on WETH. - Exit
redirect
requires
msg.sender== expected sender. aeWETHbridgeMintreverts.bridgeBurnisonlyGateway. Withdraw burnsmsg.sender.
Do not file token-gated custom register or router-bound reverse escrow as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: governance leftover is logged; fund-distribution / remaining token-bridge libs / websites (if still unused).
2026-09-03: Arbitrum leftover remaining governance leftover (9e413da)
Immunefi program
arbitrum
($2,000,000,
kyc: true).
Official remaining
listed after
custom reverse
gateway leftover.
Official
ArbitrumFoundation/governance
9e413da.
Extract
/tmp/arb-gov/.
UpgradeExecutor.sol
404s on this
pin.
Do not rematch
custom reverse
gateway leftover
or nitro
challenge
leftover.
No mainnet
writes.
Files:
src/{TokenDistributor,L1ArbitrumToken,L2ArbitrumToken,L2ArbitrumGovernor,L1ArbitrumTimelock,ArbitrumTimelock,FixedDelegateErc20Wallet,UpgradeExecRouteBuilder}.sol.
Checked for:
a stranger
claim of
another
address's
ARB; mint
without
owner;
sweep that
pays the
caller.
Result: no user-exploitable finding. Not submitted.
claimpaysclaimableTokens[msg.sender]then zeros it. Sweep after the claim window sends leftovers tosweepReceiver.setRecipients/withdrawareonlyOwner.- L1
bridgeMint/bridgeBurnareonlyArbOneGateway. L2mintisonlyOwnerand 2%/year capped. - Governor
relayisonlyOwner. Cancel is the proposer. - L1
timelock
schedule
is
L2-bridge
gated.
Wallet
transferisonlyOwner. - Route builder encodes upgrade calldata. It does not move tokens.
Do not file owner-set claims or gateway- gated ARB mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: fund-distribution leftover is logged; remaining token-bridge libs / websites (if still unused).
2026-09-03: Arbitrum leftover remaining fund-distribution leftover (52bc499)
Immunefi program
arbitrum
($2,000,000,
kyc: true).
Official remaining
listed after
governance leftover.
Official
OffchainLabs/fund-distribution-contracts
52bc499.
Extract
/tmp/arb-fd/.
Do not rematch
governance leftover
or custom reverse
gateway leftover.
No mainnet
writes.
Files:
src/{RewardDistributor,Util}.sol.
Checked for:
distributeRewards
that pays a
stranger group;
weight hash
that can be
swapped to
redirect
funds.
Result: no user-exploitable finding. Not submitted.
- Recipients
and weights
are hashed
into
currentRecipientGroup/currentRecipientWeights. Distribute reverts if the caller supplies a different set. setRecipientsis private. Updates go throughonlyOwnerdistributeAndUpdateRecipients.- Anyone may trigger a payout, but only to the committed recipients at their committed bps. Remainder stays in the contract.
- Failed ETH
sends fall
back to
owner(). Native receive is disabled when a token is set.
Do not file an owner-set weighted payout as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: token-bridge libs leftover is logged; websites (if still unused).
2026-09-03: Arbitrum leftover remaining token-bridge libs leftover (1bdf3cd)
Immunefi program
arbitrum
($2,000,000,
kyc: true).
Official remaining
listed after
fund-distribution
leftover.
Official
OffchainLabs/token-bridge-contracts
1bdf3cd.
Extract
/tmp/arb-tblib/.
Do not rematch
token-bridge +
Inbox leftover,
custom reverse
gateway leftover,
or nitro
challenge
leftover.
No mainnet
writes.
Files:
contracts/tokenbridge/libraries/{L2GatewayToken,TransferAndCallToken,aeERC20,Whitelist}.sol,
contracts/tokenbridge/libraries/gateway/{TokenGateway,GatewayRouter,GatewayMessageHandler}.sol,
contracts/tokenbridge/arbitrum/gateway/{L2GatewayRouter,L2ERC20Gateway}.sol,
contracts/tokenbridge/arbitrum/{StandardArbERC20,L2ArbitrumMessenger}.sol,
contracts/tokenbridge/ethereum/L1ArbitrumMessenger.sol.
Checked for:
bridgeMint
that credits
a stranger;
router
outboundTransfer
that pulls
another
account;
L2
setGateway
that remaps
a token.
Result: no user-exploitable finding. Not submitted.
L2GatewayTokenbridgeMint/bridgeBurnareonlyGateway.- Router
outbound
encodes
msg.senderas_fromand forwardsmsg.value. Inbound on the router revertsONLY_OUTBOUND_ROUTER. - L2 router
setGateway/setDefaultGatewayareonlyCounterpartGateway(L1 alias). - Standard
L2 token
deploys
via beacon
CREATE2.
Address
mismatch
withdraws
back to
_from. transferAndCallmovesmsg.sendertokens then callbacks the recipient.- Whitelist
mutators
are
onlyOwner. Messengers only wrap Inbox / ArbSys tickets.
Do not file gateway-gated mint or sender-encoded router outbound as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftover that listed Arbitrum trees open is exhausted at leftover-heading level. Next unused leftover is a different Immunefi program, not a rematch.
Next candidates
Hedera leftover remaining Node leftover (0d3d9a2) is
logged. Hedera leftover remaining cryptography leftover
(39f28f3) is logged. Hedera leftover remaining SDK-js
leftover (5b785ed) is logged. Hedera leftover remaining
mirror-node leftover (abfc59f) is logged.
Hedera leftover hiero-mirror-node importer leftover
(abfc59f) is logged. Hedera leftover remaining SDK-java
leftover (eedd4b3) is logged. Hedera leftover remaining
SDK-go leftover (029d087) is logged. Filecoin leftover
remaining boost leftover (240aa6e) is logged. Filecoin
leftover remaining go-f3 leftover (5f2c984) is logged.
Filecoin leftover remaining lotus miner leftover
(7740217) is logged.
Filecoin leftover remaining FVM leftover (d4efdd4)
is logged.
ZKsync OS leftover zk_ee + basic_system IO leftover
(9efc8bf) is logged.
Filecoin leftover remaining proofs-api leftover
(7637843) is logged.
Filecoin leftover remaining proofs-ffi leftover
(59f46f4) is logged.
Filecoin leftover remaining proofs leftover (d451d23)
is logged.
Filecoin leftover remaining filecoin.io website leftover
is logged.
Filecoin leftover remaining filecoin-ffi leftover (17b1c64)
is logged.
Filecoin leftover remaining go-graphsync leftover (12cbffa)
is logged.
ZKsync OS leftover zkos-wrapper leftover
(8b679aa) is logged.
ZKsync OS leftover airbender verifier leftover
(6ec4ea7) is logged.
Filecoin leftover remaining paired leftover
(80b765c) is logged.
Filecoin leftover remaining go-data-transfer leftover
(8a94d94) is logged.
Filecoin leftover remaining go-crypto leftover
(91b77aa) is logged.
Filecoin leftover remaining go-address leftover
(73c8a46) is logged.
Filecoin leftover remaining go-fil-commcid leftover
(62ce856) is logged.
Wormhole leftover remaining CosmWasm token-bridge leftover
(c58827e) is logged.
Wormhole leftover remaining CosmWasm core leftover
(c58827e) is logged.
Wormhole leftover remaining CosmWasm IBC leftover
(c58827e) is logged.
Wormhole leftover remaining CosmWasm accountant leftover
(c58827e) is logged.
Wormhole leftover remaining wormchain leftover
(c58827e) is logged.
Wormhole leftover remaining node leftover
(c58827e) is logged.
Wormhole leftover remaining Algorand Aptos Near leftover
(c58827e) is logged.
ZKsync OS leftover remaining airbender CS leftover
(6ec4ea7) is logged.
Filecoin leftover remaining go-amt-ipld leftover (04938b0)
is logged.
Filecoin leftover remaining go-bitfield leftover (1602662)
is logged.
Filecoin leftover remaining go-cbor-util leftover (c99ffda)
is logged.
Filecoin leftover remaining go-padreader leftover (2d55fc9)
is logged.
Hedera leftover remaining hashed transaction-tool leftover (224dfd2)
is logged.
Filecoin leftover remaining go-statemachine leftover (029d947)
is logged.
Filecoin leftover remaining go-statestore leftover (14f1c4b)
is logged.
Filecoin leftover remaining go-sectorbuilder leftover (5177536)
is logged.
Filecoin leftover remaining go-hamt-ipld leftover (eb80f85)
is logged.
Filecoin leftover remaining go-ipld-cbor leftover (22f1772)
is logged.
Filecoin leftover remaining cbor-gen leftover (443b860)
is logged.
ZKsync OS leftover remaining airbender prover leftover
(6ec4ea7) is logged.
ZKsync OS leftover remaining airbender verifier_common leftover
(6ec4ea7) is logged.
Filecoin leftover remaining bellperson leftover (a215065)
is logged.
Filecoin leftover remaining merkletree leftover (34825e6)
is logged.
Filecoin leftover remaining neptune leftover (b06f03c)
is logged.
Filecoin leftover remaining neptune-triton leftover (9f2c2f4)
is logged.
Filecoin leftover remaining lotus paych leftover (7740217)
is logged.
Wormhole leftover remaining Relayer leftover is logged.
Filecoin leftover remaining lotus mpool leftover (7740217)
is logged.
Filecoin leftover remaining lotus wallet leftover (7740217)
is logged.
Filecoin leftover remaining lotus sync leftover (7740217)
is logged.
Aave leftover remaining GHO token leftover (23859bb)
is logged.
Aave leftover remaining GHO GSM leftover is logged.
Aave leftover remaining AaveOracle leftover (cff15de)
is logged.
Aave leftover remaining StableDebtToken leftover (782f519)
is logged.
Filecoin leftover remaining lotus stmgr leftover (7740217)
is logged.
Filecoin leftover remaining lotus market leftover (7740217)
is logged.
Aave leftover remaining ACL + PoolConfigurator leftover (cff15de)
is logged.
Aave leftover remaining RewardsController leftover (cff15de)
is logged.
Aave leftover remaining periphery leftover (cff15de)
is logged.
Aave leftover remaining WrappedTokenGateway leftover (cff15de)
is logged.
Aave leftover remaining Collector leftover (308489d)
is logged.
Aave leftover remaining transfer-strategy leftover (cff15de)
is logged.
Filecoin leftover remaining lotus eth leftover (7740217)
is logged.
Aave leftover remaining L2Encoder leftover (cff15de)
is logged.
Aave leftover remaining IR strategy leftover (cff15de)
is logged.
Aave leftover remaining GHO FixedFeeStrategy leftover (23859bb)
is logged.
Aave leftover remaining GHO FlashMinter leftover (23859bb)
is logged.
Aave leftover remaining Gsm4626 leftover (23859bb)
is logged.
Filecoin leftover remaining lotus store leftover (7740217)
is logged.
Aave leftover remaining GHO DirectFacilitator leftover (23859bb)
is logged.
Aave leftover remaining StakedAaveV3 leftover (0c4cb0b)
is logged.
Aave leftover remaining StakeToken leftover (5346765)
is logged.
Filecoin leftover remaining lotus node leftover (7740217)
is logged.
Aave leftover remaining governance-v3 leftover (497226e)
is logged.
Aave leftover remaining governance voting leftover (497226e)
is logged.
Filecoin leftover remaining lotus vm leftover (7740217)
is logged.
Filecoin leftover remaining lotus events leftover (7740217)
is logged.
Aave leftover remaining VotingStrategy leftover (497226e)
is logged.
Aave leftover remaining L2Pool leftover (cff15de)
is logged.
Aave leftover remaining CCIP GHO leftover (d5c6ced)
is logged.
Aave leftover remaining UpgradeableGhoToken leftover (23859bb)
is logged.
Aave leftover remaining upgradeability leftover (cff15de / 7a7548c)
is logged.
Aave leftover remaining protocol-v2 AddressesProvider leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 LendingPool leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 CollateralManager leftover (ce53c4a)
is logged.
Filecoin leftover remaining lotus genesis leftover (7740217)
is logged.
Aave leftover remaining protocol-v2 Configurator leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 AToken leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 debt tokens leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 AaveOracle leftover (ce53c4a)
is logged.
Filecoin leftover remaining lotus beacon leftover (7740217)
is logged.
Filecoin leftover remaining lotus net leftover (7740217)
is logged.
Aave leftover remaining protocol-v2 ValidationLogic + GenericLogic leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 ReserveLogic + IR strategy leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 ReserveConfiguration + UserConfiguration leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 math libs leftover (ce53c4a)
is logged.
Aave leftover remaining protocol-v2 upgradeability leftover (ce53c4a)
is logged.
Filecoin leftover remaining lotus messagesigner leftover (7740217)
is logged.
Filecoin leftover remaining lotus exchange leftover (7740217)
is logged.
Jito leftover remaining mev-programs tip leftover (ce1dfb6)
is logged.
Filecoin leftover remaining lotus index leftover (7740217)
is logged.
Aave leftover remaining v3 AToken leftover (cff15de)
is logged.
Aave leftover remaining EmissionManager leftover (cff15de)
is logged.
Aave leftover remaining GhoReserve leftover (23859bb)
is logged.
Aave leftover remaining Lending Rate Oracle leftover (Sourcify)
is logged.
Aave leftover remaining WrappedTokenGatewayV2 leftover (Sourcify)
is logged.
Jito leftover remaining priority-fee-distribution leftover (ce1dfb6)
is logged.
Jito leftover remaining jito-solana tip_manager leftover (d0e3a47)
is logged.
Filecoin leftover remaining lotus actors leftover (7740217)
is logged.
Jito leftover remaining jito-solana bundle_stage leftover (d0e3a47)
is logged.
Filecoin leftover remaining lotus types leftover (7740217)
is logged.
Aave leftover remaining v3 VariableDebtToken leftover (cff15de)
is logged.
Aave leftover remaining FixedPriceStrategy leftover (23859bb)
is logged.
Aave leftover remaining v2 Collector impl leftover (Sourcify)
is logged.
Aave leftover remaining GhoOracle leftover (23859bb)
is logged.
Aave leftover remaining v3 money-path logic leftover (cff15de)
is logged.
Aave leftover remaining v3 ValidationLogic + GenericLogic leftover (cff15de)
is logged.
Aave leftover remaining v3 PoolLogic + ConfiguratorLogic + CalldataLogic leftover (cff15de)
is logged.
Aave leftover remaining v3 ReserveLogic leftover (cff15de)
is logged.
Jito leftover remaining jito-solana banking_stage leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana proxy leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana replay leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana replay_stage leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana poh leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana tvu leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana bundle + fee leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana scheduler leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana tokens leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana runtime fee leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana programs leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana vote leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana bpf leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana compute-budget leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana zk-elgamal-proof leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana vote_reward leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana remaining runtime leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana partitioned epoch rewards leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana check_transactions leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana transaction_execution leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana stakes leftover (d0e3a47)
is logged.
Jito leftover remaining jito-solana epoch_stakes leftover (d0e3a47)
is logged.
Optimism leftover remaining op-node deposits + withdrawals leftover (eea9542)
is logged.
Optimism leftover remaining PolicyEngineStaking leftover (eea9542)
is logged.
Optimism leftover remaining L2 ETH liquidity leftover (eea9542)
is logged.
Optimism leftover remaining ETHLockbox leftover (eea9542)
is logged.
Optimism leftover remaining op-dispute-mon leftover (eea9542)
is logged.
Optimism leftover remaining op-node deposits + withdrawals leftover (eea9542)
is logged.
Optimism leftover remaining op-node engine leftover (eea9542)
is logged.
Optimism leftover remaining mintable factory leftover (eea9542)
is logged.
Optimism leftover remaining L2OutputOracle leftover
is logged.
Optimism leftover remaining SystemConfig leftover
is logged.
Optimism leftover remaining op-node p2p leftover (eea9542)
is logged.
Optimism leftover remaining op-node sequencing leftover (eea9542)
is logged.
Optimism leftover remaining ProxyAdmin leftover
is logged.
Optimism leftover remaining op-reth leftover (eea9542)
is logged.
Optimism leftover remaining op-reth consensus leftover (eea9542)
is logged.
Optimism leftover remaining rust/op-reth flashblocks leftover (a8a3b818)
is logged.
Arbitrum leftover remaining nitro challenge leftover (7fc6624)
is logged.
Arbitrum leftover remaining custom reverse gateway leftover (1bdf3cd)
is logged.
Arbitrum leftover remaining governance leftover (9e413da)
is logged.
Arbitrum leftover remaining fund-distribution leftover (52bc499)
is logged.
Arbitrum leftover remaining token-bridge libs leftover (1bdf3cd)
is logged.
Filecoin leftover remaining go-jsonrpc leftover (059363558429)
is logged.
Filecoin leftover remaining go-fil-markets leftover (6e1b1dc05c39)
is logged.
Filecoin leftover remaining go-state-types leftover (a31d84b45e42)
is logged.
Filecoin leftover remaining go-paramfetch leftover (78a1658e6493)
is logged.
Filecoin leftover remaining go-commp-utils leftover (b487eb14c907)
is logged.
Filecoin leftover remaining go-fil-commp-hashhash leftover (256368516783)
is logged.
Optimism leftover remaining dispute games leftover (eea9542)
is logged.
Rootstock leftover remaining powpeg-node pegout leftover (254fb3d)
is logged.
Filecoin leftover remaining lotus lib sigs leftover (7740217)
is logged.
Filecoin leftover remaining lotus lib backupds leftover (7740217)
is logged.
Filecoin leftover remaining lotus lib rpcenc leftover (7740217)
is logged.
Filecoin leftover remaining lotus lib peermgr leftover (7740217)
is logged.
Filecoin leftover remaining lotus lib httpreader leftover (7740217)
is logged.
Rootstock leftover remaining rskj Bridge leftover (161c3f105d18)
is logged.
Filecoin leftover remaining lotus lib addrutil leftover (7740217)
is logged.
Rootstock leftover remaining rsk-powhsm leftover (82a12d44efec)
is logged.
Remaining listed Hedera: listed leftover that official trees open is exhausted.
Remaining listed Filecoin: unused official leftover that listed trees open is exhausted on this pin. Next unused leftover is a different Immunefi program, not a rematch.
Remaining listed Aave: primacy; unused official v3 logic leftover that listed trees open is exhausted on this pin.
Remaining listed Jito: unused official leftover that listed remaining-runtime trees open is exhausted on this pin. Jito leftover remaining jito-solana status_cache leftover (d0e3a47) is logged. Jito leftover remaining jito-solana bank_forks leftover (d0e3a47) is logged. Jito leftover remaining jito-solana non_circulating_supply leftover (d0e3a47) is logged. Jito leftover remaining jito-solana validated_reward_certificate leftover (d0e3a47) is logged. Jito leftover remaining jito-solana validated_block_finalization leftover (d0e3a47) is logged. Jito leftover remaining jito-solana fee_distribution leftover (d0e3a47) is logged. Jito leftover remaining jito-solana bank money-path leftover (d0e3a47) is logged. Jito leftover remaining jito-solana account_saver leftover (d0e3a47) is logged. Jito leftover remaining jito-solana bank_client leftover (d0e3a47) is logged. Jito leftover remaining jito-solana prioritization_fee leftover (d0e3a47) is logged. Jito leftover remaining jito-solana commitment leftover (d0e3a47) is logged. Jito leftover remaining jito-solana slot_params leftover (d0e3a47) is logged. Jito leftover remaining jito-solana genesis_utils leftover (d0e3a47) is logged. Jito leftover remaining jito-solana alpenglow_epoch_type leftover (d0e3a47) is logged. Jito leftover remaining jito-solana leader_schedule leftover (d0e3a47) is logged. Jito leftover remaining jito-solana sysvar_account leftover (d0e3a47) is logged. Jito leftover remaining jito-solana loader_utils leftover (d0e3a47) is logged. Jito leftover remaining jito-solana vote_sender leftover (d0e3a47) is logged. Jito leftover remaining jito-solana installed_scheduler leftover (d0e3a47) is logged. Jito leftover remaining jito-solana read_optimized_dashmap leftover (d0e3a47) is logged. Jito leftover remaining jito-solana static_ids leftover (d0e3a47) is logged. Jito leftover remaining jito-solana runtime_config leftover (d0e3a47) is logged. Next unused leftover is a different Immunefi program, not a rematch.
Remaining listed Rootstock: unused official leftover that listed trees open is exhausted.
Remaining listed Optimism: unused official leftovers if still open. Official Optimism leftover that listed trees open is exhausted at leftover-heading level. Optimism leftover remaining websites leftover is logged. Optimism leftover remaining ResourceMetering leftover is logged. Optimism leftover remaining CrossDomainOwnable leftover is logged. Optimism leftover remaining CrossL2Inbox leftover is logged. Optimism leftover remaining SuperchainConfig leftover is logged. Optimism leftover remaining LegacyMessagePasser leftover is logged. Optimism leftover remaining L2ProxyAdmin leftover is logged. Optimism leftover remaining op-reth leftover is logged. Optimism leftover remaining op-reth consensus leftover is logged. Optimism leftover remaining rust/op-reth flashblocks leftover is logged. Next unused leftover is a different Immunefi program, not a rematch.
Remaining listed Ethena: unused official leftovers if still open. Ethena leftover remaining StakedENA leftover is logged. Ethena leftover remaining USDtb leftover is logged. Ethena leftover remaining USDeOFTAdapter leftover is logged. Ethena leftover remaining StakedUSDeOFTAdapter + ENAOFTAdapter leftover is logged. Remaining listed is TON rows (no verified TVM source) and other-chain OFT twins if still unused.
Remaining listed LayerZero: unused official leftovers if still open. LayerZero leftover remaining ULN301 leftover is logged. LayerZero leftover remaining ExecutorFeeLib leftover is logged. LayerZero leftover remaining OApp OFT leftover is logged. LayerZero leftover remaining other-chain twins OmniCounter leftover is logged. Remaining listed is Aptos / Solana / TON rows if still unused.
Remaining listed Ether.fi: unused official leftovers if still open. Ether.fi leftover remaining Auction leftover is logged. Ether.fi leftover remaining bridge adapters leftover is logged. Ether.fi leftover remaining weETH-cross-chain leftover is logged. Ether.fi leftover remaining RoleRegistry TopUpSourceFactory leftover is logged. Ether.fi leftover remaining Scroll Cash modules leftover is logged. Ether.fi leftover remaining eETH impl leftover is logged. Next unused leftover is a different Immunefi program, not a rematch.
Remaining listed Arbitrum: unused official leftover that listed Arbitrum trees open is exhausted at leftover-heading level. Arbitrum leftover remaining nitro challenge leftover is logged. Arbitrum leftover remaining custom reverse gateway leftover is logged. Arbitrum leftover remaining governance leftover is logged. Arbitrum leftover remaining fund-distribution leftover is logged. Arbitrum leftover remaining token-bridge libs leftover is logged. Arbitrum leftover remaining websites leftover is logged. Next unused leftover is a different Immunefi program, not a rematch.
Remaining listed ZKsync OS: official GitHub leftover
that trees open is exhausted.
Do not rematch Hedera consensus-node,
json-rpc-relay, cryptography, SDKs, or mirror-node.
Do not rematch Filecoin builtin-actors, boost, go-f3,
lotus miner, FVM, proofs-api, proofs-ffi, or proofs.
Do not rematch filecoin.io website leftover.
Do not rematch filecoin-ffi, go-graphsync, paired,
go-data-transfer, go-crypto, go-address, or
go-fil-commcid leftover.
Do not rematch go-amt-ipld, go-bitfield, go-cbor-util, or
go-padreader leftover.
Do not rematch go-statemachine, go-statestore, go-sectorbuilder,
go-hamt-ipld, go-ipld-cbor, or cbor-gen leftover.
Do not rematch Filecoin bellperson leftover.
Do not rematch Filecoin merkletree leftover.
Do not rematch Filecoin neptune leftover.
Do not rematch Filecoin neptune-triton leftover.
Do not rematch Filecoin lotus paych leftover.
Do not rematch Filecoin lotus mpool leftover.
Do not rematch Filecoin lotus wallet leftover.
Do not rematch Filecoin lotus sync leftover.
Do not rematch Filecoin lotus stmgr leftover.
Do not rematch Filecoin lotus store leftover.
Do not rematch Filecoin lotus node leftover.
Do not rematch Filecoin lotus vm leftover.
Do not rematch Filecoin lotus events leftover.
Do not rematch Filecoin lotus genesis leftover.
Do not rematch Filecoin lotus beacon leftover.
Do not rematch Filecoin lotus net leftover.
Do not rematch Filecoin lotus messagesigner leftover.
Do not rematch Filecoin lotus exchange leftover.
Do not rematch Filecoin lotus index leftover.
Do not rematch Filecoin lotus actors leftover.
Do not rematch Filecoin lotus types leftover.
Do not rematch Jito mev-programs tip leftover.
Do not rematch Aave protocol-v2 math libs leftover.
Do not rematch Aave protocol-v2 upgradeability leftover (ce53c4a).
Do not rematch Aave v3 AToken leftover.
Do not rematch Aave EmissionManager leftover.
Do not rematch Aave GhoReserve leftover.
Do not rematch Aave Lending Rate Oracle leftover.
Do not rematch Aave WrappedTokenGatewayV2 leftover.
Do not rematch Aave v3 VariableDebtToken leftover.
Do not rematch Aave FixedPriceStrategy leftover.
Do not rematch Aave v2 Collector impl leftover.
Do not rematch Aave GhoOracle leftover.
Do not rematch Aave v3 money-path logic leftover.
Do not rematch Aave v3 ValidationLogic + GenericLogic leftover.
Do not rematch Aave v3 PoolLogic + ConfiguratorLogic + CalldataLogic leftover.
Do not rematch Aave v3 ReserveLogic leftover.
Do not rematch Jito jito-solana banking_stage leftover.
Do not rematch Jito jito-solana proxy leftover.
Do not rematch Jito jito-solana replay leftover.
Do not rematch Jito jito-solana replay_stage leftover.
Do not rematch Jito jito-solana poh leftover.
Do not rematch Jito jito-solana tvu leftover.
Do not rematch Jito jito-solana bundle + fee leftover.
Do not rematch Jito jito-solana scheduler leftover.
Do not rematch Jito jito-solana tokens leftover.
Do not rematch Jito jito-solana runtime fee leftover.
Do not rematch Jito jito-solana programs leftover.
Do not rematch Jito jito-solana vote leftover.
Do not rematch Jito jito-solana bpf leftover.
Do not rematch Jito jito-solana compute-budget leftover.
Do not rematch Jito jito-solana zk-elgamal-proof leftover.
Do not rematch Jito jito-solana vote_reward leftover.
Do not rematch Jito jito-solana remaining runtime leftover.
Do not rematch Jito jito-solana partitioned epoch rewards leftover.
Do not rematch Jito jito-solana check_transactions leftover.
Do not rematch Jito jito-solana transaction_execution leftover.
Do not rematch Jito jito-solana stakes leftover.
Do not rematch Jito jito-solana epoch_stakes leftover.
Do not rematch Jito jito-solana stake_weighted_timestamp leftover.
Do not rematch Jito jito-solana serde_snapshot leftover.
Do not rematch Jito jito-solana snapshot_controller leftover.
Do not rematch Jito jito-solana snapshot_minimizer leftover.
Do not rematch Jito jito-solana snapshot_utils leftover.
Do not rematch Jito jito-solana snapshot_bank_utils leftover.
Do not rematch Jito jito-solana accounts_background_service leftover.
Do not rematch Jito jito-solana status_cache leftover.
Do not rematch Jito jito-solana bank_forks leftover.
Do not rematch Jito jito-solana non_circulating_supply leftover.
Do not rematch Jito jito-solana validated_reward_certificate leftover.
Do not rematch Jito jito-solana validated_block_finalization leftover.
Do not rematch Jito jito-solana fee_distribution leftover.
Do not rematch Jito jito-solana bank money-path leftover.
Do not rematch Jito jito-solana account_saver leftover.
Do not rematch Jito jito-solana bank_client leftover.
Do not rematch Jito jito-solana prioritization_fee leftover.
Do not rematch Jito jito-solana commitment leftover.
Do not rematch Jito jito-solana slot_params leftover.
Do not rematch Jito jito-solana genesis_utils leftover.
Do not rematch Jito jito-solana alpenglow_epoch_type leftover.
Do not rematch Jito jito-solana leader_schedule leftover.
Do not rematch Jito jito-solana sysvar_account leftover.
Do not rematch Jito jito-solana loader_utils leftover.
Do not rematch Jito jito-solana vote_sender leftover.
Do not rematch Jito jito-solana installed_scheduler leftover.
Do not rematch Jito jito-solana read_optimized_dashmap leftover.
Do not rematch Jito jito-solana static_ids leftover.
Do not rematch Jito jito-solana runtime_config leftover.
Do not rematch Chainlink leftover remaining CCIP Sui leftover.
Do not rematch Chainlink leftover remaining CCIP Solana leftover.
Do not rematch Jito jito-solana snapshot_package leftover.
Do not rematch Optimism leftover remaining op-node deposits + withdrawals leftover.
Do not rematch Optimism leftover remaining PolicyEngineStaking leftover.
Do not rematch Optimism leftover remaining L2 ETH liquidity leftover.
Do not rematch Optimism leftover remaining ETHLockbox leftover.
Do not rematch Optimism leftover remaining op-dispute-mon leftover.
Do not rematch Optimism leftover remaining op-node leftover.
Do not rematch Optimism leftover remaining op-node deposits + withdrawals leftover.
Do not rematch Optimism leftover remaining op-node engine leftover.
Do not rematch Optimism leftover remaining mintable factory leftover.
Do not rematch Optimism leftover remaining L2OutputOracle leftover.
Do not rematch Optimism leftover remaining SystemConfig leftover.
Do not rematch Optimism leftover remaining op-node p2p leftover.
Do not rematch Optimism leftover remaining op-node sequencing leftover.
Do not rematch Optimism leftover remaining ProxyAdmin leftover.
Do not rematch Optimism leftover remaining op-reth leftover.
Do not rematch Optimism leftover remaining websites leftover.
Do not rematch Optimism leftover remaining op-reth consensus leftover.
Do not rematch Optimism leftover remaining op-reth consensus + txpool leftover.
Do not rematch Optimism leftover remaining rust/op-reth flashblocks leftover.
Do not rematch Optimism leftover remaining ResourceMetering leftover.
Do not rematch Optimism leftover remaining CrossDomainOwnable leftover.
Do not rematch Optimism leftover remaining CrossL2Inbox leftover.
Do not rematch Optimism leftover remaining SuperchainConfig leftover.
Do not rematch Optimism leftover remaining LegacyMessagePasser leftover.
Do not rematch Optimism leftover remaining L2ProxyAdmin leftover.
Do not rematch Ethena leftover remaining StakedENA leftover.
Do not rematch Ethena leftover remaining USDtb leftover.
Do not rematch Ethena leftover remaining USDeOFTAdapter leftover.
Do not rematch LayerZero leftover remaining ULN301 leftover.
Do not rematch LayerZero leftover remaining ExecutorFeeLib leftover.
Do not rematch LayerZero leftover remaining OApp OFT leftover.
Do not rematch LayerZero leftover remaining other-chain twins OmniCounter leftover.
Do not rematch Ether.fi leftover remaining Auction leftover.
Do not rematch Ether.fi leftover remaining bridge adapters leftover.
Do not rematch Ether.fi leftover remaining weETH-cross-chain leftover.
Do not rematch Ether.fi leftover remaining RoleRegistry TopUpSourceFactory leftover.
Do not rematch Ether.fi leftover remaining Scroll Cash modules leftover.
Do not rematch Ether.fi leftover remaining eETH impl leftover.
Do not rematch Arbitrum leftover remaining nitro challenge leftover.
Do not rematch Arbitrum leftover remaining custom reverse gateway leftover.
Do not rematch Arbitrum leftover remaining governance leftover.
Do not rematch Arbitrum leftover remaining fund-distribution leftover.
Do not rematch Arbitrum leftover remaining token-bridge libs leftover.
Do not rematch Arbitrum leftover remaining websites leftover.
Do not rematch Filecoin go-commp-utils leftover.
Do not rematch Filecoin go-fil-commp-hashhash leftover.
Do not rematch Optimism leftover remaining dispute games leftover.
Do not rematch Filecoin go-jsonrpc leftover.
Do not rematch Filecoin go-fil-markets leftover.
Do not rematch Filecoin go-state-types leftover.
Do not rematch Filecoin go-paramfetch leftover.
Do not rematch Rootstock rsk-powhsm leftover.
Do not rematch Filecoin lotus lib sigs leftover.
Do not rematch Filecoin lotus lib backupds leftover.
Do not rematch Filecoin lotus lib rpcenc leftover.
Do not rematch Filecoin lotus lib peermgr leftover.
Do not rematch Filecoin lotus lib httpreader leftover.
Do not rematch Filecoin lotus lib addrutil leftover.
Do not rematch Rootstock rskj Bridge leftover.
Do not rematch Aave protocol-v2 ValidationLogic + GenericLogic leftover.
Do not rematch Aave protocol-v2 ReserveLogic + IR strategy leftover.
Do not rematch Aave protocol-v2 ReserveConfiguration + UserConfiguration leftover.
Do not rematch Rootstock powpeg-node pegout leftover.
Do not rematch Jito jito-solana tip_manager leftover.
Do not rematch Jito jito-solana bundle_stage leftover.
Do not rematch Jito priority-fee-distribution leftover.
Do not rematch Filecoin lotus miner leftover.
Do not rematch Aave protocol-v2 Configurator leftover.
Do not rematch Aave protocol-v2 AToken leftover.
Do not rematch Aave protocol-v2 debt tokens leftover.
Do not rematch Aave protocol-v2 AaveOracle leftover.
Do not rematch Filecoin lotus market leftover.
Do not rematch Aave ACL + PoolConfigurator leftover.
Do not rematch Aave RewardsController leftover.
Do not rematch Aave periphery leftover.
Do not rematch Aave WrappedTokenGateway leftover.
Do not rematch Aave Collector leftover.
Do not rematch Aave transfer-strategy leftover.
Do not rematch Filecoin lotus eth leftover.
Do not rematch Aave L2Encoder leftover.
Do not rematch Aave IR strategy leftover.
Do not rematch Aave GHO FixedFeeStrategy leftover.
Do not rematch Aave GHO FlashMinter leftover.
Do not rematch Aave Gsm4626 leftover.
Do not rematch Aave GHO DirectFacilitator leftover.
Do not rematch Aave StakedAaveV3 leftover.
Do not rematch Aave StakeToken leftover.
Do not rematch Aave governance-v3 leftover.
Do not rematch Aave governance voting leftover.
Do not rematch Aave VotingStrategy leftover.
Do not rematch Aave L2Pool leftover.
Do not rematch Aave CCIP GHO leftover.
Do not rematch Aave protocol-v2 LendingPool leftover.
Do not rematch Aave protocol-v2 CollateralManager leftover.
Do not rematch Aave UpgradeableGhoToken leftover.
Do not rematch Aave upgradeability leftover.
Do not rematch Aave protocol-v2 AddressesProvider leftover.
Do not rematch Wormhole Relayer leftover.
Do not rematch Hedera hashed transaction-tool leftover.
Do not rematch ZKsync airbender CS leftover.
Do not rematch ZKsync airbender prover leftover.
Do not rematch ZKsync airbender verifier_common leftover.
Do not rematch ZKsync supporting_crates leftover.
Do not rematch ZKsync bootloader, interpreter,
storage_models, proof_running_system, zk_ee,
zkos-wrapper, or airbender verifier.
Do not loop reffinance 404s or mux-staking auth.
Sky PAS / SBEBeam / FarmOwner, the full dss-emergency-spells tree,
the full diamond-pau facet tree at 1b6743a,
Intuition MultiVault / AtomWallet / curves / emissions /
registry / TrustSwapAndBridgeRouter (bb34cc2),
Origin OUSD vault + Curve AMO + WOETH/WOUSD + Ethena ARM,
Origin Aerodrome / Base Curve / Hydrex AMOs + OETH
zapper + Safe modules, Origin WETH/USDC/Lido ARM
adapters + zappers, Origin ARM CapManager + Morpho/Silo
4626 wrappers, Origin xOGN ExponentialStaking
(eff0d3d), Origin CrossChain master/remote
(4fa0602), Lombard SVM asset_router / bridge /
bascule / mailbox / token_pool / ratio_oracle / valset
(09d5e76), Leather extension RPC / PSBT approval, OZ
Confidential v0.5.3 including hooked/votes/omnibus/
observer/cap modules (4a4f6c7), Money on Chain V2
core/queue/V4 swapper (d770477), Sky FarmOwner,
Alchemix V3 alchemist + transmuter + alUSD +
token-vault + MYT adapter / allocator / router / fee
vaults + concrete strategies / Euler adapter /
StakingGraph, and Horizen ZenStaker +
RewardAccumulator (ab92502), 1inch Aqua
solidity-utils mixins / libraries (5b597e4) are
exhausted. Origin in-scope Solidity listed as remaining
is exhausted (including CoW HarvestingEIP1271, live
FixedRateRewardsSource, and the OZ Governor wrapper).
Remaining Alchemix leftover src/ (curator,
classifier, position NFT, gauge, 0x verifier, Frax
adapter, libs, test AlEth) is exhausted. Enzyme
Blue gated-redemption wrapper + share-price throttle
(da3b870) and Charm Alpha Pro Vault (0174095)
are exhausted. Remaining MoC: live Rootstock v1
proxies if a later pass wants addresses rather than
the V2 tree. V2 governance machines (d770477) are
exhausted. 1inch Aqua opcode set and Aqua-listed
solidity-utils mixins / libraries (5b597e4) are
exhausted. DeFi Saver V3 executor + FL + auth
(e623f20) and exchangeV3 + sell actions (e623f20)
are logged; Morpho Blue, Liquity V2, Fluid T1
- liquidity logic, Fluid Dex T2/T3/T4, Aave V3
- GHO/Umbrella, Comp V2/V3, Spark, Liquity V1,
CurveUsd core, CurveUsd advanced/transient,
Euler V2, LlamaLend core, LlamaLend leftover +
swapper, Aave V4 sig/premium, Aave V4 money
actions, Maker MCD, TxSaver leftover, and
triggers, leftover Aave V2, EtherFi / Lido,
leftover utils, and Renzo / Sky / Pendle /
Yearn / Uni, and Summer.fi / Insta / LSV /
Merkl / fee / checkers (
e623f20) are logged. DeFi Saver V3 leftover folders are exhausted. 0x Settler execute / Permit2 / RFQ / UniV3 / AllowanceHolder / BridgeSettler plus UniV2 / Velodrome / Across / POSITIVE_SLIPPAGE, Stargate / LayerZero / CCIP / Mayan / DeBridge, UniV4 / Relay / SETTLER_SWAP, Maverick / Dodo / BalancerV3, Bebop / EulerSwap / Curve, Pancake / Renegade / Ekubo / Hanji / Nucleus, and MakerPSM (1df9087) are logged. 0x leftover DEX / teller mixins are exhausted. Extra Finance LYF LendingPool + VeloPositionManager + RewardDistributor (Sourcify, 2024-08 verified) plus ExtraX factory / creators / live proxy, the Aave-fork Pool skim, and VeToken (0xe0Be…1466) are logged; remaining Extra Finance listed Solidity (EXTRA token, Sourcify) is logged; Aave-fork ACL / config / aToken / debt already logged. Vault factory ids 101–105 are not listed. Index Coop Set Protocol V2 (all five in-scope addresses) is logged. Lista DAO Moolah - PublicLiquidator (
ce72699, newest 2026-05-29 assets) plus leftover PSM / LisUSD / clip-join / slisBNB (3e120da+67e524c), Moolah vault - Credit/Lending brokers, SlisBNB / BNB / ERC20-LP providers, MasterVault
- yield strategies, leftover
OFT / distributors / providers
(
28a3c02+fa5dfa5), Extra Finance Aave-fork leftover (ACL / config / aToken / debt), andlista-new-contractsRWA / slisXAUE / LisAster / leftover distributors (fa5dfa5) plus CDP ResilientOracle - listed pips (
3e120da) are logged. Enzyme Blue BebopBlend / ThreeOneThird / SharesSplitter (da3b870+ Sourcify) are logged. Extra Finance EXTRA token (Sourcify), Hashflow Wormhole messenger (listed 8 Jun row, Sourcify), Magpie WombatPoolHelper (Sourcify), and SparkLend Ethereum sUSDC vault + PSM Variant1 actions (Sourcify) plus the Spark ALM controller tree (ce5cbd9: Mainnet / Foreign / proxy / rate limits) and SparkVault V2 (51c6d7a) plus PSM3 (2b1a72a; live pools seeded) are logged. Listed Extra Finance and Hashflow Solidity are exhausted. Magpie leftover is Primacy of Impact only. Remaining SparkLend: 13 Jul Robinhood / X Layer executor / receiver rows are the same gov-relay contracts already logged (6218d57); do not re-review. DSR / SSRxchain-ssr-oracle(4a23d1f) plus leftoverSSRRateSource/KillSwitchOracle/SavingsDaiOracle(Sourcify) plus 15 Jul Ethereum sUSDC /UsdcVaultand L2UsdcVaultL2(Base / Arb / OP Sourcify) are logged.AAVE_ORACLEis the already-logged Aave V3 price oracle. Listed Spark leftover oracle rows are exhausted. X LayerSPARK_SAVINGS_INTENTS0x5bCD…1865(Sourcify) is logged. GammaSwap May 2026 vault + PositionManager and 2024 factory + DeltaSwap (Sourcify) plus staking / GS token proxy0xb08d…3e83+GSTimelockController0x3f7c…73f8+ airdrop0x4c02…0f98(Sourcify; listing labels swapped) are logged. Listed GammaSwap Solidity is exhausted. KeeperHub #2105 is claimed bytenk-earnPR #2275 (do not duplicate). Immunefi ENS audit competition (web-only, KYC, ends 14 Sep) is out of this track. Zest Protocol V2v0-6-market+ market-vault + sBTC vault (f2fce52/ Hiro) plus DAO executor / multisig / treasury and the zvstBTC strategy vault / engine / ops / state (f2fce52) are logged. Listed Zest Clarity leftover is exhausted. StackingDAOstacking-dao-core-stbtc-v1 stacking-dao-core-stx-v2stacking-dao-core-ststxbtc-v2plus stBTC token / reserve / data and STX reserve / data (Hiro, 13 Aug 2026 assets) are logged. StackingDAO strategy-v6 + STX/sBTC stakers + commission + rewards-stx plus native-pool / signer- managers / payout / admin are logged. Listed StackingDAO Clarity leftover is exhausted. Next unreviewed Immunefi GitHub-or-recent trees: Olympus V1Migrator + Cooler V2 + CCIP + CD Facility + DepositManager / RedemptionVault / Clearinghouse / Heart + Governor Bravo / Timelock + BondTeller / BondCallback / BondManager + CD Auctioneer / LimitOrders + Cooler factory / LTV / Treasury Borrower / Composites + RANGE / YRF / CHREG / RGSTY / DLGTE / RolesAdmin (3f918a0) are logged. Olympus leftover CDEPO0x0233…9F1cis the DEPOSOlympusDepositPositionManagerin3f918a0and is logged. Spark 15 Jul EthereumUsdcVault+ L2UsdcVaultL2are logged. Sky StarGuard (707c84d) + SubProxyMethods (8ab9daf) + DefaultPAUAssembler (c13e80f) + AdministeredAgent (5e6b52f) are logged. Remaining Sky leftoversky-oapp-oft+ LZ/OP relays + Optimism / Arbitrum / Starknet DAI-bridges are logged below. Listed Sky leftover that a public tree would open is exhausted. Yearn Accountant0x5A74…DE69(Sourcify) plus 3.0.4 Tokenized Strategy0xD377…139cand 3.0.4 Vault V30xd806…00d(Sourcify) are logged. Listed Yearn leftover impls are exhausted. Twyne June-2026 Aave V3 operators (Sourcify) are logged; remaining Twyne vaults / wrappers / EVC / factories are still Sourcify 404. TermMax TMX token (Sourcify BSCMyOFT) is logged; remaining TermMax adapters are logged below. Yearn stYFI July leftover + February StakedYFI / LL depositor (69e262e) plus leftover stYFIx / middleware / main RewardDistributor (Sourcify) and leftover LL redemption / LL+veYFI distributors (69e262e) plus Vault / TokenizedStrategy / Factory V3.1.0 (Sourcify) plus leftover Jan 2026 yYB token / operator / locker / staker / distributor (Sourcify) plus AuctionFactory0xbC58…7526(Sourcify) plus splitter factory0xe28f…614D+ ORIGINAL impl0x8e8e…6f69and 3.0.4 Vault Factory0x770D…812F(Sourcify) plus Accountant0x5A74…DE69(Sourcify) plus 3.0.4 Tokenized Strategy0xD377…139cand 3.0.4 Vault V30xd806…00d(Sourcify) are logged. Listed Yearn leftover impls are exhausted. Balancer V3 Router + CompositeLiquidityRouter- ProtocolFeeController +
LBPoolFactory + ReClamm +
LP oracle factories (23 Jun,
Sourcify) plus leftover
Sourcify-404 factories
(FixedPrice LBP / Gyro2CLP /
GyroECLP / StableSurge /
Weighted / Stable, official
monorepo
create()only) are logged. Remaining Lista leftover slices (new-contracts oracles / VeLista lock / airdrop / CDP ResilientOracle + pips at3e120da) are logged. Jitojito-solana/mev-programs($250k, KYC; interceptordbd8ce4and restakingvault_*/restaking_*atdb90840are exhausted). Superteam API rechecked ~04:34 UTC 3 Sep: still 28 open listings (earn.superteam.fun/api/listings?status=open).AGENT_ALLOWEDis still only Steve Arena and ZNS — do not execute. Mermail skill is built (mermail-onchain-receipts/); remaining work is the participant's PR, Mermail MCP, and X demo. T3N Vendor Receipts is built (t3n-vendor-receipts/); remaining work is Terminal 3 SSO. NectarFi is a creator campaign. Manic $1k bug bounty isHUMAN_ONLY. the402.ai still paused. 1inch Fusion settlement / whitelist / PowerPod / KycNFT and FeeTaker are exhausted. 1inch token-plugins + farming leftover (9b6de97/b1fca09) is logged; 1inch cross-chain-swap leftover (ada243b) is logged; 1inch Solana CCS + Fusion leftover (58b8a42/0768267) is logged (listed 1inch SmartContracts leftover exhausted). Lidolido-l2+ circuit-breaker + vesting-escrow + stonks leftover (badf17c/6829a5a/580f802/a7812a4) is logged. Lidolido-l2-with-stethleftover (4fec842) is logged. Lido dual-governance Escrow leftover (ba9dfc9) is logged. Lido dual-governance submit / timelock leftover (ba9dfc9) is logged. Lido dual-governance committees leftover (ba9dfc9) is logged (remaining dual-governance is TiebreakerSubCommittee / tiebreaker wrappers). Lido CSM bond leftover (2824e21) is logged. Lido CSM gates leftover (2824e21) is logged. Lido easy-track leftover (3183d1f) is logged. Lido governance-crosschain-bridges leftover (659e236) is logged. Lido aragon-apps leftover (e44f928) is logged. Lido aave-delivery-infrastructure leftover (27e7d4e) is logged. Lido mev-boost-relay leftover (47211c6) is logged. Lido aave-delivery adapters leftover (27e7d4e) is logged (listed Lido aave-delivery leftover exhausted). Lido easy-track leftover factories leftover (3183d1f) is logged (listed easy-track leftover factories exhausted). Lido aragon-apps Voting leftover (e44f928) is logged. Lido aragon-apps Agreement leftover (e44f928) is logged (remaining aragon-apps leftover exhausted). Nexus Mutual cover / pool / staking leftover (9e88562) is logged. Nexus Mutual claims leftover (9e88562) is logged. Nexus Mutual leftover modules leftover (9e88562) is logged. Nexus Mutual governance leftover (9e88562) is logged (listed Nexus Mutual GitHub leftover exhausted). Hydration DCA leftover (672e02f) is logged. Hydration pool leftover (672e02f) is logged. Hydration staking leftover (672e02f) is logged. Hydration EVM leftover (672e02f) is logged. Hydration leftover pallets leftover (672e02f) is logged. Hydration leftover adapters leftover (672e02f) is logged (listed Hydration leftover that a public tree would open is exhausted). Lido dual-governance Tiebreaker leftover (ba9dfc9) is logged (listed dual-governance leftover exhausted). Lido CSM leftover modules leftover (2824e21) is logged (listed CSM leftover modules exhausted). StakeWise Mainnet leftover (Sourcify Pool / sETH2 / rETH2 / Oracles / MerkleDistributor / Vesting / genesis vault migrate) is logged (remaining listed is DAO Module Sourcify 404). Rhino.fi deposit leftover (Sourcify OP / BSC / ARBDVFDepositContract) is logged (remaining listed is zkEVM / zkSync / Polygon impl Sourcify 404). USDN leftover (Sourcify token / wrap / protocol two-step / farming / rebalancer) is logged. USDN sUSDN VaultLib leftover is logged (listed USDN leftover exhausted). IPOR leftover (Sourcify ipToken / router / AmmStorage / AmmTreasury) is logged (remaining listed is AmmTreasury ETH impl Sourcify 404). Vesper leftover (Sourcify Ethereum - Optimism
VPool/VETH) is logged (remaining listed is Base vaults Sourcify 404). dHEDGE leftover (Sourcify ETH / OP / Base / ArbPoolFactory) is logged (remaining listed is Polygon factory Sourcify 404). Velvet Capital leftover (Sourcify BSC IndexSwap / Exchange / rebalance / fee / Safe module / handlers) is logged (remaining listed is two BSC addresses Sourcify 404). Mars Ecosystem leftover (Sourcify BSC Core / factory / router / farm / vesting / airdrop) is logged. Mars Ecosystem leftover timelock leftover (Sourcify BSCTimelock) is logged (remaining listed is0x7859B01B…B576Sourcify 404). SushiSwap leftover RedSnwapper leftover (Sourcifyexact_match0xAC4c6e21…80b75) is logged. SushiSwap leftover CPAMM / CLAMM leftover (Sourcify ETH V2 factory / router + V3 factory / NPM) is logged (remaining listed is V3 TickLens / Quoter / PositionHelper and same-bytecode other-chain factories). Aster leftover (Sourcify BSC asBTC / USDF / asUSDF / AsBNB + Earn / USDFEarn / asUSDFEarn / WithdrawVault) is logged (listed leftover that Sourcify opens is exhausted; remaining listed is the website). Gamma leftover (Sourcify ETH xGamma / Hypervisor / UniProxy) is logged (listed leftover that Sourcify opens is exhausted). Beefy Finance leftover (Sourcify PolygonBeefyVaultV6+ common chef / DFYN / Curve / BIFI-maxi strategies) is logged. Beefy leftover remaining Polygon vaults leftover (Sourcify zaps + Aave / Wault / Fish / Curve / PZAP / Cometh / MiniChef / RewardPool) is logged (remaining listed is Sourcify 404 wexpoly / some Aave-Cometh and same-type unsampled vaults). Orca leftover (3b47341/05fe66bxORCA + Whirlpools) is logged (listed leftover exhausted). Threshold Bank leftover (502cd39) is logged. Threshold vault + MaintainerProxy leftover (502cd39) is logged. Threshold watchtower + Wormhole L1 leftover (502cd39) is logged. Threshold RebateStaking leftover (502cd39) is logged. Threshold validator + ReimbursementPool leftover (502cd39) is logged. Threshold Bridge leftover (502cd39) is logged. Threshold leftover gov / relay leftover (502cd39) is logged. Puffer Finance leftover (Sourcify depositor + pufETH vault) is logged. Threshold leftover wallet registry leftover (Sourcify) is logged. Threshold leftover StarkNet depositor leftover (502cd39SourcifyStarkNetBitcoinDepositorimpl) is logged. Threshold leftover L2 Wormhole gateway leftover (Sourcify OP / Base / Arb / PolygonL2TBTC/L2WormholeGateway/L2BTCRedeemerWormholeplus Base/Arb upgraded children) is logged (remaining Threshold is keep-network typescript, Starkscan Cairo, and Sui / Solana explorer rows). Aspida leftover (Sourcify aETH / saETH / CorePrimary / RewardOracle / StETHMinter) is logged (listed leftover exhausted at the five Ethereum addresses). Balancer Foundation leftover V2 Vault + V3 BatchRouter (Sourcify) is logged (remaining Foundation-listed is V3 Vault and other unopened routers / helpers). Arkadiko leftover (Hiro vaults / tokens / liq-pool) is logged (remaining listed is the website). JustLend leftover (f28f3b4Unitroller / Comptroller / CToken mint-redeem-borrow- liquidate) is logged. JustLend leftover governance leftover (f28f3b4GovernorBravo / WJST / Timelock / PriceOracleProxy) is logged. JustLend leftover rewards leftover (f28f3b4ComptrollerLegacy JST / PriceOracleV1 / rate models) is logged (listed leftover that a public tree would open is exhausted; remaining listed is other Tronscan jToken markets). Pareto Credit leftover (19e7cdeIdleCDO / CreditVault / Tranche / epoch request-claim) is logged. Pareto Credit leftover strategy leftover (19e7cdeIdleCreditVault receipt / APR=0) is logged. Pareto Credit leftover epoch admin leftover (19e7cdestartEpoch / stopEpoch / depositDuringEpoch) is logged. Pareto Credit leftover queue leftover (19e7cdeIdleCDOEpochQueue / Prefunded) is logged. Pareto Credit leftover factory leftover (19e7cdefactory / write-off escrow / orchestrator / implied price / programmable borrower) is logged. Pareto Credit leftover wrappers leftover (19e7cdeTrancheWrapper / IdleTokenWrapper / wstETH Balancer / Keyring) is logged. Pareto Credit leftover Fulcrum leftover (SourcifyIdleFulcrumV2plus live CDO / queue / strategy impls of already-reviewed types) is logged (remaining listed is Sourcify 404 docs addresses). Synthetix deposit leftover (BlockscoutSynthetixDepositContract/ lens / PermissionsRegistry) is logged (listed leftover exhausted at the three Ethereum addresses). RootstockLabs RIF token leftover (SourcifymatchRIFToken) is logged (KYC). RootstockLabs leftover PegIn / PegOut / Collateral (Blockscout) is logged (KYC; Flyover leftover exhausted at the opened-contract level; remaining listed is GitHub DLT / web). Remaining OZ hooks: none of the money-moving general/fee/base files. Leather still requires a working PoC against the published store build; do not file theoretical reports. USDT0’s 1 Sep add is Stellar explorer, not a Solidity GitHub tree. Sherlockhttps://audits.sherlock.xyz/api/contestsis paginated (301 items); page 1 as of ~04:10 UTC 3 Sep still shows the only non-FINISHED row as contest1234(Tare) inSHERLOCK_JUDGING(later pages 403 from this VM). Code4rena API: 25 audits, 24Completed, 1Reporting(Rujira, window ended Jan 2026). Hedera Harness #8 stillopen, 0 comments, 0 HOL-Guard PRs; file-level plan is inresearch/ethonline-hedera-harness-8.md(read-only clone/tmp/hedera-harnessate045b10). Uniswap Foundation OSS backup is Uniswap/sdks#720 (DCA EIP-712 vsDCALib.sol, 0 comments, 0 PRs); file-level plan is inresearch/ethonline-uniswap-sdks-720.md(read-only clones/tmp/uniswap-sdks35c4e35,/tmp/uniswapxfd60225). ETHOnline 1inch Aqua App design isaqua-app/DESIGN.md(AquaFloor /ReserveFloor); no product code before 4 Sep 16:00 UTC.1inch-aqua-improvementis an improvement-proposal program and is not a second vuln book. Rechecked ~05:20 UTC 3 Sep: KeeperHub #2105 stillopen+accepted+confirmed, 1 comment and PR #2275 (tenk-earn,staging, mergeable,
mergeable_state: unstable) — do not
duplicate; #2240 still open + accepted, 1
design comment (edycutjong), 0 PRs — do not
implement or claim; Twyne vaults / wrappers /
EVC / factories still Sourcify 404;
Uniswap/sdks#720 still open, 0 comments, 0 PRs;
Hedera Harness #8 still open, 0 comments;
CreditPassport deployer still 0 Sepolia ETH
(Tenderly sepolia.gateway.tenderly.co;
publicnode 403)
/ 0 tCTC
(rpc.cc3-testnet.creditcoin.network);
Superteam still 27 open listings,
AGENT_ALLOWED still only Steve Arena and ZNS;
Sherlock page 1 still only contest 1234 (Tare)
in SHERLOCK_JUDGING; no programs launched
Sep 2026 in the unofficial Immunefi dump;
one new listed SC since 2026-09-02
(RootstockLabs RIF token,
KYC, unofficial dump still
246 programs);
Olympus DEPOS / CDEPO is
logged (Sourcify still
404; official tree);
Sky StarGuard +
SubProxyMethods + PAU
assembler, Yearn
Accountant leftover, and
Yearn 3.0.4 Tokenized
Strategy + Vault V3
leftover are logged
(listed Yearn leftover
impls exhausted);
Sky PAUFactory + Kicker
sky-oapp-oft+ LZ/OP governance relays and StackingDAO strategy / native-pool / signers / swap / rewards-pox5 are logged; TermMax leftover adapters (e314f3f) are logged; Sky Optimism / Arbitrum / Starknet DAI-bridge leftover is logged (listed Sky leftover that a public tree would open is exhausted); listed StackingDAO and TermMax leftover adapters are exhausted; Lombard EVM strategy shard / blocklist / merkle validator / converters (7fe83e5, 15 Jul leftover) are logged; Enzyme OnyxCreWorkflowConsumer(7b48d24) is logged; Silo Finance V3 vaults, core Actions, and config / router / leverage / hooks (silofinance-v2,31b98b3) are logged (listed Silo GitHub Solidity leftover exhausted); PancakeSwap Infinity core / periphery / universal-router (pancakeswap,61cd131/8261f8d/33dbf5a) are logged; Pancake V3 MasterChef / LmPool + V2 periphery (9868479/d769a6d) and v3-core pool/factory- v3-periphery (
9868479) are logged (listed Pancake GitHub leftover exhausted); Mux3 core trade / pool / orderbook (8674f2b) is logged; Mux aggregator proxyFactory + GmxV2 + LendingPool (0f36131), Mux degen pool (c5bfe81), and Mux protocol v1 core (0f70a70) are logged (remaining Mux listed Solidity is mux-staking, GitHub 404); Threshold tBTC BOB cross-chain leftover (502cd39) is logged Threshold Bank leftover (502cd39) is logged; Threshold vault + MaintainerProxy leftover (502cd39) is logged; Threshold watchtower + Wormhole L1 leftover (502cd39) is logged; Threshold RebateStaking leftover (502cd39) is logged; Threshold validator + ReimbursementPool leftover (502cd39) is logged; Threshold Bridge leftover (502cd39) is logged; Threshold leftover gov / relay leftover (502cd39) is logged; Threshold leftover wallet registry leftover (Sourcify) is logged. Threshold leftover StarkNet depositor leftover (502cd39SourcifyStarkNetBitcoinDepositorimpl) is logged. Threshold leftover L2 Wormhole gateway leftover (Sourcify OP / Base / Arb / PolygonL2TBTC/L2WormholeGateway/L2BTCRedeemerWormholeplus Base/Arb upgraded children) is logged (remaining Threshold is keep-network typescript, Starkscan Cairo, and Sui / Solana explorer rows); Aspida leftover (Sourcify aETH / saETH / CorePrimary / RewardOracle / StETHMinter) is logged (listed leftover exhausted at the five Ethereum addresses); Balancer Foundation leftover V2 Vault + V3 BatchRouter (Sourcify) is logged (remaining Foundation-listed is V3 Vault and other unopened routers / helpers); Pancake MasterChefV3 + LmPool + V2 periphery and v3-core / v3-periphery (9868479/d769a6d) are logged (listed Pancake GitHub leftover exhausted); Obyte Coop AA (d7d5e57), Friends AA (45019f9), prediction-markets AA (1292a09), and Counterstake EVM+AA claim path and assistants / factories / governance (530fb8b) are logged (listed Counterstake leftover exhausted;evm-v1.0is the old pin; City AA (4a0a53f) and perpetual AA (126cdd0) and OSWAP token AA (461e860) are logged; cascading- donations AA (2f48482) and token-registry AA (8d37f20) are logged (listed Obyte AAs exhausted); MtPelerin bridge-v2 core + leftover wrappers / KYC rules (1126cfc) are logged (listed MtPelerin GitHub Solidity leftover exhausted); Orderly Vault, Ledger withdraw, Operator / Fee / Market + LedgerImpl B/C/D (462e129), andevm-cross-chain(9a8ba76) are logged (listed Orderly GitHub leftover exhausted); Compound Finance PR 127 / 2.9 (ae4388e) is logged (listed Compound GitHub leftover exhausted; remaining assets are explorer addresses + PoI); Raydium CLMM leftover (ed7c84a) plus classic AMM leftover (27f461d) plus cp-swap leftover (244e124) are logged (listed Raydium GitHub leftover exhausted); Marinade liquid-staking leftover (b8fe3f8) is logged; Marinade crank / withdraw-stake leftover and admin / validator / update leftover (b8fe3f8) are logged and create-canonical / realloc leftover (b8fe3f8) are logged (listed Marinade GitHub leftover exhausted); Instadapp DSA leftover (fef062a) is logged and Avocado leftover (0bc1dd9) is logged; Instadapp Fluid liquidity + fToken leftover (a9949b4) is logged; Instadapp Fluid vault T1 leftover (a9949b4) is logged; Instadapp Fluid vault T2–T4 leftover (a9949b4) is logged; Instadapp Fluid DEX T1 leftover (a9949b4) is logged; Instadapp Fluid dexLite leftover (a9949b4) is logged; Instadapp Fluid stETH leftover (a9949b4) is logged; Instadapp inst-governance leftover (3fc54af) is logged (listed Instadapp leftover exhausted); Gnosis Chain tokenbridge + Omnibridge leftover (908a481/c814f68, Sourcify proxy + official money path) is logged (listed leftover exhausted; remaining is AMB / other tokenbridge trees if Immunefi lists them later); Ankr ETH pool + liquid tokens leftover (SourcifyGlobalPool_R46/AETH_R21/FETH_R20/aBNBc_R1) is logged (remaining Ankr is BNB Pool / BNBStakingConfig Sourcify 404); UTIX crowdsale leftover (Sourcifyexact_matchMintedTokenCappedCrowdsaleExtv1) is logged (listed leftover exhausted); Rocket Pool v1.4 deposit / rETH / megapool queue, dissolve / rewards / exit, vault + RPL auction, smoothing / rewards leftover, minipool leftover, and DAO settings / voting (fb7d9c4) are logged (listed Rocket Pool GitHub leftover exhausted); Beanstalk Basin leftover (Pipeline / Depot / Well / Aquifer / CP2 / MFP, Sourcify +ecf6923) is logged. Beanstalk L2 diamond + tokens leftover (8e22cd2, Sourcifyexact_match) is logged. Beanstalk Junctions / UnwrapETH / LSD / marketplace leftover (8e22cd2, Sourcifyexact_match) is logged (listed Beanstalk leftover exhausted aside from Fertilizer proxy Sourcify 404); Flux Finance leftover (Sourcifyexact_matchUnitroller / fToken delegator / Ondo oracle) is logged. Flux Comptroller / KYC cToken / Governor Bravo implementation leftover (Sourcifyexact_match) is logged (listed Flux leftover exhausted); Mantle mETH staking leftover (SourcifyStaking/METH/ UnstakeRequestsManager / Oracle / ReturnsAggregator) is logged (remaining mETH is L2 token + Pauser impl Sourcify 404 and unlisted LiquidityBuffer); eBTC Boost leftover (c9b95ac, listedrelease-0.7files) is logged (listed eBTC Boost GitHub leftover exhausted); Aevo deposit leftover (Sourcify ArbVault+ ETHL1ChugSplashProxy) is logged. Aevo ETH ChugSplash implementation leftover is logged (listed Aevo leftover exhausted); Lido core submit / withdrawal leftover (2da0f48) is logged. Lido StakingRouter leftover (2da0f48) is logged. Lidolido-l2+ circuit-breaker + vesting-escrow + stonks leftover is logged. Lidolido-l2-with-stethleftover (4fec842) is logged. Lido 0.8.25 vault leftover (2da0f48) is logged. Lido dual-governance Escrow leftover (ba9dfc9) is logged. Lido dual-governance submit / timelock leftover is logged. Lido dual-governance committees leftover is logged. Lido CSM bond leftover (2824e21) is logged. Lido CSM gates leftover (2824e21) is logged. Lido easy-track leftover (3183d1f) is logged. Lido governance-crosschain-bridges leftover (659e236) is logged. Lido aragon-apps leftover (e44f928) is logged. Lido aave-delivery-infrastructure leftover (27e7d4e) is logged. Lido mev-boost-relay leftover (47211c6) is logged. Lido aave-delivery adapters leftover (27e7d4e) is logged (listed Lido aave-delivery leftover exhausted). Lido easy-track leftover factories leftover (3183d1f) is logged (listed easy-track leftover factories exhausted). Lido aragon-apps Voting leftover (e44f928) is logged. Lido aragon-apps Agreement leftover (e44f928) is logged (remaining aragon-apps leftover exhausted). Nexus Mutual cover / pool / staking leftover (9e88562) is logged. Nexus Mutual claims leftover (9e88562) is logged. Nexus Mutual leftover modules leftover (9e88562) is logged. Nexus Mutual governance leftover (9e88562) is logged (listed Nexus Mutual GitHub leftover exhausted). Hydration DCA leftover (672e02f) is logged. Hydration pool leftover (672e02f) is logged. Hydration staking leftover (672e02f) is logged. Hydration EVM leftover (672e02f) is logged. Hydration leftover pallets leftover (672e02f) is logged. Hydration leftover adapters leftover (672e02f) is logged (listed Hydration leftover that a public tree would open is exhausted). Lido dual-governance Tiebreaker leftover (ba9dfc9) is logged (listed dual-governance leftover exhausted). Lido CSM leftover modules leftover (2824e21) is logged (listed CSM leftover modules exhausted); StakeWise Mainnet leftover (Sourcify Pool / sETH2 / rETH2 / Oracles / MerkleDistributor / Vesting / genesis vault migrate) is logged (remaining listed is DAO Module Sourcify 404); Rhino.fi deposit leftover (Sourcify OP / BSC / ARBDVFDepositContract) is logged (remaining listed is zkEVM / zkSync / Polygon impl Sourcify 404); USDN leftover (Sourcify token / wrap / protocol two-step / farming / rebalancer) is logged. USDN sUSDN VaultLib leftover is logged (listed USDN leftover exhausted); IPOR leftover (Sourcify ipToken / router / AmmStorage / AmmTreasury) is logged (remaining listed is AmmTreasury ETH impl Sourcify 404); Vesper leftover (Sourcify Ethereum + OptimismVPool/VETH) is logged (remaining listed is Base vaults Sourcify 404); dHEDGE leftover (Sourcify ETH / OP / Base / ArbPoolFactory) is logged (remaining listed is Polygon factory Sourcify 404); Velvet Capital leftover (Sourcify BSC IndexSwap / Exchange / rebalance / fee / Safe module / handlers) is logged (remaining listed is two BSC addresses Sourcify 404); Mars Ecosystem leftover (Sourcify BSC Core / factory / router / farm / vesting / airdrop) is logged; Mars Ecosystem leftover timelock leftover (Sourcify BSCTimelock) is logged (remaining listed is0x7859B01B…B576Sourcify 404); SushiSwap leftover RedSnwapper leftover (Sourcifyexact_match0xAC4c6e21…80b75) is logged; SushiSwap leftover CPAMM / CLAMM leftover (Sourcify ETH V2 factory / router + V3 factory / NPM) is logged (remaining listed is V3 TickLens / Quoter / PositionHelper and same-bytecode other-chain factories); Aster leftover (Sourcify BSC asBTC / USDF / asUSDF / AsBNB + Earn / USDFEarn / asUSDFEarn / WithdrawVault) is logged (listed leftover that Sourcify opens is exhausted; remaining listed is the website); Gamma leftover (Sourcify ETH xGamma / Hypervisor / UniProxy) is logged (listed leftover that Sourcify opens is exhausted); SPOT leftover (Sourcify ETH PerpetualTranche / RouterV1 / BondFactory / BondIssuer) is logged (listed leftover that Sourcify opens is exhausted; remaining listed is the website); DeGate leftover (Sourcify ETH Timelock / DepositContract / ExchangeV3 / MultiSig) is logged (listed leftover that Sourcify opens is exhausted); boost-lido leftover (Sourcify ETH DVV / StakingModule / SimpleDVTStakingStrategy) is logged (listed leftover that Sourcify opens is exhausted); alchemix-boost leftover (f100743veALCX / RevenueHandler / RewardsDistributor) is logged (listed leftover that a public tree would open is exhausted; remaining listed is the website); GMX leftover (Sourcify Arb Vault / Router / GlpManager / RewardRouterV2) is logged. GMX leftover V2 ExchangeRouter leftover (Sourcify Arb ExchangeRouter / DepositVault / DataStore) is logged (remaining listed is Avax twins, V1 trackers / vesters, and V2 Oracle / Reader rows); Kelp DAO leftover (Sourcify deposit / withdraw; KYC) is logged (remaining listed is the website Restaking page); Aera leftover (Sourcify Base MultiDepositorVault / Provisioner; KYC) is logged (listed leftover exhausted at the opened-contract level); SSV Network leftover (Sourcify Network / Views; KYC) is logged (listed leftover exhausted at the opened-contract level); Derive leftover matching + cash leftover (f6c20f4/96796a6Deposit / Withdrawal / Transfer / Trade / Matching + CashAsset) is logged. Derive leftover auction + security leftover (96796a6DutchAuction / SecurityModule) is logged. Derive leftover assets leftover (96796a6WrappedERC20 / Option / Perp) is logged. Derive leftover StandardManager leftover (96796a6StandardManager + BaseManager bid / fee / settle) is logged. Derive leftover PMRM + feeds leftover (96796a6PMRM / PMRMLib / BaseLyraFeed / spot / vol / rate / forward / spot-diff / SFP) is logged (listed leftover that official GitHub of listed types opens is exhausted at the opened-contract level; Lyra explorer still 403; Sourcify 404 on guessed L2 chain ids); Royco leftover (Sourcify factory + Makina strategy; KYC) is logged (remaining listed is srRoyUSDC / Multisig Strategy Sourcify 404); zerolend-boost leftover (60d255alocker / omnichain staking / VestedZeroNFT / AirdropRewarder / PoolVoter) is logged (ended 2024-03-14 audit-comp; listed leftover that a public tree would open is exhausted; remaining listed is zkSync / Manta Aave-fork Sourcify 404); GMX leftover V1 RewardTracker leftover (Sourcify Arb RewardTracker / RewardDistributor / BonusDistributor / Vester / EsGMX) is logged (remaining listed is Avax twins, Sourcify-404 Glp Vester / Staked Glp Distributor, and V2 Oracle / Reader rows); deBridge leftover (Sourcify ETH DeBridgeGate / DeBridgeToken / SignatureVerifier / CallProxy / SimpleFeeProxy / WethGate / TokenDeployer) is logged (listed leftover that Sourcify opens on Ethereum is exhausted; remaining listed is other-chain twins); ENS leftover (Sourcify ETH ETHRegistrarController / NameWrapper / PublicResolver / BaseRegistrar / ENSRegistry) is logged (listed leftover that Sourcify opens is exhausted at the opened registrar / wrapper / registry / resolver level); GMX leftover V2 OrderHandler leftover (Sourcify Arb OrderHandler / OrderVault / DepositHandler / WithdrawalHandler / WithdrawalVault / LiquidationHandler) is logged (remaining listed is Glv / Shift / SubaccountRouter / ExternalHandler / FeeHandler, V1 Order Book / Timelock / StakedGlp / USDG, Avax twins, and V2 Oracle / Reader rows); GMX leftover V2 GlvRouter leftover (Sourcify Arb GlvRouter / GlvHandler / GlvVault / SubaccountRouter) is logged. GMX leftover V2 Shift leftover (Sourcify Arb ShiftHandler / ShiftVault / ExternalHandler / FeeHandler) is logged. GMX leftover V2 Oracle + V1 Order Book leftover (Sourcify Arb Oracle / Reader / OrderBook / USDG / Timelock V1+V2 / StakedGlp) is logged (remaining listed is Avax twins leftover logged below and Sourcify-404 Staked Glp Distributor); GMX leftover V1 Avalanche twins leftover (Sourcify Router / OrderBook / StakedGlp / RewardTracker / RewardDistributor / Vester / GMX / EsGMX) is logged (listed leftover that Sourcify opens is exhausted; remaining is 404 Vault / GlpManager / RewardRouterV2 / trackers); Kiln DeFi leftover ETH vault core leftover (Sourcify; KYC) is logged (remaining listed is other-chain vaults / factories); Acala leftover honzon / DEX / homa leftover (cde2abf) is logged. Acala leftover EVM / XCM / bridge leftover (cde2abf) is logged (listed Acala runtime leftover exhausted at the opened pallet level; remaining listed is ORML); Acala leftover ORML leftover (33bc94atokens / xtokens / currencies / oracle / vesting / payments / auction / nft / unknown-tokens / rewards / asset-registry) is logged (listed leftover that money-path pallets open is exhausted; remaining is authority / xcm-support / traits / rate-limit support crates); Ostium leftover vault / trading leftover (Sourcify; KYC) is logged (remaining listed is keepers / registry / routers / timelock / web); Ostium leftover keepers / registry leftover (Sourcify PriceUpKeep / PrivatePriceUpKeep / TradesUpKeep / PriceRouter / Verifier / OpenPnl / PairInfos / PairsStorage / Registry / Timelock / LockedDepositNft; KYC) is logged (listed leftover that Sourcify opens is exhausted; remaining listed is the web / Telegram apps); Kamino leftover klend + kvault leftover (a087609/1d146d7; KYC) is logged (remaining listed is Scope oracle, KFarms, Kamino Liquidity, and listed third-party oracles); Kamino leftover Scope + KFarms leftover (fe53523/bfa1860; KYC) is logged (listed leftover that official GitHub opens is exhausted; remaining listed is Kamino Liquidity program /kliquidity-sdkand the website); GMX leftover V2 AdlHandler leftover (Sourcify Arb AdlHandler / AdlUtils / GlpBalance / Chainlink providers / ChainReader) is logged (remaining listed is Avax twins leftover logged below, Sourcify-404 Staked Glp Distributor, and same-type utils); USDT0 leftover ETH adapter + Arb OFT leftover (Sourcify OAdapterUpgradeable / OUpgradeable / ArbitrumExtensionV2; KYC) is logged (remaining listed is other-chain twins); Ondo Finance leftover TokenRouter + rOUSG leftover (Sourcify; KYC) is logged (remaining listed is other oracles / tokens / managers); Hyperlane leftover ETH Mailbox leftover (Sourcify; KYC) is logged (remaining listed is other-chain twins / ISM factories / warp routes); Ondo Finance leftover TokenManager leftover (Sourcify; KYC) is logged (remaining listed is RWADynamicOracle / SanityCheck / 404s / other-chain); Veda leftover BoringVault leftover (Sourcify BoringVault / AccountantWithRateProviders / ManagerWithMerkleVerification / BoringOnChainQueue / Teller; KYC) is logged (remaining listed is Sourcify-404 ETH rows / other-chain); Immutable leftover RootERC20Bridge leftover (Sourcify RootERC20BridgeFlowRate / RootAxelarBridgeAdaptor; KYC) is logged (remaining listed is other-chain / child-chain twins); Stargate leftover ETH pools leftover (Sourcify StargatePoolNative / StargatePoolUSDC / StargatePoolMigratable / TokenMessaging / Staking; KYC) is logged (remaining listed is METIS / mETH twins / other FeeLib / other-chain); LayerZero leftover ETH Endpoint leftover (Sourcify EndpointV2 / SendUln302 / ReceiveUln302 / DVN / Endpoint V1; KYC) is logged (remaining listed is FPValidator / ULN301 / OApp examples / other chains); Ethena leftover minting + staking leftover (Sourcify EthenaMinting / StakedUSDeV2 / LP staking / PSM; KYC) is logged (remaining listed is StakedENA / USDtb proxies / other OFT / TON); Ether.fi leftover LiquidityPool leftover (Sourcify LiquidityPool / WeETH / Liquifier / Redemption / WRNFT; KYC) is logged (remaining listed is eETH impl 404 / Auction / Oracle / adapters); Compound leftover Comet leftover (Sourcify cUSDCv3 / cWETHv3 / Rewards / Bulker; KYC) is logged (remaining listed is other markets / Governor / other-chain); Maple leftover Pool leftover (Sourcify MaplePool / PoolManager / Loan / SyrupRouter; KYC) is logged (remaining listed is factories / cyclical WM / strategies); Granite leftover money-path leftover (Hiro borrower / LP / flash-loan / liquidator / state / withdrawal-caps / staking; KYC) is logged (remaining listed is governance / meta-governance / listed Pyth+Wormhole adapters and the website); Aave leftover v3 Pool leftover (cff15dePool / Supply / Borrow / Liquidation / vToken; KYC) is logged (remaining listed is Configurator / ACL / oracles / periphery / rewards / GHO); FBTC leftover ETH FireBridge - minter leftover (Sourcify
FireBridge / FBTCMinter /
FBTC / FeeModel / Governor /
LockedFBTC; KYC) is logged
(remaining listed is other-
chain twins);
Gearbox leftover core-v3
pool + credit leftover
(
510fc65PoolV3 / CreditFacadeV3 / CreditManagerV3 / CreditAccountV3; KYC) is logged. Gearbox leftover oracles-v3 leftover (287739aLPPriceFeed / Bounded / Composite / Curve / ERC4626 / wstETH / Pendle / Pyth / Redstone; KYC) is logged. Gearbox leftover integrations-v3 adapter + zapper leftover (39e70f0AbstractAdapter / Uniswap V2+V3 / Curve base / ERC4626 / ZapperBase; KYC) is logged. Gearbox leftover bots-v3 leftover (ebec19dPartialLiquidationBotV3; KYC) is logged (listed bots-v3 leftover exhausted). Gearbox leftover integrations-v3 remaining adapters leftover (39e70f0Pendle / Balancer V3 / Convex / Lido / Sky / Uniswap V4; KYC) is logged. Gearbox leftover permissionless governor + configurator leftover (b1b5e5bMarketConfigurator / TreasurySplitter / Governor / CrossChainMultisig / BytecodeRepository / ACL; KYC) is logged. Gearbox leftover periphery-v3 emergency + migration leftover (2a63cf2MultiPause / TreasuryLiquidator / LiquidityMigrator / AccountMigratorBot; KYC) is logged (listed periphery-v3 emergency / migration leftover exhausted). Gearbox leftover integrations-v3 leftover adapters leftover (39e70f0Camelot / Fluid / Infinifi / Mellow / Midas / Securitize / TraderJoe / Upshift / Velodrome; KYC) is logged (listed integrations-v3 leftover adapters exhausted). Gearbox leftover permissionless factories + instance leftover (b1b5e5bPoolFactory / CreditFactory / InstanceManager / PriceFeedStore / MarketConfiguratorFactory; KYC) is logged (remaining listed is permissionless helpers and integrations helpers); Burrow leftovercontract.main.burrow.nearleftover (0dbfa18execute / ft_on_transfer / oracle_on_call / liquidate; KYC) is logged (listed leftover that official burrowland opens is exhausted); Babylon leftover vigilante - covenant leftover
(
9a4c506/4e7ffcd; KYC) is logged; Babylon leftover finality-provider leftover (fd28092; KYC) is logged; Babylon leftover staking-expiry-checker leftover (73f4c7b; KYC) is logged; Babylon leftover staking-queue-client leftover (c4b08ad; KYC) is logged; Babylon leftover node btcstaking leftover (132d050; KYC) is logged; Babylon leftover node incentive leftover (132d050; KYC) is logged; Babylon leftover node finality leftover (132d050; KYC) is logged; Babylon leftover node costaking + mint leftover (132d050; KYC) is logged; Babylon leftover node checkpointing + epoching leftover (132d050; KYC) is logged; Babylon leftover node btclightclient + btccheckpoint leftover (132d050; KYC) is logged (remaining listed is websites); Livepeer leftover Arb bonding - tickets + LPT bridge leftover
(Sourcify BondingManager /
TicketBroker / Minter /
L2LPTGateway / L1LPTGateway /
BridgeMinter / L1Escrow; KYC)
is logged;
Livepeer leftover remaining
rounds + votes + migrators leftover
(Sourcify RoundsManager /
BondingVotes / Governor /
Treasury / ServiceRegistry /
MerkleSnapshot / L2Migrator /
DelegatorPool / PollCreator /
L1Migrator / data caches; KYC)
is logged;
Livepeer leftover go-livepeer
client leftover (
38eb47d; KYC) is logged (listed leftover exhausted; L1 contracts stay paused); Gala leftover ETH MTRM + GALA + SILK leftover (Sourcify Materium / Gala impl / Silk; KYC) is logged (remaining listed is the gala.com / app / wallet / node / film / music websites); Serai leftover listed crypto - bitcoin leftover
(
4b89cf0; KYC) is logged (listed leftover exhausted); Felix leftover feUSD + borrower + redeem leftover (10b5457; KYC) is logged; Felix leftover zappers + leftover pools leftover (10b5457; KYC) is logged; Felix leftover RedStone + composite price feeds leftover (10b5457; KYC) is logged (remaining listed is Primacy of Impact); OnRe leftover Solana program money path leftover (f6a4c6e; KYC) is logged; OnRe leftover prop AMM + buffer + configurable vault leftover (f6a4c6e; KYC) is logged (listed leftover that official GitHub opens is exhausted); MUX leftover mux3 orderbook + pool + position leftover (8674f2b) is logged; MUX leftover mux-protocol core + orderbook leftover (0f70a70) is logged; MUX leftover mux-degen orderbook + pool leftover (c5bfe81) is logged; MUX leftover mux-aggregator proxyFactory + gmxV2 leftover is logged (remaining listed is mux-staking); Linea leftover TokenBridge + rollup + yield leftover (a83412e/a9a43aa/ main; KYC) is logged (remaining listed is the immunefi.com scope placeholder); Exactly leftover Market + DebtManager leftover (Sourcify; KYC) is logged; Exactly leftover remaining ExaPlugin leftover (Sourcify; KYC) is logged (remaining listed is Sourcify-404 impls and the immunefi.com placeholder); Wormhole leftover ETH core + TokenBridge leftover (Sourcify Core / TokenBridge / NFTBridge; KYC) is logged (remaining listed is Relayer 404 / NTT / circle- integration / other chains); Ondo Finance leftover remaining oracles leftover (Sourcify RWADynamicOracle / SanityCheck / IssuanceHours / IDRegistryView / OndoOracle / OUSG comparison / ComplianceGMView; KYC) is logged (remaining listed is other-chain oracles / remaining 404s); Chainlink leftover CCIP EVM leftover (f0eda24Router / OnRamp / OffRamp / TokenPool; KYC) is logged (remaining listed is CCIP Solana / Sui / Aptos / chainlink-evm / OCR plugins / core node / LibOCR / owner contracts / websites); Optimism leftover L1 portal + StandardBridge leftover (eea9542Portal2 / StandardBridge / messenger / ERC721; KYC) is logged (remaining listed is dispute games / op-node / L2 / PolicyEngineStaking / websites); Arbitrum leftover token-bridge + Inbox leftover (1bdf3cd/7fc6624L1/L2 gateways / Inbox / Outbox; KYC) is logged (remaining listed is nitro challenge / rollup / governance / fund-distribution / remaining token-bridge); zkSync Era leftover L1 Mailbox + AssetRouter leftover (Sourcify Mailbox / Bridgehub / AssetRouter / legacy ERC20; KYC) is logged (remaining listed is L2 / circuits / governance / websites); Polygon leftover LXLY AggLayer leftover (Sourcify AgglayerBridge / Manager / GER / Gateway; KYC) is logged (remaining listed is POS Bridge & Staking / sPOL / POL token / Bor / Heimdall); Parallel leftover ETH savings + sPRL leftover (Sourcify sUSDp / sPRL1 / sPRL2 / Lockbox; KYC) is logged (remaining listed is Parallelizer facets 404 / TokenP 404 / other-chain); Avail leftover ETH bridge leftover (f3bd9d9AvailBridgeV1 / Fusion / AvailWormhole; KYC) is logged (remaining listed is Bridge UI); Chainlink leftover remaining VRF leftover (c75c193VRFCoordinatorV2_5 / VRFCoordinatorV2; KYC) is logged (remaining listed is Functions / Automation if a later SHA opens; CCIP Solana / Sui / Aptos; OCR plugins; core node; LibOCR; owner contracts; websites); Stacks leftover pox-5 leftover (1aa80f89pox-5.clar; KYC) is logged (remaining listed is costs.clar / lockup if a later SHA opens; stacks-node / stackslib / stacks-signer; stacks-common; Clarity VM); Boba Network leftover ETH LightBridge leftover (Sourcify LightBridge / ResolvedDelegateProxy; KYC) is logged (remaining listed is RPC / gateway / websocket); Starknet Staking leftover L1 mint + cairo staking leftover (7a7add2/@staking/contracts-v1.0.1-dev.854; KYC) is logged (remaining listed is minting_curve config; utils.cairo); Katana leftover ETH portal + KAT OFT + vbToken leftover (Sourcify OptimismPortal2 / KATOFT / VaultBridgeToken / VotingEscrow / KatToken; KYC) is logged (remaining listed is NativeConverter impls 404 / avKAT 404 / remaining converters / Jitosol OFT); Wormhole leftover remaining NTT leftover (250d810NttManager / WormholeTransceiver; KYC) is logged (remaining listed is circle-integration (now leftover-logged) / other-chain NTT / Relayer 404); Metronome leftover ETH deposit + debt leftover (Sourcify DepositToken / DebtToken / Gateway / Pool / Treasury / SFM / Synth / AMO; KYC) is logged (remaining listed is OP / Base twins (now leftover-logged) / CrossChainDispatcher / ProxyOFT / Quoter (now leftover-logged)); Glo Dollar leftover USDGLO leftover (Sourcify GloDollarV3; KYC) is logged (listed leftover exhausted); The Graph leftover ETH L1 staking leftover (Sourcify L1Staking / RewardsManager / GRT; KYC) is logged (remaining listed is Arbitrum HorizonStaking / PaymentsEscrow / L2 gateway / Curation / DisputeManager / BillingConnector); Kleidi leftover ETH Safe + timelock leftover (Sourcify InstanceDeployer / Guard / Timelock / RecoverySpell; KYC) is logged (remaining listed is AddressCalculation if not covered); Wormhole leftover remaining circle-integration leftover (2342025; KYC) is logged (remaining listed is Relayer 404 / other-chain NTT); Ante Finance leftover ETH pool leftover (Sourcify AntePoolFactory / AntePool; KYC) is logged (remaining listed is other listed Ante Pool addresses, same type); YO Protocol leftover yoVault leftover (Sourcify yoVault / YoGateway; KYC) is logged (remaining listed is multisig / website); Autonolas leftover ETH Depository + Treasury leftover (Sourcify Depository / Treasury / OLAS / Dispenser; KYC) is logged (remaining listed is marketplace / registries after L2 / veOLAS / Bridge2Burner leftovers are leftover-logged); Zerion leftover ETH Premium Purchaser leftover (Sourcify PurchaserL1; KYC) is logged (remaining listed is other-chain same purchaser / zkSync variant / Paymaster / websites / apps); NUVA leftover ETH depositor + withdrawal leftover (Sourcify Depositor / Withdrawal / CustomToken; KYC) is logged (remaining listed is vault / router impls 404 / Provenance vaults / website); KAST leftover Solana USDK/USDKY extension leftover (c22b6b8wrap / unwrap / ext_swap; KYC) is logged (listed leftover exhausted); XOXNO leftover MultiversX lending leftover (bffbbd9/2e8c81d; KYC) is logged (listed leftover exhausted); OpenZeppelin leftover Stellar packages leftover (v0.7.2fungible / vault; KYC) is logged (remaining listed is RWA / governance / accounts, now leftover-logged); Autonolas leftover remaining L2 dispenser + veOLAS leftover (Sourcify Polygon / OP dispenser + ETH veOLAS; KYC) is logged (remaining listed is ServiceRegistry / ServiceManager / governance / LiquidityManager / Tokenomics after marketplace leftover is leftover-logged); Autonolas leftover remaining Bridge2Burner + BuyBack leftover (Sourcify Polygon / OP Bridge2Burner + ETH Burner / BuyBackBurnerUniswap; KYC) is logged (remaining listed is ServiceRegistry / ServiceManager / governance / LiquidityManager / Tokenomics after marketplace leftover is leftover-logged); Autonolas leftover remaining marketplace leftover (Sourcify MechMarketplace / Karma / balance trackers / registries; KYC) is logged (remaining listed is L2 ServiceRegistry / deposit processors / oracles / proxy 404s after Tokenomics + ServiceRegistry leftover is leftover-logged); The Graph leftover remaining Arb Horizon + payments leftover (Sourcify HorizonStaking / PaymentsEscrow / GraphPayments / Billing / BillingConnector / L1GraphTokenGateway; KYC) is logged (remaining listed is L2GraphTokenGateway 404 / L2GNS / AllocationExchange / GraphTallyCollector after Curation + Dispute leftover is leftover-logged); The Graph leftover remaining Curation + Dispute leftover (Sourcify ETH Curation / DisputeManager + Arb L2Curation / DisputeManager / SubgraphService; KYC) is logged (remaining listed is L2GraphTokenGateway 404 / L2GNS impl / Governor / TokenLockWallet after AllocationExchange + Tally leftover is leftover-logged); The Graph leftover remaining AllocationExchange + Tally leftover (Sourcify AllocationExchange / GraphTallyCollector; KYC) is logged (remaining listed is L2GraphTokenGateway 404 / Governor after L2GNS + TokenLock leftover is leftover-logged); Autonolas leftover remaining Tokenomics + ServiceRegistry leftover (Sourcify Tokenomics / LiquidityManagerETH / ServiceRegistry / ServiceRegistryTokenUtility; KYC) is logged (remaining listed is oracles / VoteWeighting / proxy 404s after L1 deposit processors + L2 ServiceRegistry leftover is leftover-logged); proxy 404s); Mars leftover BSC swap + farm leftover (Sourcify Core / Router / LiquidityMiningMaster / VestingMaster / AirDrop; no KYC) is logged (remaining listed is XMS Sourcify 404 / website); Velvet leftover Base deposit + withdraw leftover (Sourcify DepositBatch / DepositManager / WithdrawBatch / WithdrawManager; KYC) is logged (remaining listed is config / rebalancing / fee / oracle / factory 404); Autonolas leftover remaining L1 deposit processors + L2 ServiceRegistry leftover (Sourcify ETH processors / Polygon ServiceRegistryL2; KYC) is logged (remaining listed is Gnosis processor twin / oracles / proxy 404s); The Graph leftover remaining L2GNS + TokenLock leftover (Sourcify L2GNS / GraphTokenLockWallet; KYC) is logged (remaining listed is L2GraphTokenGateway 404 / Governor); Tetu leftover empty-assets leftover (no KYC; emptyassets) is logged (listed leftover exhausted); Autonolas leftover remaining oracle + VoteWeighting leftover (Sourcify BalancerPriceOracle / VoteWeighting / Gnosis processor; KYC) is logged (listed Sourcify leftover exhausted except proxy / UniswapPriceOracle 404s); The Graph leftover remaining Governor leftover (Sourcify Safe proxy; KYC) is logged (remaining listed is L2GraphTokenGateway 404); Xterio leftover website leftover (KYC; no contract URL) is logged; Metronome leftover remaining OP + Base twins leftover (Sourcify DepositToken / DebtToken / Pool / Treasury; KYC) is logged (remaining listed is leftover-logged except same-type OFT twins); Velvet leftover remaining rebalance + fee leftover (Sourcify Rebalancing / FeeModule / TokenExclusionManager / PriceOracleL2; KYC) is logged (remaining listed is PortfolioFactory / ProtocolConfig 404s); Pragma leftover remaining TWAP + randomness leftover (83094b9; KYC) is logged (remaining listed is website); Kiln leftover website leftover (kiln-webapp; KYC) is logged; 1inch leftover wallet leftover (1inch-wallet; KYC) is logged; Metronome leftover remaining CrossChainDispatcher + ProxyOFT leftover (Sourcify; KYC) is logged (listed leftover that Sourcify opens is exhausted except same-type OFT twins); OpenZeppelin leftover remaining RWA + governance leftover (v0.7.2; KYC) is logged (listed leftover that official v0.7.2 opens is exhausted); Folks leftover sc-library leftover (c5f2531; no KYC) is logged (listed leftover exhausted); 1inch leftover business leftover (1inch-business; KYC) is logged; 1inch leftover web leftover (1inch-web; KYC) is logged; Hibachi leftover website leftover (hibachi; KYC) is logged; Cosmos leftover solidity-ibc-eureka leftover (8f33f35; KYC) is logged (remaining listed is cosmos-sdk / ibc-go / cometbft / CosmWasm / gaia DLT); 1inch leftover infrastructure leftover (1inch-infrastructure; KYC) is logged; Exodus leftover website leftover (exodus; KYC) is logged; Ofza leftover website leftover (ofza-1; KYC) is logged; EdgeX leftover website leftover (edgex; KYC) is logged; Avalanche leftover ICTT TokenHome + TokenRemote leftover (0b68b03; KYC) is logged (remaining listed is avalanchego / libevm / snowtrace bridged tokens); Berachain leftover webapps leftover (berachain-webapps; KYC) is logged; Ava Labs leftover website leftover (avalabs; KYC) is logged; BlockPI leftover website leftover (blockpinetwork; no KYC) is logged; Unstoppable leftover wallet leftover (unstoppablewallet; no KYC) is logged; Velvet leftover BSC v1 IndexSwap leftover (Sourcify; no KYC) is logged (remaining listed is handlers / VelvetSafeModule / PriceOracle / RebalanceAggregator / ERC1967Proxy twins / Primacy of Impact); Velvet leftover remaining BSC handlers leftover (Sourcify; no KYC) is logged (listed leftover that Sourcify opens is exhausted; remaining listed is two proxy 404s / Primacy of Impact); Wormhole leftover remaining Solana + Sui NTT leftover (250d810; KYC) is logged (remaining listed is Relayer 404); Serai leftover bitcoin-serai leftover (4b89cf02; KYC) is logged (remaining listed is primacy of impact; listed crypto crates are leftover-logged after Next candidates); Pragma leftover cairo oracle leftover (83094b9; KYC) is logged (remaining listed is TWAP / randomness / website); Axelar leftover Aurora/Fantom gateways + remaining axlUSDC leftover (Sourcify / official cgp; KYC) is logged; Celer leftover ETH staking / SGN / cBridge leftover (Sourcify; KYC) is logged. Celer leftover remaining cBridge deployments leftover (Sourcify Arb / Polygon / Avalanche / Fantom / Optimism / Boba / BSC; KYC) is logged (listed cBridge leftover exhausted; remaining listed is the web app); Pyth Network leftover EVM (official GitHub Pyth / Entropy / Lazer; KYC) is logged (remaining listed is Solana / Sui / staking); Axelar leftover ETH gateway / ITS / ITF leftover (Sourcify + official GitHub; KYC) is logged; Axelar leftover DLT axelar-core evm / axelarnet / nexus leftover (186e889; KYC) is logged; Axelar leftover DLT tofnd leftover (98de47e; KYC) is logged; Axelar leftover Hyperliquid ITS live leftover (ff21991; KYC) is logged (remaining listed is historic Fantom gateway proxy if source opens);
DeXe Protocol leftover
(Sourcify + official
GitHub UserRegistry /
SphereXEngine / GovPool
/ factory / registry /
PriceFeed; KYC) is
logged (listed leftover
exhausted at the
opened-contract level;
remaining listed is
PoolSphereXEngine
Sourcify 404);
Kiln On-Chain v1 leftover
(Sourcify StakingContract
/ CL+EL fee dispatchers
/ FeeRecipient; KYC) is
logged (listed mainnet
leftover exhausted;
remaining listed is
Goerli testnet rows);
Royco factory + Makina
strategy leftover
(Sourcify Factory /
RoycoVaultMakinaStrategy;
KYC) is logged;
CapyFi leftover (Sourcify
Comptroller / CEther /
CErc20; KYC) is logged
(remaining listed is
Unitroller Sourcify 404
and same-type other-market
CErc20Delegate impls);
Beefy Finance leftover
(Sourcify Polygon
BeefyVaultV6 + common
chef / DFYN / Curve /
BIFI-maxi strategies) is
logged.
Beefy leftover remaining
Polygon vaults leftover
(Sourcify zaps + Aave /
Wault / Fish / Curve /
PZAP / Cometh / MiniChef /
RewardPool) is logged
(remaining listed is
Sourcify 404 wexpoly /
some Aave-Cometh and
same-type unsampled
vaults);
Orca leftover (3b47341 /
05fe66b xORCA +
Whirlpools) is logged
(listed leftover
exhausted);
Arkadiko leftover (Hiro
vaults / tokens /
liq-pool) is logged
(remaining listed is the
website);
JustLend leftover
(f28f3b4 Unitroller /
Comptroller / CToken
mint-redeem-borrow-
liquidate) is logged.
JustLend leftover
governance leftover
(f28f3b4 GovernorBravo /
WJST / Timelock /
PriceOracleProxy) is logged.
JustLend leftover rewards
leftover (f28f3b4
ComptrollerLegacy JST /
PriceOracleV1 / rate
models) is logged (listed
leftover that a public
tree would open is
exhausted; remaining
listed is other Tronscan
jToken markets);
Pareto Credit leftover
(19e7cde IdleCDO /
CreditVault / Tranche /
epoch request-claim) is
logged;
Pareto Credit leftover
strategy leftover
(19e7cde
IdleCreditVault receipt
/ APR=0) is logged;
Pareto Credit leftover
epoch admin leftover
(19e7cde startEpoch /
stopEpoch /
depositDuringEpoch) is
logged;
Pareto Credit leftover
queue leftover
(19e7cde
IdleCDOEpochQueue /
Prefunded) is logged;
Pareto Credit leftover
factory leftover
(19e7cde factory /
write-off escrow /
orchestrator / implied
price / programmable
borrower) is logged;
Pareto Credit leftover
wrappers leftover
(19e7cde TrancheWrapper /
IdleTokenWrapper /
wstETH Balancer /
Keyring) is logged;
Pareto Credit leftover
Fulcrum leftover (Sourcify
IdleFulcrumV2 plus live
CDO / queue / strategy
impls of already-reviewed
types) is logged
(remaining listed is
Sourcify 404 docs
addresses);
Synthetix deposit leftover
(Blockscout
SynthetixDepositContract /
lens / PermissionsRegistry)
is logged (listed leftover
exhausted at the three
Ethereum addresses);
RootstockLabs RIF token leftover
(Sourcify) is logged (KYC).
RootstockLabs leftover PegIn /
PegOut / Collateral (Blockscout)
is logged (KYC; Flyover leftover
exhausted at the opened-contract
level; remaining listed is
GitHub DLT / web);
Beets stS
(877087b) + token
leftover is logged
(migrator Sourcify 404);
Yearn YFI token leftover
is logged (yvUSD / Woofy
still Sourcify 404);
Benqi Dual Oracle leftover
is logged. Benqi core
markets leftover
(unitroller / qiAVAX /
qiUSDC / Maximillion,
Sourcify match +
e0cfd24) is logged.
Benqi QI token leftover
is logged. Benqi token-
sale leftover
(exact_match +
e0cfd24) is logged.
Benqi PGL staking
leftover (match +
e0cfd24) is logged
(remaining Benqi is
isolated unitroller
Sourcify 404 / gauges /
sAVAX / veQI proxy-only
/ Ignite / MultiReward /
JumpRateModel / Pause
Guardian / sAVAX
timelock / JLP staking
Sourcify 404; listed
Sourcify-open leftover
exhausted);
Harvest vault / controller
leftover (0364901) and
4626 / Dolomite lend
leftover and Convex /
Aura / Aave fold leftover
and Penpie / Notional /
StakeDAO / Yel leftover
and ZeroLend /
CompoundV3 / Idle
leftover and inactive /
MorphoVault V2 / sDAI /
StakeDAO lend / cvxCRV
leftover and polygon
CompoundBlue / chef
leftover (f24a06a)
and polygon
Aave / Aura / Balancer /
Convex / Idle leftover
(f24a06a) and polygon
Gamma / Pearl / Meshswap
leftover (f24a06a)
and polygon Jarvis /
Complifi / Compound /
Yel leftover
(f24a06a) are logged
and Arbitrum Camelot /
Silo / Venus leftover
(125270d) are logged
(listed Harvest GitHub
leftover exhausted);
ICHI oneToken leftover
(4873873) is logged;
Yearn yCRV token +
Boosted Staker /
distributor leftover
is logged (yvUSD still
Sourcify 404);
Hermetica hBTC vault
leftover is logged
(listed Clarity
exhausted);
Twyne vaults / wrappers /
EVC / factories still
Sourcify 404 (lowercase
recheck ~05:35 UTC);
CoW GPv2 leftover
(6ebbd81, all 19
listed blobs) is logged
(listed CoW GitHub
leftover exhausted);
Stader ETHx user deposit
/ withdraw leftover
(9d4a921) plus oracle /
factory / insurance /
auction / socializing
plus registries / vaults
/ SD / pools plus Penalty
/ PoolSelector /
PoolUtils / Config
leftover is logged
(listed Stader leftover
exhausted; remaining row
is Primacy of Impact);
Symbiosis MetaRouter +
Gateway leftover
(Sourcify Ethereum
exact_match) is
logged (listed
Symbiosis leftover
exhausted);
GammaSwap listed leftover (factory /
DeltaSwap / staking / GS / timelock /
airdrop) is exhausted;
Integral leftover TwapDelay + Pair + Relayer leftover (Sourcify)
is logged (Ethereum listed leftover that Sourcify opens is
exhausted; remaining listed is Arbitrum Delay / Pair /
Relayer / Fee governor of the same types);
Immunefi leftover ETH Splitter leftover (Sourcify) is logged
(listed SC leftover exhausted; remaining listed is websites
- Primacy of Impact);
Enzyme Onyx leftover ValuationHandler + trackers leftover
(
7b48d24) is logged; ZKsync OS leftover bootloader + system hooks leftover (9efc8bf) is logged (remaining listed is interpreter / zk_ee / airbender / wrapper); Lombard leftover BARD token + TokenDistributor leftover (f79d6f6) is logged; Lombard leftover StakeAndBake + NativeLBTC + AssetRouter leftover (7fe83e5) is logged; Lombard leftover BridgeV2 + Mailbox + Bascule leftover (7fe83e5) is logged; Lombard leftover Sui LBTC + bridge_vault leftover (d78ebef) is logged; Lombard leftover Starknet cairo packages leftover (0358a40) is logged (listed Lombard GitHub leftover that official trees open is exhausted); Velvet leftover BSC v1 IndexSwap leftover (Sourcify) is logged; Velvet leftover remaining BSC handlers leftover (Sourcify) is logged (remaining listed is 404 proxies / Primacy of Impact); Wormhole leftover remaining Solana + Sui NTT leftover (250d810) is logged; Hedera leftover remaining CryptoTransfer leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Filecoin leftover builtin-actors market + paych leftover (d894a1a) is logged (remaining listed is lotus / proofs / boost / other actors); Filecoin leftover remaining miner + account leftover (d894a1a) is logged; Filecoin leftover evm leftover (d894a1a) is logged; Filecoin leftover reward + power leftover (d894a1a) is logged; Filecoin leftover datacap + verifreg leftover (d894a1a) is logged (remaining listed is lotus / proofs / boost / FVM / filecoin.io); Hedera leftover remaining TokenMint leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Hedera leftover remaining CryptoApproveAllowance leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Hedera leftover remaining TokenCreate leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Hedera leftover remaining TokenUpdate leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Hedera leftover remaining TokenFeeSchedule leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs; listed token-service handler leftover that this extract opens is exhausted); Hedera leftover remaining File leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / contract / schedule / consensus / SDKs); Hedera leftover remaining Schedule leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / contract / SDKs); Hedera leftover remaining Contract leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Hedera leftover remaining Node leftover (0d3d9a2) is logged (remaining listed is mirror-node / cryptography / other modules / SDKs); Hedera leftover remaining cryptography leftover (39f28f3) is logged (remaining listed is mirror-node / SDKs / transaction-tool); Hedera leftover remaining SDK-js leftover (5b785ed) is logged (remaining listed is mirror-node / sdk-java / sdk-go / transaction-tool); Hedera leftover hiero-mirror-node importer leftover (abfc59f) is logged (remaining listed is sdk-java / sdk-go / transaction-tool); Hedera leftover remaining mirror-node leftover (abfc59f) is logged (remaining listed is cryptography / SDKs / transaction-tool); Filecoin leftover remaining boost leftover (240aa6e) is logged (remaining listed is lotus / proofs / go-f3 / filecoin.io); Filecoin leftover remaining go-f3 leftover (5f2c984) is logged (remaining listed is lotus / proofs / FVM / filecoin.io); Filecoin leftover remaining lotus miner leftover (7740217) is logged (remaining listed is proofs / FVM / filecoin.io); Filecoin leftover remaining FVM leftover (d4efdd4) is logged (remaining listed is proofs / filecoin.io); Filecoin leftover remaining proofs-api leftover (7637843) is logged (remaining listed is rust-fil-proofs / ffi / filecoin.io); Filecoin leftover remaining proofs-ffi leftover (59f46f4) is logged (remaining listed is rust-fil-proofs / filecoin-ffi / filecoin.io); Filecoin leftover remaining proofs leftover (d451d23) is logged (remaining listed is filecoin.io / go-graphsync / remaining go-* / lotus non-miner / paired / filecoin-ffi); Filecoin leftover remaining filecoin.io website leftover is logged (remaining listed is go-graphsync / remaining go-* / lotus non-miner / paired / filecoin-ffi); Filecoin leftover remaining filecoin-ffi leftover (17b1c64) is logged (remaining listed is go-graphsync / remaining go-* / lotus non-miner / paired); Filecoin leftover remaining go-graphsync leftover (12cbffa) is logged (remaining listed is remaining go-* / lotus non-miner / paired / go-data-transfer); Filecoin leftover remaining go-amt-ipld leftover (04938b0) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-bitfield leftover (1602662) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-cbor-util leftover (c99ffda) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-padreader leftover (2d55fc9) is logged (remaining listed is remaining go-* / lotus non-miner); Hedera leftover remaining hashed transaction-tool leftover (224dfd2) is logged (listed leftover that official trees open is exhausted); Filecoin leftover remaining go-statemachine leftover (029d947) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-statestore leftover (14f1c4b) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-sectorbuilder leftover (5177536) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-hamt-ipld leftover (eb80f85) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining go-ipld-cbor leftover (22f1772) is logged (remaining listed is remaining go-* / lotus non-miner); Filecoin leftover remaining cbor-gen leftover (443b860) is logged (remaining listed is lotus non-miner / bellperson / merkletree / neptune); Filecoin leftover remaining merkletree leftover (34825e6) is logged (remaining listed is lotus non-miner / neptune); Filecoin leftover remaining neptune leftover (b06f03c) is logged (remaining listed is lotus non-miner / neptune-triton); Filecoin leftover remaining neptune-triton leftover (9f2c2f4) is logged (remaining listed is lotus non-miner); Filecoin leftover remaining lotus mpool leftover (7740217) is logged (remaining listed is remaining lotus non-miner); Filecoin leftover remaining lotus market leftover (7740217) is logged (remaining listed is remaining lotus non-miner); Aave leftover remaining periphery leftover (cff15de) is logged (remaining listed is transfer strategies); Aave leftover remaining WrappedTokenGateway leftover (cff15de) is logged (remaining listed is Collector / transfer strategies); Aave leftover remaining transfer-strategy leftover (cff15de) is logged (remaining listed is IR strategy / other helpers); Filecoin leftover remaining lotus eth leftover (7740217) is logged (remaining listed is remaining lotus non-miner); Aave leftover remaining IR strategy leftover (cff15de) is logged (remaining listed is GHO remaining / stk / governance); Aave leftover remaining Gsm4626 leftover (23859bb) is logged (remaining listed is stk / StakeToken / OwnableFacilitator / governance); Aave leftover remaining GHO DirectFacilitator leftover (23859bb) is logged (remaining listed is stk / StakeToken / governance); Aave leftover remaining StakeToken leftover (5346765) is logged (remaining listed is governance); Aave leftover remaining VotingStrategy leftover (497226e) is logged (remaining listed is L2Pool / CCIP GHO pools / protocol-v2); Aave leftover remaining L2Pool leftover (cff15de) is logged (remaining listed is CCIP GHO pools / protocol-v2); Aave leftover remaining CCIP GHO leftover (d5c6ced) is logged (remaining listed is protocol-v2); Aave leftover remaining protocol-v2 LendingPool leftover (ce53c4a) is logged (remaining listed is v2 configurator / oracle / tokens); Aave leftover remaining v3 AToken leftover (cff15de) is logged; Aave leftover remaining EmissionManager leftover (cff15de) is logged; Aave leftover remaining GhoReserve leftover (23859bb) is logged; Aave leftover remaining Lending Rate Oracle leftover (Sourcify) is logged; Aave leftover remaining WrappedTokenGatewayV2 leftover (Sourcify) is logged; Aave leftover remaining v3 VariableDebtToken leftover (cff15de) is logged; Aave leftover remaining FixedPriceStrategy leftover (23859bb) is logged; Aave leftover remaining v2 Collector impl leftover (Sourcify) is logged; Aave leftover remaining GhoOracle leftover (23859bb) is logged; Aave leftover remaining v3 money-path logic leftover (cff15de) is logged; Aave leftover remaining v3 ValidationLogic + GenericLogic leftover (cff15de) is logged; Aave leftover remaining v3 PoolLogic + ConfiguratorLogic + CalldataLogic leftover (cff15de) is logged; Aave leftover remaining v3 ReserveLogic leftover (cff15de) is logged (remaining listed is primacy); Jito leftover remaining jito-solana banking_stage leftover (d0e3a47) is logged; Jito leftover remaining jito-solana proxy leftover (d0e3a47) is logged; Jito leftover remaining jito-solana replay leftover (d0e3a47) is logged; Jito leftover remaining jito-solana replay_stage leftover (d0e3a47) is logged; Jito leftover remaining jito-solana poh leftover (d0e3a47) is logged; Jito leftover remaining jito-solana tvu leftover (d0e3a47) is logged; Jito leftover remaining jito-solana bundle + fee leftover (d0e3a47) is logged; Jito leftover remaining jito-solana scheduler leftover (d0e3a47) is logged; Jito leftover remaining jito-solana tokens leftover (d0e3a47) is logged; Jito leftover remaining jito-solana runtime fee leftover (d0e3a47) is logged; Jito leftover remaining jito-solana programs leftover (d0e3a47) is logged; Jito leftover remaining jito-solana vote leftover (d0e3a47) is logged; Jito leftover remaining jito-solana bpf leftover (d0e3a47) is logged; Jito leftover remaining jito-solana compute-budget leftover (d0e3a47) is logged; Jito leftover remaining jito-solana zk-elgamal-proof leftover (d0e3a47) is logged; Jito leftover remaining jito-solana vote_reward leftover (d0e3a47) is logged; Jito leftover remaining jito-solana remaining runtime leftover (d0e3a47) is logged; Jito leftover remaining jito-solana partitioned epoch rewards leftover (d0e3a47) is logged; Jito leftover remaining jito-solana check_transactions leftover (d0e3a47) is logged; Jito leftover remaining jito-solana transaction_execution leftover (d0e3a47) is logged; Jito leftover remaining jito-solana stakes leftover (d0e3a47) is logged; Jito leftover remaining jito-solana epoch_stakes leftover (d0e3a47) is logged; Jito leftover remaining jito-solana stake_weighted_timestamp leftover (d0e3a47) is logged; Jito leftover remaining jito-solana serde_snapshot leftover (d0e3a47) is logged; Jito leftover remaining jito-solana snapshot_controller leftover (d0e3a47) is logged; Jito leftover remaining jito-solana snapshot_minimizer leftover (d0e3a47) is logged; Jito leftover remaining jito-solana snapshot_utils leftover (d0e3a47) is logged; Jito leftover remaining jito-solana snapshot_bank_utils leftover (d0e3a47) is logged; Jito leftover remaining jito-solana accounts_background_service leftover (d0e3a47) is logged; Jito leftover remaining jito-solana status_cache leftover (d0e3a47) is logged; Jito leftover remaining jito-solana bank_forks leftover (d0e3a47) is logged; Jito leftover remaining jito-solana non_circulating_supply leftover (d0e3a47) is logged; Jito leftover remaining jito-solana validated_reward_certificate leftover (d0e3a47) is logged; Jito leftover remaining jito-solana validated_block_finalization leftover (d0e3a47) is logged; Jito leftover remaining jito-solana fee_distribution leftover (d0e3a47) is logged; Jito leftover remaining jito-solana bank money-path leftover (d0e3a47) is logged; Jito leftover remaining jito-solana account_saver leftover (d0e3a47) is logged; Jito leftover remaining jito-solana bank_client leftover (d0e3a47) is logged; Jito leftover remaining jito-solana prioritization_fee leftover (d0e3a47) is logged; Jito leftover remaining jito-solana commitment leftover (d0e3a47) is logged; Jito leftover remaining jito-solana slot_params leftover (d0e3a47) is logged; Jito leftover remaining jito-solana genesis_utils leftover (d0e3a47) is logged; Jito leftover remaining jito-solana alpenglow_epoch_type leftover (d0e3a47) is logged; Jito leftover remaining jito-solana leader_schedule leftover (d0e3a47) is logged; Jito leftover remaining jito-solana sysvar_account leftover (d0e3a47) is logged; Jito leftover remaining jito-solana loader_utils leftover (d0e3a47) is logged; Jito leftover remaining jito-solana vote_sender leftover (d0e3a47) is logged; Jito leftover remaining jito-solana installed_scheduler leftover (d0e3a47) is logged; Jito leftover remaining jito-solana read_optimized_dashmap leftover (d0e3a47) is logged; Jito leftover remaining jito-solana static_ids leftover (d0e3a47) is logged; Jito leftover remaining jito-solana runtime_config leftover (d0e3a47) is logged (remaining listed remaining-runtime trees on this pin are exhausted); Optimism leftover remaining op-node deposits + withdrawals leftover (eea9542) is logged; Optimism leftover remaining PolicyEngineStaking leftover (eea9542) is logged; Optimism leftover remaining L2 ETH liquidity leftover (eea9542) is logged; Optimism leftover remaining ETHLockbox leftover (eea9542) is logged; Optimism leftover remaining op-dispute-mon leftover (eea9542) is logged; Optimism leftover remaining op-node deposits + withdrawals leftover (eea9542) is logged; Optimism leftover remaining op-node engine leftover (eea9542) is logged; Optimism leftover remaining mintable factory leftover (eea9542) is logged; Optimism leftover remaining L2OutputOracle leftover is logged; Optimism leftover remaining SystemConfig leftover is logged; Optimism leftover remaining op-node p2p leftover (eea9542) is logged; Optimism leftover remaining op-node sequencing leftover (eea9542) is logged; Optimism leftover remaining ProxyAdmin leftover is logged; Optimism leftover remaining op-reth leftover (eea9542) is logged; Optimism leftover remaining op-reth consensus leftover (eea9542) is logged; Optimism leftover remaining rust/op-reth flashblocks leftover (a8a3b818) is logged (remaining listed is unused official leftovers if still open); Arbitrum leftover remaining nitro challenge leftover (7fc6624) is logged; Arbitrum leftover remaining custom reverse gateway leftover (1bdf3cd) is logged; Arbitrum leftover remaining governance leftover (9e413da) is logged; Arbitrum leftover remaining fund-distribution leftover (52bc499) is logged; Arbitrum leftover remaining token-bridge libs leftover (1bdf3cd) is logged; Arbitrum leftover remaining websites leftover is logged (remaining listed Arbitrum trees on this pin are exhausted); Filecoin leftover remaining go-jsonrpc leftover (059363558429) is logged; Filecoin leftover remaining go-fil-markets leftover (6e1b1dc05c39) is logged; Filecoin leftover remaining go-state-types leftover (a31d84b45e42) is logged; Filecoin leftover remaining go-paramfetch leftover (78a1658e6493) is logged; Filecoin leftover remaining go-commp-utils leftover (b487eb14c907) is logged; Filecoin leftover remaining go-fil-commp-hashhash leftover (256368516783) is logged; Optimism leftover remaining dispute games leftover (eea9542) is logged; Rootstock leftover remaining powpeg-node pegout leftover (254fb3d) is logged; Filecoin leftover remaining lotus lib sigs leftover (7740217) is logged; Filecoin leftover remaining lotus lib backupds leftover (7740217) is logged; Filecoin leftover remaining lotus lib rpcenc leftover (7740217) is logged; Filecoin leftover remaining lotus lib peermgr leftover (7740217) is logged; Filecoin leftover remaining lotus lib httpreader leftover (7740217) is logged; Filecoin leftover remaining lotus lib addrutil leftover (7740217) is logged (listed lotus leftover on this pin is exhausted); Rootstock leftover remaining rskj Bridge leftover (161c3f105d18) is logged; Rootstock leftover remaining rsk-powhsm leftover (82a12d44efec) is logged (official Rootstock leftover that listed trees open is exhausted); ZKsync OS leftover zkos-wrapper leftover (8b679aa) is logged (remaining listed is airbender CS / prover / verifier); Sei leftover evm + bank + tokenfactory leftover (2e256b5) is logged; Sei leftover go-ethereum leftover (bb451e2) is logged; Sei leftover wasmd + sei-wasmd leftover (2e256b5/8dd2534) is logged; Sei leftover sei-cosmos bank leftover (62bafe8) is logged (remaining listed is other modules / Primacy of Impact); Hedera leftover json-rpc-relay leftover (2b51a98) is logged (remaining listed is consensus-node / mirror-node / cryptography / SDKs / transaction-tool); ZKsync OS leftover evm_interpreter leftover (9efc8bf) is logged (remaining listed is zk_ee / zksync_os / storage_models / crypto / oracles / proof_running_system / airbender / zkos-wrapper); official CTC HTML still blocked by DoraHacks “Human Verification” (last good count 47 BUIDLs / 203 hackers, deadline 13 Sep 2026 23:59 ET). No KeeperHub implementation before the 6 Sep build window. No ETHOnline project code before 4 Sep 16:00 UTC.
2026-09-03: Nexus Mutual leftover modules leftover (9e88562)
Immunefi program
Nexus Mutual
($25,000, kyc: false).
Cover / pool / staking
and Claims / Assessments /
Ramm / LimitOrders /
CoverBroker leftovers
are already logged.
This slice is leftover
modules plus TokenController,
CoverProducts, SwapOperator,
SafeTracker, and NXMToken.
Local clone
/tmp/nexusmutual at
9e88562 (“feat: symbiotic
setup and slash tests
(#1507)”). No mainnet
interaction.
Files:
contracts/modules/legacy/LegacyClaimProofs.sol,
contracts/modules/legacy/LegacyMCR.sol,
contracts/modules/legacy/LegacyAssessment.sol,
contracts/modules/legacy/LegacyClaimsData.sol,
contracts/modules/legacy/LegacyMemberRoles.sol,
contracts/modules/token/TokenController.sol,
contracts/modules/token/NXMToken.sol,
contracts/modules/cover/CoverProducts.sol,
contracts/modules/capital/SwapOperator.sol,
contracts/modules/capital/SafeTracker.sol.
Checked for: a
stranger
unstakeAllForBatch
that steals NXM;
withdrawRewards to
the caller;
mint / operatorTransfer
without a listed
module; placeOrder
without a governor
swap request;
transferAssetToSafe
from a stranger;
setProducts without
the advisory board.
Result: no user-exploitable finding. Not submitted.
LegacyClaimProofs.addProofonly emitsProofAdded.LegacyMCR.updateMCRis permissionless and only writes the MCR snapshot.updateMCRInternalisonlyInternal.LegacyAssessment.stakepulls NXM frommsg.sender.unstakepaystofrom the caller’s stake.unstakeAllForis TokenController only.unstakeAllForBatchis permissionless but always pays each listed staker, not the caller.STAKE_LOCKUP_PERIODis a view-only leftover constant and is not a theft path.withdrawRewardsmints to the staker.withdrawRewardsTomints to a destination chosen by the staker.startAssessmentisonlyInternal.castVotesisonlyMember.submitFraudis governance.processFraudneeds a stored merkle root.LegacyClaimsDatawriters areonlyInternalexceptsetUserClaimVotePausedOnandupdateUintParameters, which require governance.LegacyMemberRoles.switchMembershipmoves the caller’s NXM tonewAddress.migrateMembersonly copies already-stored members into the registry.recoverETHsends ETH to the Pool.- TokenController
operatorTransferis Cover only.burnFromis Cover / Ramm.mintis Ramm only and only to a member.switchMembershipis Registry only.withdrawNXMcallsstakingPool.withdrawwith the caller’s token ids. Ownership offers are the current manager / proposed manager. Reward and stake mint / burn / deposit / withdraw are the matching staking pool. - NXMToken
mint/operatorTransfer/ whitelist writes areonlyOperator.burnburnsmsg.sender.burnFromuses allowance. - CoverProducts
product / type
writes are
onlyAdvisoryBoard. - SwapOperator
requestAssetSwapis Governor.placeOrder/closeOrder/ Enzyme swaps /recoverAssetareonlyController. Supported recoveries go to the Pool. - SafeTracker
updateCoverReInvestmentUSDCis the Safe.transferAssetToSafeis Governor.transfer/transferFromonly emit whenamount == 0or the caller is the Pool.
Not submitted. Remaining Nexus listed GitHub: governance leftover is logged (listed Nexus Mutual GitHub leftover exhausted).
2026-09-03: Nexus Mutual governance leftover (9e88562)
Immunefi program
Nexus Mutual
($25,000, kyc: false).
Cover / pool / staking,
claims, and leftover
modules leftovers are
already logged. This
slice is governance
plus CoverNFT /
StakingNFT / viewers.
Local clone
/tmp/nexusmutual at
9e88562. No mainnet
interaction.
Files:
contracts/modules/governance/Governor.sol,
contracts/modules/governance/Registry.sol,
contracts/modules/governance/NXMaster.sol,
contracts/modules/governance/TemporaryGovernance.sol,
contracts/modules/governance/VotePower.sol,
contracts/modules/governance/Governance.sol,
contracts/modules/governance/UpgradeableProxy.sol,
contracts/modules/cover/CoverNFT.sol,
contracts/modules/cover/CoverViewer.sol,
contracts/modules/cover/CoverNFTDescriptor.sol,
contracts/modules/staking/StakingNFT.sol,
contracts/modules/assessment/AssessmentLib.sol.
Checked for: a
stranger
join without KYC
that drains the
Pool; execute that
runs unpassed
transactions;
migrate /
migrateMembers
from a random
caller; CoverNFT
mint without the
operator.
Result: no user-exploitable finding. Not submitted.
joinneeds the exactJOIN_FEEand a KYC-auth EIP-712 signature. Fee goes to the Pool.switchTomoves the caller’s membership.switchForis MemberRoles only.leaveis the member and cannot be an AB seat.- Pause propose / confirm needs two different emergency admins. Contract deploy / upgrade / add / remove and AB swap are Governor.
Registry.migrateandNXMaster.migrate/transferOwnershipToRegistryare the live GV address.migrateMembersis MemberRoles.Governor.proposeis AB.proposeAdvisoryBoardSwapis a member over the threshold.executeis permissionless after the timelock only if For > Against and quorum / threshold hold. AB execute still requires an AB caller.TemporaryGovernance.executeis the AB multisig.- Legacy
Governance.createProposalis a member.triggerActionis permissionless after Accepted + wait.rejectActionis AB. - CoverNFT
mintis operator. Transfers need owner or approval. StakingNFTmintis the matching staking pool. - VotePower, CoverViewer, CoverNFTDescriptor, and AssessmentLib are views / metadata.
Not submitted. Listed Nexus Mutual GitHub leftover is exhausted.
2026-09-03: Hydration leftover pallets leftover (672e02f)
Immunefi program
Hydration
($222,222, kyc: false).
DCA, pool, staking,
and EVM leftovers are
already logged. This
slice is leftover
listed pallets:
omnipool / XYK
liquidity-mining,
liquidation,
otc-settlements,
dispatcher, NFT,
asset-registry, and
collator-rewards.
Local sparse clone
/tmp/hydration-node
at 672e02f. No
mainnet interaction.
Files:
pallets/omnipool-liquidity-mining/src/lib.rs,
pallets/xyk-liquidity-mining/src/lib.rs,
pallets/liquidation/src/lib.rs,
pallets/otc-settlements/src/lib.rs,
pallets/dispatcher/src/lib.rs,
pallets/nft/src/lib.rs,
pallets/asset-registry/src/lib.rs,
pallets/collator-rewards/src/lib.rs,
pallets/broadcast/src/lib.rs.
Checked for: a
stranger
claim_rewards on
someone else's
deposit NFT;
liquidate that
pays the caller
from a healthy
position;
dispatch_as_treasury
from a random
origin.
Result: no user-exploitable finding. Not submitted.
- Omnipool / XYK
LM farm create is
CreateOrigin.deposit_shareslocks the signer's LP position / shares.claim_rewardsand withdraws requireensure_nft_owner. - Liquidation
liquidateis permissionless and runs the money-market liquidation path.set_borrowing_contractisAuthorityOrigin. settle_otc_orderfills through the pallet account and requires min profit.- Dispatcher treasury / Aave / emergency wrappers are their matching origins.
- NFT
mintis the collection owner.transfer/burnrequire the item owner. - Asset-registry
registerisRegistryOrigin. - Collator-rewards pays on session rotation. Broadcast is event context only.
Not submitted. Remaining Hydration listed GitHub: leftover adapters leftover is logged (listed Hydration leftover that a public tree would open is exhausted).
2026-09-03: Hydration leftover adapters leftover (672e02f)
Immunefi program
Hydration
($222,222, kyc: false).
DCA, pool, staking,
EVM, and leftover
pallets leftovers are
already logged. This
slice is leftover
listed adapters /
fees / oracle /
tx-payment /
xcm-rate-limiter.
Local sparse clone
/tmp/hydration-node
at 672e02f. No
mainnet interaction.
Files:
pallets/dynamic-fees/src/lib.rs,
pallets/dynamic-evm-fee/src/lib.rs,
pallets/ema-oracle/src/lib.rs,
pallets/transaction-multi-payment/src/lib.rs,
pallets/transaction-pause/src/lib.rs,
pallets/xcm-rate-limiter/src/lib.rs,
runtime/adapters/src/lib.rs,
runtime/adapters/src/xcm_exchange.rs,
runtime/adapters/src/price.rs.
Checked for: a
stranger
set_asset_fee or
set_external_oracle
that rewrites
prices; set_currency
that changes another
account; unsigned
dispatch_permit
without a valid
signature that
spends someone
else.
Result: no user-exploitable finding. Not submitted.
- Dynamic-fees
set_asset_fee/remove_asset_feeareAuthorityOrigin. Dynamic EVM fee has no public calls. - EMA oracle
whitelist /
register /
authorize writes
are
AuthorityOrigin.set_external_oracleneedsAuthorizedAccountsfor that(source, pair). set_currencywrites only the signer.add_currency/remove_currency/reset_payment_currencyareAcceptedCurrencyOrigin. Unsigneddispatch_permitvalidates the permit first and chargesfrom. Signeddispatch_permitis a paymaster and still validates the permit.- Transaction-pause
is
UpdateOrigin. XCM rate-limiter has no extrinsics. - Adapters are
runtime hooks.
XcmAssetExchangertrades from the configured temp account after the XCM executor depositsgive.
Not submitted. Listed Hydration leftover that a public tree would open is exhausted.
2026-09-03: Aevo ETH ChugSplash implementation leftover (Sourcify)
Immunefi program
Aevo ($300,000,
kyc: false).
Deposit leftover
already logged the
ETH
L1ChugSplashProxy
0x4082…c574 as
proxy-only. EIP-1967
implementation
0xb37a11aadf167b2f0b8dd85372de4bc66cd4a891
is now Sourcify
match L1StandardBridge
(solc 0.8.15,
verifiedAt
2026-06-17). Extract
/tmp/aevo-l1bridge.
Read-only eth_getStorageAt
on publicnode; no
other mainnet
interaction.
Files:
src/L1/L1StandardBridge.sol,
src/universal/StandardBridge.sol.
Checked for: a
stranger
finalizeBridgeETH
that pays the
caller; depositERC20
that pulls another
user without
allowance;
finalizeBridgeERC20
without the other
bridge.
Result: no user-exploitable finding. Not submitted.
depositETH/depositETHTo/bridgeETHtakemsg.valuefrom the caller.depositERC20/bridgeERC20set_fromtomsg.senderandtransferFrom/ burn that sender.finalizeBridgeETH/finalizeERC20areonlyOtherBridge(msg.senderis the messenger andxDomainMessageSenderis the other bridge). ETH pays_to. ERC20 mints or transfers to_to.initializeis initializer / proxy-admin owned.pausedreads SuperchainConfig.
Do not file messenger-trusted finalize, documented failed-L2-ETH lock, or owner pause as theft.
Not submitted. Listed Aevo leftover is exhausted.
2026-09-03: Beefy leftover remaining Polygon vaults leftover (Sourcify)
Immunefi program
Beefy Finance
($75,000, kyc: false).
First-30 Sourcify
sample leftover is
already logged. This
slice is later
Sourcify-open
Polygon vault /
strategy families
plus the six listed
zaps. Extract
/tmp/beefy-remaining.
No mainnet
interaction.
Listed Sourcify-open
this slice:
BeefyUniV2Zap
(0x540a9f99bb730631bf243a34b19fd00ba8cf315c
QuickSwap,
0x872c9dce4b107042933afd51e8a704631f7ee076
Cometh,
0xf039fe26456901f863c873556f40fb207c6c9c18
Sushi);
BeefyZapUniswapV2
(0x0ea7b115d96c4df61b3e7d6757f0050f23492929
Wault,
0xaaa3477c6b326e2e416af7506a30f4519bc9960f
ApeSwap,
0x1a53c6fca349c23f573cedd3f8afe70c02ccec39
DYFN);
StrategyAave
(0x55a10618c7e9489cee047705cd003df6d9e09195);
StrategyAaveMatic
(0x57fdeb65b71e6ad212088e63e85825e314f2ea62);
StrategyAaveSupplyOnly
(0x8f755873546f4d0edf7d41ff8604c8a632113eb7);
StrategyWexPolyLP
(0x6a440102015bf4d81d56fbc2fd4f27797d183931);
StrategyWexPolySingle
(0xcb6e386ad643a6d77c940bf69303cebd34c04757);
StrategyFish
(0x53f816063523d9883c83863cbd5d8eaf9ffc4641);
StrategyCurveAave
(0x748f243931b841f2c4d6f298abb85d7a23fe7c2a);
StrategyPolyzapLP
(0x9e75f8298e458b76382870982788988a0799195b);
StrategyRewardPoolPolygonLP;
StrategyCommonMiniChefLP;
StrategyPolygonMiniChefLP;
StrategyCommonRewardPoolLP
(exact_match
0xa7377cdb25bfa2889b6e4c9463cd0858a57ab315).
PZAP vault is
BeefyVaultV6 (already
logged).
Checked for: stranger
zap beefOut of
another depositor's
vault shares; zap
beefIn that mints
shares to the
caller without
pulling tokenIn;
strategy withdraw
/ retireStrat
without the vault;
Aave deposit /
_leverage that
borrows to a
stranger.
Result: no user-exploitable finding. Not submitted.
beefIn/beefInETHpullmsg.sender/msg.valuethen mint vault shares to that sender._getVaultPairrequires the vaultwantpair factory to match the configured router. Leftovers return tomsg.sender.beefOut/beefOutAndSwappull the caller's vault shares, burn them on the vault, and send pair tokens / the desired token to that caller.- Strategy
withdraw/retireStrataremsg.sender == vault. Publicdepositonly stakes idlewantinto the configured chef / Aave / gauge. - Aave leverage
rebalance/deleverageOnceareonlyManager. HarvestonlyEOA(or vault /tx.originon Fish / Curve harvest-on-deposit) takes the configured call fee from rewards.
Do not file first-
depositor inflation,
public deposit,
owner strat upgrade,
harvest call-fee,
zap leftover
donation, or
addLiquidity min
1,1 sandwich as a
stranger drain.
Not submitted.
Listed leftover is
the Sourcify-open
later Polygon
strategy families
and the six listed
zaps.
Remaining listed:
most wexpoly LP
strategies plus
some Aave / Cometh
addresses Sourcify
404; unsampled
vaults of already-
reviewed types.
2026-09-03: Threshold leftover wallet registry leftover (Sourcify)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
Bank / vault / watchtower /
Wormhole / RebateStaking /
validator / ReimbursementPool /
Bridge / gov-relay leftovers
are already logged. This
slice is listed Ethereum
Sourcify WalletRegistry
impl (match
0xfbae130e06bbc8ca198861beecae6e2b830398fb;
0x46d52E41C2F300BC82217Ce22b920c34995204eb
is the transparent proxy),
SortitionPool
(exact_match
0xc2731fb2823af3Efc2694c9bC86F444d5c5bb4Dc),
EcdsaDkgValidator
(exact_match
0x0125c8977a02b2Fa3970b1ED9AF02f5Bedd4eF27),
and
WalletRegistryGovernance
(exact_match
0x6aed6cC30D1b2770771052555d257Da86eD47fe8).
Extract
/tmp/threshold-wallet.
No mainnet interaction.
Files:
contracts/WalletRegistry.sol,
contracts/WalletRegistryGovernance.sol,
contracts/EcdsaDkgValidator.sol,
contracts/libraries/EcdsaAuthorization.sol,
@keep-network/sortition-pools/contracts/SortitionPool.sol.
Checked for: a
stranger
withdrawRewards that
pays the caller;
seize without the
wallet owner;
insertOperator on
the pool without
being owner;
registerOperator
for another staking
provider.
Result: no user-exploitable finding. Not submitted.
registerOperatorbindsmsg.senderas the staking provider.joinSortitionPoolis the registered operator.withdrawRewardspays the staking provider's beneficiary, not the caller.withdrawIneligibleRewardsis governance.- SortitionPool
insert / update /
lock / withdraw
are
onlyOwner(WalletRegistry).receiveApprovalpulls the reward token from the sender. requestNewWallet/closeWallet/seizeareonlyWalletOwner. Authorization increase / decrease areonlyStakingContract.- DKG submit / challenge / approve complete the stored result. Inactivity notify verifies a majority claim.
- WalletRegistryGovernance
begin / finalize
writes are
onlyOwnerand wait the stored delay.
Do not file
permissionless
withdrawRewards
(pays the
beneficiary),
governance
ineligible sweep,
or DKG timeout
refund as theft.
Not submitted.
Remaining Threshold
listed leftover:
keep-network/tbtc-v2
typescript and
Starknet / Sui /
Solana explorer
rows.
2026-09-03: RootstockLabs RIF token leftover (Sourcify)
Immunefi program
RootstockLabs
($200,000, kyc: true).
Unique listed SC added
2026-09-03. Rootstock
Sourcify match
RIFToken
0x2aCc95758f8b5F583470bA265Eb685a8f45fC9D5.
Extract /tmp/rif-token.
No mainnet interaction.
Files:
RIFToken.sol.
Checked for: a
stranger
redeem that moves
another contributor
without that
contributor's
signature;
transferFrom
without allowance;
setAuthorizedManagerContract
by a non-owner after
the manager is set.
Result: no user-exploitable finding. Not submitted.
- Fixed supply is
minted to the
token then moved
once to the
authorized manager.
setAuthorizedManagerContractisonlyOwnerand only while the manager is still zero. transferToContributor/transferToShareholder/transferBonus/delegateare manager-only.redeemrequires an original contributor, an unused destination, andacceptLinkedRskAddressfor that contributor.contingentRedeemisonlyOwnerplus a DELEGATION signature.transfer/transferFrom/approvespend the caller or allowance after distribution.transferAndCallis the caller's ERC-677 send.
Do not file ERC-20
approve race,
ERC-677 callback on
a user-chosen _to,
owner
contingentRedeem,
or unredeemed
contributor lock as
a stranger drain.
Not submitted. Remaining listed: PegIn / PegOut / Collateral / Flyover / Pause / Quotes / BtcUtils / SignatureValidator (2026-07-03 rows) plus GitHub DLT / web assets (KYC).
2026-09-03: Synthetix deposit leftover (Blockscout)
Immunefi program
Synthetix
($100,000, kyc: false).
Unique no-KYC listed
Ethereum slice.
Sourcify has no
match on the three
listed proxies.
Blockscout verified
SynthetixDepositContract
impl
0xff6611190b48Cc920EF3c5DCbD356bF2C20D731F
behind
0xD62595c3c23B690BAEE0935e107A209Cb1Dbd37B,
SynthetixDepositContractLens
0x99E61877aF9Bc6805BCc3813F655D94Ed5f3782A,
and
PermissionsRegistry
impl
0xF06E7b50A214D8437221BAADD04e0878F232db5e
behind
0x45F91031b33Da2585932c8f1cdFF0faa6cD329ae.
Extract
/tmp/synthetix-src.
No mainnet
interaction.
Files:
src/SynthetixDepositContract.sol,
src/SynthetixDepositContractLens.sol,
src/PermissionsRegistry.sol,
src/libraries/CowProtocol.sol.
Checked for: a
stranger
deposit that pulls
another owner
without allowance
or that owner's
Permit2; a
permissionless
requestWithdrawal
or disburse that
pays the caller;
cancelWithdrawal
of another user's
request; ERC-1271
isValidSignature
that lets a stranger
settle CoW against
custody; registry
grants that mutate
another owner's
delegatees.
Result: no user-exploitable finding. Not submitted.
depositpullsmsg.senderviasafeTransferFromor Permit2 (owneris the caller). Credit goes tobeneficiary.requestWithdrawalisRELAYER_ROLE. The request user isentry.beneficiary.disburseWithdrawalsisTELLER_ROLEandsafeTransfers to that user, not the caller.cancelWithdrawalrequiresreq.user == msg.sender. Reject / dispute / watcher vote / guardian resolve are role-gated.- CoW
isValidSignaturerequires anAUTHORIZED_TRADER_ROLEEOA, sell collateral, buy USDT, andreceiver == address(this). VaultRelayer / SLP approvals areOWNER_ROLE. - Lens is view-only.
PermissionsRegistry
_grant/_revokebindmsg.senderas owner. Contract owner can only pause / upgrade.
Do not file
relayer-created
withdrawals, negative
internal balances,
guardian limit == 0
(no cap), or CoW
appData / kind
trust as stranger
theft.
Not submitted. Listed Synthetix leftover is exhausted at the three Immunefi Ethereum addresses. Remaining unused no-KYC docs / audit-comp rows: Sushi (docs-only deployments), DeGate and IDEX 2024 audit comps (testnet / closed window).
2026-09-03: Pareto Credit leftover factory leftover (19e7cde)
Immunefi program
Pareto Credit ($50,000,
kyc: false). IdleCDO
request-claim, strategy,
epoch admin, and queue /
Prefunded leftovers are
already logged. This
slice is the remaining
credit-vault factory,
write-off escrow,
manager orchestrator,
implied-price helper,
and programmable
borrower on the official
clone /tmp/idle-tranches
at 19e7cde. No mainnet
interaction.
Files:
contracts/IdleCreditVaultFactory.sol,
contracts/IdleCreditVaultWriteOffEscrow.sol,
contracts/IdleCreditVaultManagerOrchestrator.sol,
contracts/IdleCreditVaultImpliedPrice.sol,
contracts/strategies/idle/ProgrammableBorrower.sol.
Checked for: a
stranger factory
deployCreditVault that
mints into an existing
vault; write-off
fullfillWriteOffRequest
that pays another user's
request without paying
underlyings; orchestrator
startEpoch /
stopEpochWithDuration
that drains to the
caller; programmable
borrow that sends
funds to the caller
instead of the borrower.
Result: no user-exploitable finding. Not submitted.
- Factory
deployCreditVault/deployRevolvingCreditVaultdeploy new proxies only. Strategy and CDO ownership move totreasury.setFeeSplitis treasury-only. Factory never mints strategy tokens. - Write-off
createWriteOffRequestpulls the caller's tranche tokens.deleteWriteOffRequestreturns that caller's tranches.fullfillWriteOffRequestpulls underlyings from the fulfiller, pays the listed lender minus exit fee, and sends escrowed tranches to the fulfiller. - Orchestrator
startEpoch/stopEpochWithDuration/ queue process / APR / transfer flags are operator or owner and only for allowlisted CDOs. No payout to the caller. - Implied price is a view helper.
- Programmable
onStartEpoch/onStopEpoch/settleBorrowerInterest/onDefaultare CDO-only.borrow/repayare the configured borrower.executeBorrow/executeRepayare authorized executors but still pay / pull the borrower.
Do not file
permissionless new
vault deploy, owner
write-off
emergencyWithdraw,
operator epoch
control, borrower
draw of reserved
liquidity, or
Keyring allowlist as
theft.
Not submitted.
Listed leftover is
the factory /
write-off /
orchestrator /
implied-price /
programmable
borrower slice.
Remaining listed:
TrancheWrapper /
IdleTokenWrapper /
Keyring whitelist,
proxy
implementations not
independently
Sourcify-fetched,
and other docs
addresses.
2026-09-03: Aspida leftover (Sourcify)
Immunefi program
Aspida
($50,000, kyc: false).
Unique no-KYC listed
Ethereum slice.
Sourcify
exact_match on the
five listed
TransparentUpgradeableProxy
rows. Blockscout
implementations:
aETH
0x5f898DC62d699ecBeD578E4A9bEf46009EA8424b
behind
0xFC87753Df5Ef5C368b5FBA8D4C5043b77e8C5b39,
saETH
0xc69809947E6EDaf21fF7F2e3784727a15a09DE3d
behind
0xF1617882A71467534D14EEe865922de1395c9E89,
CorePrimary
0x55b6aF0e89eAd974a80b70C5B30589B088113e24
behind
0x5341864D99B50155F782C562Bd15Ac4a0A3C117e,
RewardOracle
0xD3aFE58031998EAf2b0cCeE76dBd8ca50B19DCCa
behind
0xD691b1c47a578f51aDa825A8565cAfceB401EdaC,
StETHMinter
0x76a444fa85d8DA2209D45c6f89D7f51b54FcdDF9
behind
0x25a01dBde45cc5Bb7071EB3c3b2F983ea923bec5.
Extract
/tmp/aspida-impl.
No mainnet
interaction.
Files:
contracts/aETH.sol,
contracts/saETH.sol,
contracts/CorePrimary.sol,
contracts/RewardOracle.sol,
contracts/StETHMinter.sol,
contracts/core/Submit.sol,
contracts/core/WithdrawalQueue.sol,
contracts/strategy/model/aETHMinter.sol.
Checked for: a
stranger
minterMint of aETH
with cap 0;
submit that mints
without ETH;
withdraw /
claim of another
user's queue;
StETH deposit that
pulls another owner
without allowance;
submitEpochReward
by a random caller.
Result: no user-exploitable finding. Not submitted.
aETH.mintisonlyManager.minterMintrequiresmintAmounts + amount <= mintCaps(default cap 0).minterBurnburns the caller.burnFromis manager-only and spends allowance when the account is not the caller.submit/submit(address)mint aETH formsg.value.submitAndStakemints to the core then deposits into saETH for_receiver.- Core
withdraw/withdrawWithPermitburn the caller's aETH (permit owner ismsg.sender) and queue that sender.claimusesuserQueueIds_[msg.sender]. - saETH is ERC-4626
sync.depositWithPermitpermits the caller.withdraw/redeemuse OZ allowance whenowner != caller. - StETHMinter
deposit/depositWithPermitsafeTransferFromthe caller andminterMintto the chosen receiver. deposit/depositCheckareonlyManager.supplyRewardisonlyRewardOracle.submitEpochRewardisonlyManager.
Do not file
owner
_transferOut,
manager beacon
deposits, or
reward-oracle mint
as stranger theft.
Not submitted. Listed Aspida leftover is exhausted at the five Immunefi Ethereum addresses.
2026-09-03: Balancer Foundation leftover V2 Vault + V3 BatchRouter (Sourcify)
Immunefi program
Balancer Foundation
($1,000,000, kyc: false).
V3 Router /
CompositeLiquidityRouter
/ ProtocolFeeController
/ factory leftovers are
already logged (23 Jun
slice exhausted; Jan
2025 BatchRouter /
BufferRouter rows were
left). This slice is
the Foundation-listed
V2 Vault + Authorizer
- AuthorizerAdaptor +
BatchRelayerLibrary and
the Sourcify-open V3
BatchRouter. Official V2 clone/tmp/balancer-v2-monorepoate91a2b6. Blockscout extract/tmp/bal-found. No mainnet interaction.
Listed this slice:
V2 Vault
0xBA12222222228d8Ba445958a75a0704d566BF2C8,
V2 Authorizer
0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6,
AuthorizerAdaptor
0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75,
BatchRelayerLibrary
0xeA66501dF1A00261E3bB79D1E90444fc6A186B62,
V3 BatchRouter
0x136f1EFcC3f8f88516B9E94110D56FDBfB1778d1.
Files:
pkg/vault/contracts/{Vault,Swaps,PoolBalances,UserBalance,FlashLoans,VaultAuthorization}.sol,
contracts/BatchRouter.sol,
contracts/BatchRouterCommon.sol,
contracts/admin/AuthorizerAdaptor.sol,
contracts/vault/Authorizer.sol,
contracts/BatchRelayerLibrary.sol.
Checked for: a
stranger
swap / joinPool /
exitPool /
manageUserBalance
that spends another
user without relayer
approval; a
flashLoan that
keeps Vault tokens;
BatchRouter
swapExactIn that
settles to the
caller instead of
the sender;
performAction
without Authorizer
permission.
Result: no user-exploitable finding. Not submitted.
- V2
swap/batchSwapuseauthenticateFor(funds.sender).joinPool/exitPooluseauthenticateFor(sender)inside_joinOrExit. Relayers also need per-usersetRelayerApprovalor a signed extra calldata permit. manageUserBalancevalidates each opsenderthe same way. Internal withdraw / transfer debit that sender.flashLoanpays the recipient then requirespost >= preand fee. Tokens stay in the Vault.- V3 BatchRouter
swapExactIn/swapExactOutpasssender: msg.senderinto the Vault unlock hook._settlePaths_takeTokenIn/_sendTokenOut/_returnEththat sender. Hooks areonlyVault. - Authorizer
grantRoleis OZ AccessControl. AdaptorperformActioncheckscanPerformon the inner selector + target. - BatchRelayerLibrary is not a relayer by itself; calls go through the entrypoint after Vault relayer approval.
Do not file
approved-relayer
spends, flash-loan
recipient hooks, or
governance
setAuthorizer as
stranger theft.
Not submitted.
Remaining
Foundation-listed:
V3 Vault
0xbA1333333333a1BA1108E8412f11850A5C319bA9
and the other
listed routers /
helpers not opened
this slice.
2026-09-03: Threshold leftover StarkNet depositor leftover (502cd39)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
WalletRegistry /
SortitionPool leftovers
are already logged.
This slice is listed
Ethereum
StarkNetBitcoinDepositor
proxy
0xC9031f76006da0BD4bFa9E02aDf0d448dB3BC155
(Sourcify
TransparentUpgradeableProxy)
and impl
0xd3585922b7f6b30953fc81726f48046826b8b2ca
(Sourcify
exact_match
StarkNetBitcoinDepositor).
Official clone
/tmp/threshold-tbtc
at 502cd39. Listed
0x2111A49ebb717959059693a3698872a0aE9866b9
is official StarkGate
ProxyV5, not
Threshold source.
Read-only
eth_getStorageAt
for the impl slot.
No other mainnet
interaction.
Files:
solidity/contracts/cross-chain/starknet/StarkNetBitcoinDepositor.sol,
solidity/contracts/cross-chain/starknet/interfaces/IStarkGateBridge.sol.
Checked for: a
stranger
finalizeDeposit
that bridges minted
tBTC to the caller
instead of the
Bitcoin-script
extraData owner;
_transferTbtc
that approves the
caller; initialize
that rebinds another
deposit's L2 owner.
Result: no user-exploitable finding. Not submitted.
- Parent
initializeDeposit/finalizeDeposit(already logged in the Wormhole L1 leftover) bind extraData in the Bitcoin script and one-shot Initialized → Finalized. - StarkNet
_transferTbtcrequiresmsg.value >= estimateFee(), rejects a zero L2 recipient, anddeposits tBTC tostarkGateBridgeforuint256(destinationChainReceiver). Relayermsg.senderis not the L2 owner. Excessmsg.valueis forwarded to StarkGate (no refund). - Gas reimbursements pay the recorded initialize receiver and an authorized finalize caller from the pool, not user tBTC.
Do not file
permissionless
finalize (relayer
path), leftover
bridge fee, owner
gas-offset writes,
or official
StarkGate ProxyV5
as Threshold theft.
Not submitted.
Listed leftover is
the Ethereum
StarkNet depositor
impl. Remaining
Threshold listed:
keep-network/tbtc-v2
typescript, Starkscan
Cairo rows, and Sui /
Solana explorer
rows.
2026-09-03: Balancer Foundation leftover V3 Vault (Sourcify)
Immunefi program
Balancer Foundation
($1,000,000, kyc: false).
V2 Vault + V3
BatchRouter leftover
already logged. This
slice is the listed
V3 Vault singleton
0xbA1333333333a1BA1108E8412f11850A5C319bA9.
Sourcify
exact_match. Official
clone
/tmp/balancer-v3-monorepo
at 449f7e0. Blockscout
extract
/tmp/bal-found/src/bA1333….
No mainnet interaction.
Files:
contracts/Vault.sol,
contracts/VaultCommon.sol,
contracts/token/ERC20MultiToken.sol.
Checked for: a
stranger
sendTo that pays
the caller without
credit; settle
that credits unsent
reserves as theft;
removeLiquidity
that burns another
owner's BPT without
allowance;
transfer that
moves another pool's
BPT by calling the
Vault directly.
Result: no user-exploitable finding. Not submitted.
unlockistransientand calls backmsg.sender. Non-zero token deltas revertBalanceNotSettled.settlecredits the unlocker from the reserve increase, capped byamountHint.sendTotakes debt from that same unlocker then transfers.swap/addLiquidity/removeLiquidity/erc4626BufferWrapOrUnwrapareonlyWhenUnlocked. Swap debtstokenInand creditstokenOutto the unlocker.- Add liquidity
mints BPT to
params.to. Remove spends allowance (from,msg.sender) then burnsparams.from. - Vault
transfer/transferFromkey balances bymsg.senderas the pool token. Only that pool contract can move its BPT.
Do not file router-mediated user pulls, hook reentrancy that still settles, or query-mode balance increase as stranger theft.
Not submitted. Remaining Foundation-listed: the other unopened routers / helpers after Vault + BatchRouter (e.g. later listed factory / fee / buffer rows).
2026-09-03: Balancer Foundation leftover VaultAdmin / Extension / BufferRouter (Sourcify)
Immunefi program
Balancer Foundation
($1,000,000, kyc: false).
V2 Vault, V3 Vault,
and V3 BatchRouter
leftovers already
logged. V3 Router
0xAE56…8Ea2,
CompositeLiquidityRouter,
ProtocolFeeController,
and the 23 Jun factory
set are already logged.
This slice is the
remaining Foundation
money-path helpers:
VaultAdmin
0x35fFB749B273bEb20F40f35EdeB805012C539864,
VaultExtension
0x0E8B07657D719B86e06bF0806D6729e3D528C9A9,
BufferRouter
0x9179C06629ef7f17Cb5759F501D89997FE0E7b45,
and V2
BalancerRelayer
0x35Cea9e57A393ac66Aaa7E25C391D52C74B5648f.
Sourcify
exact_match. Extract
/tmp/bal-found2. Clone
/tmp/balancer-v3-monorepo
at 449f7e0. No mainnet
interaction.
Files:
contracts/VaultAdmin.sol,
contracts/VaultExtension.sol,
contracts/BufferRouter.sol,
contracts/relayer/BalancerRelayer.sol.
Checked for: a
stranger
removeLiquidityFromBuffer
that burns another
owner's shares;
addLiquidityToBuffer
that pulls another
user without Permit2;
removeLiquidityRecovery
that burns without
allowance;
collectAggregateFees
by a random caller;
relayer multicall
that spends a user
without Vault relayer
approval.
Result: no user-exploitable finding. Not submitted.
- VaultAdmin
pause / query /
buffer pause are
authenticate.collectAggregateFeesisonlyProtocolFeeController. Buffer init / add areonlyWhenUnlockedand take debt from the unlocker.removeLiquidityFromBufferforwardsmsg.senderassharesOwnerand burns that owner's shares. - BufferRouter
init / add pass
msg.senderas sharesOwner. Hooks areonlyVaultand_takeTokenInthat owner. Queries usequoteand do not settle to a stranger. - VaultExtension
initializeisonlyWhenUnlockedand mints BPT totoafter taking debt. Recovery exit spends allowance (from,msg.sender) then burnsfrom. - BalancerRelayer
multicalldelegatecalls the library and refunds leftover ETH tomsg.sender. Vault still requires per-user relayer approval. ETHreceiveis Vault-only.
Do not file governance pause, protocol-fee controller collect, or query-mode share increase as stranger theft.
Not submitted. Listed Balancer Foundation leftover is exhausted at the opened-contract level (Vault / routers / admin / extension / buffer / relayer / already-logged factories).
2026-09-03: Pareto Credit leftover wrappers leftover (19e7cde)
Immunefi program
Pareto Credit ($50,000,
kyc: false). IdleCDO
request-claim, strategy,
epoch admin, queue, and
factory leftovers are
already logged. This
slice is the remaining
4626 wrappers and
Keyring whitelist on
the official clone
/tmp/idle-tranches at
19e7cde. No mainnet
interaction.
Files:
contracts/TrancheWrapper.sol,
contracts/IdleTokenWrapper.sol,
contracts/TrancheWrapperWSTETHBalancer.sol,
contracts/KeyringIdleWhitelist.sol.
Checked for: a
stranger
deposit that mints
without pulling the
caller; withdraw /
redeem that burns
another owner
without allowance;
wstETH wrap that
pays a stranger;
Keyring whitelist
mutation by a
non-admin.
Result: no user-exploitable finding. Not submitted.
TrancheWrapper/IdleTokenWrapperdeposit/mintpullmsg.senderand mint wrapper shares toreceiver.withdraw/redeemburnownerwith allowance whenowner != callerand payreceiver.- wstETH Balancer
variant unwraps
the caller's
wstETH to stETH
before
depositAA/depositBB, then wraps stETH back to wstETH on redeem forreceiver. - Keyring
setWhitelistStatus/changeAdminare admin-only.checkCredentialis a view.
Do not file ERC-4626 receiver mint, allowance redeem, wstETH wrap rounding, or Keyring allowlist as theft.
Not submitted. Listed leftover is the wrapper / Keyring slice. Remaining listed: proxy implementations not independently Sourcify-fetched, and other docs addresses.
2026-09-03: RootstockLabs leftover PegIn / PegOut / Collateral (Blockscout)
Immunefi program
RootstockLabs
($200,000, kyc: true).
RIF token leftover is
already logged. This
slice is the remaining
listed Flyover money
path: PegIn /
PegOut /
CollateralManagement
proxies plus
FlyoverDiscovery /
PauseRegistry /
Quotes / BtcUtils /
SignatureValidator.
Sourcify has no
match on the proxies.
Rootstock Blockscout
implementations:
PegInContract
0x2aA0F7054066319A97E077Ab7Ce27B0f8b1dc002
behind
0x9270733402dc7c5730ea24268fc11039fd75e189,
PegOutContract
0xe8F4a2c1Db0B7E8081287aA42f37956dcea4B9a2
behind
0x9a0678742cfb567874eb4e99df2106bded78f5e4,
CollateralManagementContract
0xC9Aab2407E14d412d7aF35dfcb1360917551EC1F
behind
0xbe4d93b3afd9921cac66704ffd3caf662886fb73,
FlyoverDiscovery
0x1b5B100B7CaAca4E4eB56acF0290588bB887a495
behind
0x9a48c6b18aa000d0bd35d55616bcc98ad3553e7a,
PauseRegistry
0x179A7A091c43b272ec6a2270E1695aB91e70212F
behind
0xb2c65bbf276cc5ccae73c0ab29b609a129080639.
Libraries
Quotes
0xAAFF2c6D3185ccd03d9781e689005c314b936AC1,
BtcUtils
0xd8D956312222d8acaBB58569cc960a93b1aa2f7a,
SignatureValidator
0xB0824559dF4a0872A61b228466bAd12E733f7dEC.
Extract /tmp/rsk-impl.
No mainnet
interaction.
Files:
PegInContract,
PegOutContract,
CollateralManagementContract.
Checked for: a
stranger
withdraw that
pays another
provider's balance;
refundUserPegOut
that pays the
caller; registerPegIn
that mints without
a bridge result;
slash* by a
non-slasher;
collateral withdraw
before resign delay.
Result: no user-exploitable finding. Not submitted.
- PegIn
deposit/callForUserare registered LPs.withdrawpaysmsg.senderfrom that sender's_balances.registerPegInrequires a signed quote and a bridge register result; slash punisher is the caller. - PegOut
depositPegOuttakesmsg.value, verifies the LP EIP-712 signature, and refunds change toquote.rskRefundAddress.refundPegOutpaysquote.lpRskAddressafter a validated BTC proof.refundUserPegOutafter expiry paysrskRefundAddress, not the caller.withdrawdebits the caller. - Collateral
slashPegIn/slashPegOutareCOLLATERAL_SLASHER. Rewards / collateral withdraw debitmsg.senderafter resign delay. - Quotes / BtcUtils /
SignatureValidator
are libraries.
PauseRegistry is
pause state.
FlyoverDiscovery
registeris provider onboarding.
Do not file
permissionless
expired-quote
refund (pays the
quote refund
address), LP
callForUser, or
slasher reward as
stranger theft.
Not submitted. Payment requires user KYC. Listed Rootstock Flyover leftover is exhausted at the opened-contract level. Remaining listed: GitHub DLT / web assets (KYC).
2026-09-03: Pareto Credit leftover Fulcrum leftover (Sourcify)
Immunefi program
Pareto Credit ($50,000,
kyc: false). Official
clone leftovers through
wrappers are already
logged. This slice is
the remaining listed
docs vault-address
page: EIP-1967 impls
behind live Ethereum
vault / queue /
strategy proxies, plus
the one Sourcify-open
docs address that is
not that family.
Read-only
eth_getStorageAt for
impl slots. No other
mainnet interaction.
Extract
/tmp/idle-fulcrum.
Live impls Sourcify-
open as already-
reviewed types:
IdleCDOEpochVariant
(0xdd59…a18d,
0x6de6…a53f,
0xf70e…8754),
IdleCreditVault
(0x5557…a4a7,
0x6256…e489,
0xc499…855a),
IdleCDOEpochQueue
(0x49ba…1933,
0xc05b…14e4,
0x420d…2057),
and IdleCDOTranche
(0x4505…85bE and
siblings). Unique
new file is
IdleFulcrumV2
0x463465c334742D72907CA5fB97db44688B4EC3dC
(Sourcify match).
Files:
IdleFulcrumV2.sol.
Checked for: a
stranger mint that
credits the caller
without being
IdleToken; redeem
that pays an
arbitrary account
without onlyIdle.
Result: no user-exploitable finding. Not submitted.
mint/redeemareonlyIdle.mintspends this contract's underlying and Fulcrum-mints iTokens tomsg.sender(IdleToken).redeemburns this contract's iTokens to_account.setIdleTokenisonlyOwnerand once. Remaining methods are views.
Do not file owner IdleToken bind, Fulcrum liquidity require, or same- bytecode live CDO / queue / strategy impls as a new finding.
Not submitted. Listed leftover is the docs-page Fulcrum adapter and the confirmation that live vault proxy impls match already-reviewed types. Remaining listed: Sourcify 404 docs addresses and other docs rows.
2026-09-03: CapyFi Comptroller / CEther / CErc20 leftover (Sourcify)
Immunefi program
CapyFi
($1,000,000, kyc: true).
Unique unused standing
program. Not previously
logged. Ethereum
Sourcify exact_match
on Comptroller
0x00dc4965916e03A734190fA382633657c71f867E,
CEther caETH
0x37DE57183491Fa9745d8Fa5DCd950f0c3a4645c9,
CErc20Delegator markets
caUSDC / caUSDT /
caWBTC / caRPC /
caWARS / caLAC, and
CErc20Delegate
0x0f1adffffd84749e816066348d4c1256d285965f
behind caUSDC.
Unitroller
0x0b9af1fd73885aD52680A1aeAa7A3f17AC702afA
is Sourcify 404; its
admin / fallback source
is in the Comptroller
extract. Read-only
eth_call on
https://ethereum.publicnode.com
and
https://rpc.mevblocker.io
(no writes). Extract
/tmp/capyfi-src.
Files:
src/contracts/Comptroller.sol,
src/contracts/Unitroller.sol,
src/contracts/CToken.sol,
src/contracts/CEther.sol,
src/contracts/CErc20.sol,
src/contracts/CErc20Delegate.sol,
src/contracts/CErc20Delegator.sol,
src/contracts/Access/WhitelistAccess.sol.
Checked for: a
stranger mint that
credits the caller
without pulling that
caller; redeem /
borrow that pays the
caller from another
account's cTokens;
seize that accepts a
spoofed seizer token;
_setWhitelist by a
non-admin.
Result: no user-exploitable finding. Not submitted.
- Comptroller
enterMarketsonly addsmsg.sender.mintAllowedis listed + not paused.borrowAllowedauto-enters only whenmsg.senderis the cToken, reverts on a zero oracle price, and requires no hypothetical shortfall.liquidateBorrowAllowedneeds shortfall (unless the market is deprecated) and a close-factor cap.seizeAllowedrequires both markets listed and the same Comptroller._setPriceOracle/_supportMarket/_setCollateralFactor/_become/ pause / borrow-cap setters are admin or named guardians. CToken.mintInternalis_checkWhitelist(msg.sender)thenmintFreshfor that sender.doTransferInon CErc20transferFroms the minter; CEther requiresmsg.sender == fromandmsg.value == amount. Redeem burns the redeemer's tokens and pays that redeemer. Borrow pays the borrower after a liquidity check. Repay pulls the payer.seizepassesmsg.senderas the seizer cToken. Transfer spends allowance whenspender != src._setWhitelistrequires admin andisWhitelistAccess(). The modifier is a no-op when whitelist is unset or inactive._setImplementation/_becomeImplementationare admin. Unitroller pending-impl / pending-admin accept is the pending address.
Do not file first- depositor exchange-rate inflation, admin / pause-guardian privilege, optional mint whitelist, or permissionless liquidation of an undercollateralized account as theft.
Not submitted. Payment requires user KYC. Listed CapyFi Comptroller / CEther / CErc20 leftover is exhausted at the opened-contract level. Remaining listed: Unitroller proxy (Sourcify 404) and other-market CErc20Delegate implementations not independently Sourcify-fetched (same CErc20Delegate type as caUSDC). The listed website is out of this slice.
2026-09-03: Threshold leftover L2 Wormhole gateway leftover (Sourcify)
Immunefi program
thresholdnetwork
($150,000, kyc: false).
StarkNet depositor /
WalletRegistry leftovers
are already logged.
This slice is listed
Optimism / Base /
Arbitrum / Polygon
Wormhole L2 proxies.
Official clone
/tmp/threshold-tbtc
at 502cd39. Sourcify
extract /tmp/threshold-l2.
No mainnet interaction
beyond Sourcify
proxyResolution.
Listed this slice:
OP
0x1293…A15458 →
L2WormholeGateway
0xC08d…e5FdA6,
OP
0x6c84…dE40 →
L2TBTC
0xDa53…f681365,
Base
0xe931…d88B →
L2BTCRedeemerWormhole
0x7926…7AEA2E,
Base
0x236a…794b →
L2TBTC
0x41C9…d91A,
Base
0x0995…99eab →
BaseWormholeGatewayUpgraded
0x40fa…05A0c,
Arb
0x1293…A15458 →
ArbitrumWormholeGatewayUpgraded
0x7Ff0…eb9a5,
Arb
0xd7Cd…34D9b7 →
L2BTCRedeemerWormhole
0x03E3…ee0F6,
Arb
0x6c84…dE40 →
L2TBTC
0xDa53…f681365,
Polygon
0x236a…794b →
L2TBTC
0x41C9…d91A,
Polygon
0x0995…99eab →
L2WormholeGateway
0x0467…c197.
Listed etherscan
0x03E3…ee0F6
is that Arb redeemer
impl checksum.
Files:
L2TBTC.sol,
L2WormholeGateway.sol,
L2BTCRedeemerWormhole.sol,
BaseWormholeGatewayUpgraded.sol,
ArbitrumWormholeGatewayUpgraded.sol.
Checked for: a
stranger receiveTbtc
that mints to the
caller; sendTbtc
that burns another
account; redeemer
requestRedemption
that pays the caller
BTC script; upgraded
gateway override that
skips burnFrom.
Result: no user-exploitable finding. Not submitted.
L2TBTC.mintisonlyMinter(same type already logged in the BOB leftover).burn/burnFromare holder / allowance.recover*is owner. Guardian pause.L2WormholeGateway.sendTbtcburnFromsmsg.sender, then Token-Bridge transfers wormhole tBTC to the dest gateway or recipient.receiveTbtcmeasuresbridgeTokendelta aftercompleteTransferWithPayloadand mints (or, overmintingLimit, transfers wormhole tBTC) to the payload receiver, not the caller. Token Bridge VAA replay plusnonReentrant.sendTbtcWithPayloadToNativeChain(clone + Base/Arb upgraded child) requires no dest gateway, then the same burn-and-send.L2BTCRedeemerWormhole.requestRedemptionpulls tBTC frommsg.sender, approves the gateway, and sends the Bitcoin output script as payload to the configured L1 redeemer. It does not mint.
Do not file owner gateway / limit updates, guardian pause, minting-limit wormhole-tBTC fallback, or the "testing purposes" comment on the live upgraded child impls.
Not submitted. Listed leftover is the Sourcify-open L2 Wormhole gateway / L2TBTC / L2 redeemer proxies. Remaining listed: keep-network typescript, Starkscan Cairo, and Sui / Solana explorer rows.
2026-09-03: Kelp DAO deposit / withdraw leftover (Sourcify)
Immunefi program
Kelp DAO
($250,000, kyc: true).
Unique unused standing
program. Not previously
logged. Ethereum
Sourcify proxies are
TransparentUpgradeableProxy
(match). Implementations
are exact_match /
match: LRTConfig
0xd4F475A7DF199b3106F622A3A825Ff399D4dafCe
behind
0x947Cb49334e6571ccBFEF1f1f1178d8469D65ec7,
RSETH
0x7159107483e623707C18C6E06cBc095bd0717783
behind
0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7,
LRTDepositPool
0xEA38dFa108318288f36F13d06e821a64AcDA8320
behind
0x036676389e48133B63a802f8635AD39E752D375D,
LRTOracle
0xC59110239240761cCd3E670288443316e10Dd271
behind
0x349A73444b1a310BAe67ef67973022020d70020d,
EthXPriceOracle
0x3f258821a5ad28391e9Bb0B69A705fdf545BCab0
behind
0x3D08ccb47ccCde84755924ED6B0642F9aB30dFd2,
FeeReceiver
0x868ceF33E29bF3037b5d4CF5C408EAEF29d96b33
behind
0xdbc3363de051550d122d9c623cbaff441afb477c,
LRTConverter
0x70dAf8B0BFc846cc98b71D2F8FfdC91f4D2bbd51
behind
0x598dbcb99711e5577ff76ef4577417197b939dfa,
LRTWithdrawalManager
0x0eCde3F414D1A245246D121e37191d9a63684E19
behind
0x62De59c08eB5dAE4b7E6F7a8cAd3006d6965ec16,
LRTUnstakingVault
0x1fC8eEBd7E1E61cc2CCa005Ee0F0d08417E5a2a4
behind
0xc66830e2667bc740c0bed9a71f18b14b8c8184ba,
NodeDelegator
0x50F88fBbc50629b8B37F68C4dC28f712A8bf679b
behind
0x07b96cf1183c9bff2e43acf0e547a8c4e4429473.
No mainnet writes.
Extract /tmp/kelp-impl.
Files:
contracts/LRTDepositPool.sol,
contracts/RSETH.sol,
contracts/LRTWithdrawalManager.sol,
contracts/LRTUnstakingVault.sol,
contracts/LRTConverter.sol,
contracts/NodeDelegator.sol,
contracts/FeeReceiver.sol,
contracts/LRTOracle.sol,
contracts/LRTConfig.sol.
Checked for: a
stranger deposit that
mints rsETH without
pulling the caller;
initiateWithdrawal
that burns another
user's rsETH;
completeWithdrawal
that pays a stranger
the queued amount;
redeem of the
unstaking vault by a
random caller;
mint / burnFrom
without a role.
Result: no user-exploitable finding. Not submitted.
depositETH/depositAssetpullmsg.valueorsafeTransferFrommsg.sender, thenmintrsETH tomsg.sender. Transfers to NDC / unstaking vault areonlyAssetTransferRole. Operator LST/ETH swaps pull the operator and pay that operator.- rsETH
mintisMINTER_ROLE+ daily cap.burnFromisBURNER_ROLE. initiateWithdrawalpulls rsETH frommsg.senderand queues that sender.completeWithdrawalpays the named request user after unlock + delay.instantWithdrawalburns the caller's rsETH and pays that caller minus fee.- Vault
redeemisonlyLRTWithdrawalManager. NodeDelegatorcompleteUnstakingisonlyLRTOperatorand requireswithdrawal.staker == address(this). - Converter claims
are operator.
FeeReceiver
sendFundsforwards ETH to the deposit pool. Oracle asset setters are admin.updateRSETHPriceis a computed refresh.
Do not file first-
depositor share
inflation, operator /
manager privilege,
the documented
last-asset slash
edge, manager-set
instant-withdraw
fee, or the ETH
deposit-limit check
that compares TVL
without adding the
current msg.value
as stranger theft.
Not submitted. Payment requires user KYC. Listed Kelp DAO deposit / withdraw leftover is exhausted at the opened-contract level. Remaining listed: the website Restaking page.
2026-09-03: Aera Base vault leftover (Sourcify)
Immunefi program
Aera
($500,000, kyc: true).
Unique unused standing
program. Not previously
logged. Base chain
8453 Sourcify match
on the five listed
contracts (no proxy
resolution):
TransferBlacklistHook
0x6e5430C10fce10e5c6F67dC54506e4564dD7A6E5,
PriceAndFeeCalculator
0x69dd4d44eed6bbc33b8a0bdfe17897ab9044372e,
MultiDepositorVault
0x000000000001CdB57E58Fa75Fe420a0f4D6640D5,
Provisioner
0x18cf8d963e1a727f9bbf3aeffa0bd04fb4dbda07,
Whitelist
0xdDfd960a7150520548dD1F6E53CC2f201b364692.
No mainnet writes.
Extract /tmp/aera-src.
Files:
src/core/MultiDepositorVault.sol,
src/core/Provisioner.sol,
src/core/PriceAndFeeCalculator.sol,
src/core/Whitelist.sol,
src/periphery/hooks/transfer/TransferBlacklistHook.sol.
Checked for: a
stranger enter that
mints units without
pulling the sender;
exit that burns
another user's units
without the
provisioner;
requestDeposit /
requestRedeem that
credit a stranger;
refundRequest that
pays the solver the
queued tokens;
setWhitelisted by
a random caller.
Result: no user-exploitable finding. Not submitted.
- Vault
enter/exitareonlyProvisioner.enterpullstokenfromsenderand mints units torecipient.exitburnssenderand paysrecipient.setProvisioner/ hook setter arerequiresAuth. - Sync
deposit/mintconvert via the price calculator, then_syncDepositcallsenter(msg.sender, …, msg.sender).refundDepositisrequiresAuthand returns tokens to the original sender. requestDepositpulls tokens frommsg.sender.requestRedeempulls vault units frommsg.sender.refundRequestafter deadline (or auth) paysrequest.user.- Authorized vault
solve mints units
to
request.useror pays that user afterexit. Permissionless direct solve swaps the solver's other side for the queued tokens / units; the user still receives their side. setUnitPriceisonlyVaultAccountant. Whitelist mutation isrequiresAuth. Transfer hook blocks sanctionedfrom/to.
Do not file accountant price privilege, auth sync-deposit refund, permissionless direct solve with a solver tip, or sanctions blocking as stranger theft.
Not submitted. Payment requires user KYC. Listed Aera Base vault leftover is exhausted at the opened-contract level.
2026-09-03: Derive leftover matching + cash leftover (f6c20f4 / 96796a6)
Immunefi program
derive
($50,000, kyc: false).
Unique unused standing
program. Not previously
logged. Listed assets are
Lyra-explorer addresses
(explorer 403 from this
VM; Sourcify 404 on
common L2 chain ids).
This slice is the official
GitHub of the listed
matching money modules
plus CashAsset
deposit / withdraw.
Clones /tmp/derive-v2-matching
at f6c20f4 and
/tmp/derive-v2-core
at 96796a6.
No mainnet interaction.
Files:
src/Matching.sol,
src/ActionVerifier.sol,
src/SubAccountsManager.sol,
src/modules/{Base,Deposit,Withdrawal,Transfer,Trade}Module.sol,
src/assets/CashAsset.sol.
Checked for: a stranger deposit that credits the caller without pulling that owner; withdraw that pays the caller from another subaccount; transfer that moves a stranger's balances; matching execute that skips the owner signature; CashAsset withdraw by a non-owner.
Result: no user-exploitable finding. Not submitted.
- Matching
verifyAndMatchisonlyTradeExecutorand an allowed module. Actions share one module._verifyActionrequires an unexpired EIP-712 signature fromowneror a live session key, andsubAccountToOwner[id] == owner(or unset for id 0). - Deposit pulls
wrappedAssetfromaction.ownerand credits that owner's subaccount (or a new one mapped toaction.owner). Withdraw callsCashAsset.withdrawtoaction.owner. Transfer requires both signed actions to shareowner. - TradeModule fills
signed limit orders
within
limitPrice/worstFee/desiredAmount. Recipient must be the signed account or another account mapped to the same owner. Fee and fill price are executor-chosen inside those bounds. - CashAsset
depositpullsmsg.senderand credits the named account (donation).withdrawisownerOf(accountId)only and paysrecipient. - SubAccountsManager
maps deposited NFTs
to
msg.sender(or a named recipient). Complete-withdraw returns the NFT to that mapped owner after cooldown.
Do not file permissioned trade executor matching inside signed limits, owner session-key register, or permissionless donation deposit as stranger theft.
Not submitted. Listed leftover is the matching deposit / withdraw / transfer / trade path plus CashAsset. Remaining listed: DutchAuction / SecurityModule / StandardManager / PMRM / Option / Perp / BaseAsset / feeds.
2026-09-03: SSV Network leftover (Sourcify)
Immunefi program
SSV Network
($250,000, kyc: true).
Unique unused standing
program. Not previously
logged. Ethereum
Sourcify exact_match
ERC1967 proxies:
SSV Network
0xDD9BC35aE942eF0cFa76930954a156B3fF30a4E1
impl
0xa72a8F31163d74D708664493d09167dfa13008E9
(SSVNetworkSSVStakingUpgrade),
SSV Network View
0xafE830B6Ee262ba11cce5F32fDCd760FFE6a66e4
impl
0xAdEb99eb2307F874D72b1F814fCa106f6BFaA8E9
(SSVNetworkViews,
match). The Views
extract includes the
full module tree
used by the Network
proxy. No mainnet
writes. Extract
/tmp/ssv-impl.
Files:
project/contracts/SSVNetwork.sol,
project/contracts/SSVNetworkViews.sol,
project/contracts/modules/SSVClusters.sol,
project/contracts/modules/SSVOperators.sol,
project/contracts/modules/SSVStaking.sol,
project/contracts/modules/SSVDAO.sol,
project/contracts/libraries/OperatorLib.sol,
project/contracts/libraries/CoreLib.sol.
Checked for: a
stranger cluster
withdraw that pays
the caller from
another owner's
balance; operator
earnings withdraw
without
checkOwner;
stake that mints
CSSV without pulling
SSV; withdrawUnlocked
of another user's
cooldown queue;
DAO earnings
withdraw without
owner.
Result: no user-exploitable finding. Not submitted.
- Cluster
depositaddsmsg.valueto a named cluster (can fund another owner).withdrawvalidates the hashed cluster formsg.senderand pays that sender.liquidatepays the liquidator only when the caller is the owner or the cluster is liquidatable. - Operator earnings
withdraws call
checkOwner(operator.owner == msg.sender). stakepulls SSV frommsg.senderand mints CSSV to that sender.requestUnstakeburns the caller's CSSV and queues that caller.withdrawUnlockedpays only that caller's matured requests.claimEthRewardspaysaccrued[msg.sender].rescueERC20,withdrawNetworkSSVEarnings, fee / liquidation setters, and module upgrades areonlyOwneronSSVNetwork. Views has no money path.
Do not file permissionless liquidation of a liquidatable cluster, depositing ETH into another owner's cluster, or owner DAO privilege as stranger theft.
Not submitted. Payment requires user KYC. Listed SSV Network leftover is exhausted at the opened-contract level.
2026-09-03: Derive leftover auction + security leftover (96796a6)
Immunefi program
derive
($50,000, kyc: false).
Matching + cash leftover
is already logged.
This slice is listed
DutchAuction and
SecurityModule.
Official clone
/tmp/derive-v2-core
at 96796a6.
No mainnet interaction.
Files:
src/liquidation/DutchAuction.sol,
src/SecurityModule.sol.
Checked for: a
stranger bid that
uses another account
as bidder; solvent
bid that pulls cash
from the liquidated
account to the
caller; insolvent
payout that pays
msg.sender;
requestPayout by
a non-whitelisted
module; ownerless
withdraw from the
security module.
Result: no user-exploitable finding. Not submitted.
startAuctionrequires a whitelisted manager and maintenanceMargin < 0. Solvent start may pay a liquidation fee to the security module account.bidrequiresownerOf(bidderId) == msg.sender, same manager, and a live auction that cannot yet terminate. Solvent bids paycashFromBidderinto the liquidated account viaexecuteBidand reserve that cash. Insolvent bids request SM payout tobidderId; a shortfall callscash.socializeLossto that bidder.terminateAuctionis permissionless once MM/BM is restored.convertToInsolventAuctionrequires the solvent bid price <= 0 and MM < 0.- SecurityModule
withdraw/recoverERC20are owner.donatepullsmsg.sender.requestPayoutisonlyWhitelistedModuleand transfers cash totargetAccount.payCashInsolvencydonates the SM cash balance.
Do not file permissionless undercollateralized liquidation, security-module socialize-loss print, or owner whitelist / withdraw as stranger theft.
Not submitted. Listed leftover is DutchAuction + SecurityModule. Remaining listed: StandardManager / PMRM / Option / Perp / BaseAsset / feeds.
2026-09-03: Royco factory + Makina strategy leftover (Sourcify)
Immunefi program
Royco
($250,000, kyc: true).
Unique unused standing
program. Not previously
logged. Ethereum
Sourcify match
ERC1967 Factory
0x7cC6fB28eC7b5e7afC3cB3986141797ffc27253C
impl
0x34DB2f4215e55ec8e2c3dE0a826935EBF158be77
(RoycoFactory);
same impl behind the
Arbitrum factory
proxy. Makina
strategy
0xc5FeF644d59415cec65049e0653CA10eD9Cba778
is Sourcify match
RoycoVaultMakinaStrategy.
srRoyUSDC
0xcD9f5907… and
Multisig Strategy
0xd3F8Edff… are
Sourcify 404. Official
clone
/tmp/royco-makina
3ba424d. No mainnet
writes. Extract
/tmp/royco-src.
Files:
src/factory/RoycoFactory.sol,
src/RoycoVaultMakinaStrategy.sol.
Checked for: a
stranger
deployMarket that
takes over an
existing tranche;
allocateFunds that
pulls a victim's
USDC; onWithdraw
that pays the
caller instead of
the vault;
rescueToken of the
machine share
token.
Result: no user-exploitable finding. Not submitted.
- Factory
deployMarketisonlyAuthorizedand CREATE3- deploys new proxies. Role / upgrade setters are authorized. - Strategy
allocateFunds/deallocateFunds/onWithdrawareonlyRoycoVault. Allocate pulls the vault and deposits into the Makina machine for this strategy. Deallocate / withdraw redeem toROYCO_VAULT.rescueTokenisrestrictedand cannot sweep the machine share token.
Do not file authorized market deploy, vault-only allocate / deallocate, or admin rescue of non-share tokens as stranger theft.
Not submitted. Payment requires user KYC. Listed Royco factory + Makina strategy leftover is exhausted at the opened-contract level. Remaining listed: srRoyUSDC / Multisig Strategy (Sourcify 404), the Safe, and the website.
2026-09-03: Derive leftover assets leftover (96796a6)
Immunefi program
derive
($50,000, kyc: false).
Matching / cash /
auction leftovers
are already logged.
This slice is listed
BaseAsset /
OptionAsset /
PerpAsset.
Official clone
/tmp/derive-v2-core
at 96796a6.
No mainnet interaction.
Files:
src/assets/WrappedERC20Asset.sol,
src/assets/WLWrappedERC20Asset.sol,
src/assets/OptionAsset.sol,
src/assets/PerpAsset.sol.
Checked for: a
stranger
WrappedERC20
withdraw that pays
the caller; option
handleAdjustment
that skips
allowance; perp
settleRealizedPNLAndFunding
by a non-manager;
whitelist deposit
that credits a
blocked account.
Result: no user-exploitable finding. Not submitted.
WrappedERC20Asset.depositpullswrappedAssetfrommsg.senderand credits the named account (donation).withdrawisownerOf(accountId)only and paysrecipient.handleAdjustmentisonlyAccounts, rejects a negative balance, and always needs allowance.WLWrappedERC20Asset.depositalso requires a whitelisted recipient whenwlEnabled.OptionAsset.handleAdjustmentisonlyAccountsand always needs allowance.calcSettlementValueis a view; owner sets the settlement feed.PerpAsset.handleAdjustmentisonlyAccountsand always needs allowance.settleRealizedPNLAndFundingisonlyManagerForAccount.realizeAccountPNLonly updates stored pnl / funding, not cash.
Do not file permissionless donation deposit, owner feed / whitelist setters, or manager-only perp cash settle as stranger theft.
Not submitted. Listed leftover is Base / Option / Perp assets. Remaining listed: StandardManager / PMRM / feeds.
2026-09-03: Derive leftover StandardManager leftover (96796a6)
Immunefi program
derive
($50,000, kyc: false).
Matching / cash /
auction / assets
leftovers are already
logged. This slice is
listed
StandardManager
plus inherited
BaseManager
bid / fee / settle
paths. Official clone
/tmp/derive-v2-core
at 96796a6.
No mainnet interaction.
Files:
src/risk-managers/StandardManager.sol,
src/risk-managers/BaseManager.sol.
Checked for: a
stranger
executeBid that
moves a solvent
account; payLiquidationFee
by a non-auction
caller;
handleAdjustment
that skips the
margin check on a
risk-adding trade;
settleOptions that
pays the caller.
Result: no user-exploitable finding. Not submitted.
handleAdjustmentisonlyAccounts. Live auctions block transfers. Risk-adding trades require post-trade IM (or MM for a trusted risk assessor). Reducing-only trades bypass.executeBid/payLiquidationFeeareonlyLiquidations. Bid cash goes to the liquidated account; fee cash goes to the named recipient.settleOptions/settlePerpsWithIndexcredit that account's cash from expired options / realized perp pnl. They do not paymsg.sender.- Owner sets markets / oracles / margin params. Guardian pauses adjustments.
Do not file permissionless expired-option settle, trusted assessor MM vs IM, or owner oracle / margin privilege as stranger theft.
Not submitted. Listed leftover is StandardManager + BaseManager money paths. Remaining listed: PMRM / feeds.
2026-09-03: DeXe Protocol leftover (Sourcify + official GitHub)
Immunefi program
dexeprotocol
($500,000, kyc: true).
Unique unused standing
program. Not previously
logged. BSC (56)
Sourcify exact_match
UserRegistry proxy
0x427a1214f12117b1AD48C817c203c5CF3Eb7E7C4
impl
0x4FA40ed48c5671500DFeC9F307e7ad0617fc3196
(UserRegistry);
SphereXEngine
0x41260f637a993ce714Ece1ee9875F489e483e9b3
(SphereXEngine).
Remaining listed
addresses are
Sourcify 404:
DeXe DAO
0xB562127efDC97B417B3116efF2C23A29857C0F0B,
ContractsRegistry
0x46B46629B674b4C0b48B111DEeB0eAfd9F84A1c0,
CoreProperties
0xaB9d2a2347D5fF5B760C0226C52d5C673b8D9e44,
PriceFeed
0xc7730074736c10ed0d3F928A10Ee4162DA9a7983,
ERC721Expert
0x892B3292cF80CB298b7fA20D04EF4732640db404,
PoolFactory
0x85f86ef7E72e86BdEAb5F65e2B76A2c551f22109,
PoolRegistry
0xFEB26AAB75638440B3CEFe8B10de6118972f9C6B,
PoolSphereXEngine
0x4fa2092E32934Dd3823E58C79ceD0e410a5B0D4b.
Official clone
/tmp/dexe-protocol from
dexe-network/DeXe-Protocol
(README production
table matches the
Immunefi asset list).
No mainnet writes.
Extract /tmp/dexe-src
and /tmp/dexe-impl.
Files:
contracts/user/UserRegistry.sol,
contracts/core/ContractsRegistry.sol,
contracts/core/CoreProperties.sol,
contracts/core/PriceFeed.sol,
contracts/factory/PoolFactory.sol,
contracts/factory/PoolRegistry.sol,
contracts/gov/GovPool.sol,
contracts/gov/user-keeper/GovUserKeeper.sol,
contracts/gov/ERC721/experts/ERC721Expert.sol,
contracts/libs/gov/gov-pool/GovPoolExecute.sol,
contracts/libs/gov/gov-pool/GovPoolCreate.sol,
@spherex-xyz/engine-contracts/src/SphereXEngine.sol.
Checked for: a
stranger profile
write that binds
another address;
KMS-style signature
reuse that marks a
victim as agreed;
factory deploy that
hijacks an existing
DAO / salt; deposit
that credits a
different user;
withdraw / undelegate
that pays the
caller someone
else's tokens;
execute /
tryExecute that
runs unpassed
actions; PriceFeed
spot quotes used as
a settlement
oracle; SphereX
sender-adder that
a stranger can
grant.
Result: no user-exploitable finding. Not submitted.
- UserRegistry
changeProfilewrites_users[msg.sender].agreeToPrivacyPolicyrecovers EIP-712 over the currentdocumentHashand requiresrecover == msg.sender.setPrivacyPolicyDocumentHashisonlyOwner. No token path. - SphereXEngine
configureRules/ sender and pattern edits areonlyOperator.addAllowedSenderOnChainisonlySenderAdderRole. Validate hooks areonlyApprovedSendersand no-op when rules are deactivated. - PoolFactory
deployGovPoolCREATE2-salts fromtx.origin+ pool name and registers a new beacon proxy. Ownership of settings / keeper / validators / expert NFT / multiplier transfers to the new pool.createTokenAndDeployPoolclones the caller-supplied implementation and inits it; allocation only pulls the new clone after factory approve. - PoolRegistry
addProxyPoolisonlyPoolFactory. SphereX toggle / protect selectors areonlyOwner. - ContractsRegistry
add / inject /
SphereX protect
and UUPS
_authorizeUpgradeareonlyOwner. - CoreProperties
parameter setters
are
onlyOwner. Treasury address comes from the registry. - PriceFeed
path / pool-type
setters are
onlyOwner. Quotes are Uniswap spot helpers. No other listed contract consumes them for settlement. - ERC721Expert
mint / burn /
tags / URI are
onlyOwner._transferreverts. - GovPool (DeXe
DAO) deposit
credits
msg.sender. Withdraw / undelegate useGovUserKeeperLocalso the keeper payer ismsg.sender.executerequiresSucceededFor/SucceededAgainst.delegateTreasury/ credit setters areonlyThis(self-call via passed proposal).transferCreditAmountisonlyValidatorContract.tryExecutealways reverts the simulation frame. Create-power check plus internal-selector allowlist. Treasury quorum exemption only applies to expert-NFT burn and treasury (un)delegate actions.
Do not file owner/operator registry or SphereX admin, permissionless new-DAO deploy, or AMM spot quotes with no in-scope settlement consumer as stranger theft.
Not submitted. Payment requires user KYC. Listed DeXe leftover is exhausted at the opened-contract level. Remaining listed: PoolSphereXEngine bytecode (Sourcify 404; same SphereX engine product), and live bytecode vs GitHub HEAD not independently matched for the Sourcify-404 rows.
2026-09-03: Kiln On-Chain v1 leftover (Sourcify)
Immunefi program
kiln-on-chain-v1
($1,000,000, kyc: true).
Unique unused standing
program. Not previously
logged. Ethereum
Sourcify exact_match
on every listed
mainnet row.
StakingContract
0x0A7272e8573aea8359FEC143ac02AED90F822bD0
behind TUPProxy
0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270
impl
StakingContract.
ConsensusLayerFeeDispatcher
0x462Dd07A79e5DDfBe0C171449C5c01788d5d03C3
behind TUPProxy
0xE8EC6F702D68ded71112031D78bBFf959c7234C7.
ExecutionLayerFeeDispatcher
0xca4DD914fA713214844c84F153A5e1627536a7fC
behind TUPProxy
0x72b4C52f18f52EbA3E4290a002dF7c387427b058.
FeeRecipient
implementation
0x933fBfeb4Ed1F111D12A39c2aB48657e6fc875C6.
Skipped listed
Goerli testnet
rows. No mainnet
writes. Extract
/tmp/kiln-v1.
Files:
src/contracts/StakingContract.sol,
src/contracts/ConsensusLayerFeeDispatcher.sol,
src/contracts/ExecutionLayerFeeDispatcher.sol,
src/contracts/FeeRecipient.sol,
src/contracts/TUPProxy.sol.
Checked for: a
stranger deposit
that sets another
address as
withdrawer;
setWithdrawer
without the
current owner;
fee withdraw that
pays the caller;
permissionless
dispatch that
redirects a
validator's ETH;
FeeRecipient
init hijack;
proxy upgrade /
pause by a
non-admin.
Result: no user-exploitable finding. Not submitted.
deposit/receiverequiremsg.valuea multiple of 32 ETH and write withdrawer =msg.sender. ETH is forwarded to the official deposit contract with 0x01 credentials of the CREATE2 CL fee recipient.setWithdrawerrequires customization enabled andwithdrawers[root] == msg.sender.- EL / CL fee withdraws are withdrawer-or- admin. Funds still go to the stored withdrawer via dispatcher split. Admin cannot redirect.
- FeeRecipient
withdrawis permissionless butdispatchpaysgetWithdrawerFromPublicKeyRoot. Clone +inithappen in the same staking transaction. - CL dispatcher
exempts up to
32 ETH once
when exit is
requested and
balance >= 31
ETH.
toggleWithdrawnFromPublicKeyRootis CL-dispatcher only. - TUPProxy pause /
upgrade are
ifAdminTransparent proxy admin.
Do not file admin fee / operator / treasury commission, or permissionless trigger of a correctly-routed fee dispatch, as stranger theft.
Not submitted. Payment requires user KYC. Listed Kiln On-Chain v1 mainnet leftover is exhausted. Remaining listed: Goerli testnet rows only (skip).
2026-09-03: Derive leftover PMRM + feeds leftover (96796a6)
Immunefi program
derive
($50,000, kyc: false).
Matching / cash /
auction / assets /
StandardManager
leftovers are already
logged. This slice is
listed PMRM plus
PMRMLib margin math
and the live signed
feeds. Official clone
/tmp/derive-v2-core
at 96796a6.
No mainnet interaction.
Files:
src/risk-managers/PMRM.sol,
src/risk-managers/PMRMLib.sol,
src/feeds/BaseLyraFeed.sol,
src/feeds/LyraSpotFeed.sol,
src/feeds/LyraVolFeed.sol,
src/feeds/LyraRateFeed.sol,
src/feeds/LyraForwardFeed.sol,
src/feeds/LyraSpotDiffFeed.sol,
src/feeds/SFPSpotFeed.sol.
Checked for: a
stranger
handleAdjustment
that skips IM on a
risk-adding trade;
settlePerpsWithIndex
/ settleOptions that
pay msg.sender;
acceptData that
writes a price
without enough
whitelisted signers;
a replay that
overwrites a newer
spot / vol / rate.
Result: no user-exploitable finding. Not submitted.
handleAdjustmentisonlyAccounts. Live auctions block transfers. Unsupported assets revert. Risk-adding trades (perp or a negative option / base / cash delta) require post-trade IM, or MM for a trusted risk assessor. Reducing-only trades bypass.settlePerpsWithIndex/settleOptionscredit that account's cash from unrealized perp pnl / expired options. They do not paymsg.sender.PMRMLibis a margin-math library. It has no caller payout.- Owner sets feeds / scenarios / max expiries. Guardian pauses adjustments.
BaseLyraFeed._parseAndVerifyFeedDatarequiresrequiredSigners, no duplicate signers, each signerisSigner, a live deadline, and a timestamp not in the future.LyraSpotFeed/LyraVolFeed/LyraRateFeed/LyraSpotDiffFeedacceptDataonly update when the signed timestamp is newer. Confidence must be ≤ 1e18. Vol data cannot be dated after expiry.LyraForwardFeedsettlement TWAP uses signed aggregates and reverts on stale settlement data.SFPSpotFeedreads an immutable share price and owner bounds. It has noacceptData. Static feeds are owner-set.
Do not file permissionless expired-option / perp settle, trusted assessor MM vs IM, owner feed / signer / scenario privilege, or stale-heartbeat revert as stranger theft.
Not submitted. Listed leftover that official GitHub of listed types opens is exhausted at the opened-contract level (Lyra explorer still 403; Sourcify 404 on guessed L2 chain ids).
2026-09-03: Celer leftover ETH staking / SGN / cBridge (Sourcify)
Immunefi program
celer
($2,000,000, kyc: true).
Unique unused standing
program. Not previously
logged. Ethereum
Sourcify exact_match
on every listed ETH
row.
Staking
0x8a4B4C2aCAdeAa7206Df96F00052e41d74a015CE
(Staking).
SGN
0xCb4A7569a61300C50Cf80A2be16329AD9F5F8F9e
(SGN).
StakingReward
0xb01fd7Bc0B3c433e313bf92daC09FF3942212b42.
FarmingRewards
0x61f85fF2a2f4289Be4bb9B72Fc7010B3142B5f41.
Govern
0xea129aE043C4cB73DcB241AAA074F9E667641BA0.
Viewer
0x5803457E3074E727FA7F9aED60454bf2F127853b.
cBridge Ethereum
0x5427FEFA711Eff984124bFBB1AB6fbf5E3DA1820
(Bridge + Pool).
No mainnet writes.
Extract /tmp/celer-src.
Files:
contracts/Staking.sol,
contracts/SGN.sol,
contracts/StakingReward.sol,
contracts/FarmingRewards.sol,
contracts/Govern.sol,
contracts/Viewer.sol,
contracts/Bridge.sol,
contracts/Pool.sol,
contracts/Signers.sol.
Checked for: a
stranger delegate
that credits
another address;
undelegate /
complete that
pays the caller
someone else's
CELR; SGN
withdraw that
ignores the
signed account;
reward claim that
pays msg.sender;
cBridge send /
relay /
withdraw that
skips quorum or
pays the caller;
signer-set
replacement
without current
quorum.
Result: no user-exploitable finding. Not submitted.
- Staking
delegatepullsmsg.senderand credits that delegator. Undelegate / complete usedelegators[msg.sender]and paymsg.sender.slashneeds bonded-validator quorum. Zero collector account paysmsg.senderonly inside a signed slash. - SGN deposit
records
msg.sender. Withdraw is cumulative towithdrawal.accountafterverifySignatures. - StakingReward /
FarmingRewards
pay the signed
recipientthe delta over claimed cumulative.drainTokenis owner + paused. - Bridge
sendpullsmsg.sender.relay/ PoolwithdrawverifyssHashsigner quorum and pay the signed receiver. Delayed execute pays stored receiver afterdelayPeriod. - Signers update
requires current
quorum.
resetSignersis owner after notice. - Viewer is read-only.
Do not file quorum-signed relay / withdraw / slash, owner paused drain, or gov param votes as stranger theft.
Not submitted. Payment requires user KYC. Listed Celer ETH staking / SGN / rewards / govern / viewer / cBridge leftover is exhausted. Remaining listed: cBridge on BSC / Arbitrum / Polygon / Avalanche / Fantom / Optimism / Boba, and the cBridge web app.
2026-09-03: GMX leftover V2 Shift leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false).
GlvRouter leftover
already logged.
This slice is the
listed remaining
ShiftHandler /
ShiftVault /
ExternalHandler /
FeeHandler.
Arbitrum Sourcify
exact_match
ShiftHandler
0x48787F7847068f9Cc1398e5f589BEf9744730C8D
- ShiftVault
0xfe99609C4AA83ff6816b64563Bdffd7fa68753Ab - ExternalHandler
0x389CEf541397e872dC04421f166B5Bc2E0b374a5 - FeeHandler
0x7EB417637a3E6d1C19E6d69158c47610b7a5d9B3. Extract/tmp/gmx-shift. No mainnet interaction.
Files:
contracts/exchange/ShiftHandler.sol,
contracts/shift/ShiftUtils.sol,
contracts/shift/ShiftVault.sol,
contracts/bank/Bank.sol,
contracts/bank/StrictBank.sol,
contracts/external/ExternalHandler.sol,
contracts/fee/FeeHandler.sol,
contracts/fee/FeeUtils.sol.
Checked for: a
stranger
createShift that
binds another
account; cancelShift
that refunds the
caller; executeShift
that mints GM to
the keeper;
transferOut from
ShiftVault by a
non-controller;
withdrawFees to
msg.sender;
buyback that pays
without depositing
the batch.
Result: no user-exploitable finding. Not submitted.
createShift/cancelShiftareonlyController.executeShiftisonlyOrderKeeper._executeShiftisonlySelf.createShiftrecords WNT + from-market tokens already in the vault and stores them on the named account.cancelShiftreturns from-market tokens toshift.account(), not the keeper.executeShiftwithdraws into the vault then deposits toshift.receiver(). Direct vault donations arerecordTransferInfirst so they are not folded into the shift.- ShiftVault
transferOut/recordTransferInareonlyController. - FeeHandler
withdrawFeesisonlyFeeKeeperand paysFEE_RECEIVER. PermissionlessclaimFeespulls market fees to this contract.buybackpullsbatchSizeof the buyback token frommsg.senderand pays an oracle-capped fee amount back. - ExternalHandler
makeExternalCallsis permissionless and can call any contract as this handler, then refunds leftover tokens on this contract. It does not pull user allowances.
Do not file
permissionless
ExternalHandler
leftover sweep,
permissionless
claimFees into
FeeHandler, keeper
execution-fee
payment, or
controller-only
shift create /
cancel as stranger
theft.
Not submitted. Listed leftover is Arb ShiftHandler / ShiftVault / ExternalHandler / FeeHandler. Remaining listed: V1 Order Book / Timelock / StakedGlp / USDG, Avax twins, and V2 Oracle / Reader rows.
2026-09-03: Celer leftover remaining cBridge deployments (Sourcify)
Immunefi program
celer
($2,000,000, kyc: true).
Follow-on to the
ETH staking / SGN /
cBridge leftover.
Listed cBridge
deployments on
Arbitrum
0x1619DE6B6B20eD217a58d00f37B9d47C7663feca,
Polygon
0x88DCDC47D2f83a99CF0000FDF667A468bB958a78,
Avalanche
0xef3c714c9425a8F3697A9C969Dc1af30ba82e5d4,
Fantom
0x374B8a9f3eC5eB2D97ECA84Ea27aCa45aa1C57EF,
Optimism
0x9D39Fc627A6d9d9F8C831c16995b209548cc3401,
Boba
0x841ce48F9446C8E281D3F1444cB859b4A6D0738C
are Sourcify
exact_match
contracts/Bridge.sol:Bridge.
BSC
0xdd90E5E87A2081Dcf0391920868eBc2FFB81a1aF
is Sourcify
match
./contracts/Bridge.sol:Bridge.
Same Pool +
Signers + delayed
transfer tree as
the Ethereum
cBridge already
reviewed. No
mainnet writes.
Checked for: a
chain-specific
fork that lets
send / relay /
withdraw pay
the caller or
skip ssHash
quorum.
Result: no user-exploitable finding. Not submitted.
- Each remaining
deployment
verifies as the
same Bridge /
Pool
implementation
already opened
on Ethereum.
sendpullsmsg.sender.relay/withdrawrequire current signer quorum and pay the signed receiver.
Do not file the same quorum-signed cBridge path as a new finding on another chain.
Not submitted. Payment requires user KYC. Listed Celer cBridge leftover is exhausted. Remaining listed: cBridge web app only.
2026-09-03: Pyth Network leftover EVM (official GitHub)
Immunefi program
pythnetwork
($250,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Official
clone
/tmp/pyth-crosschain
4dd956e.
Opened listed EVM
trees:
target_chains/ethereum/contracts/contracts/pyth,
target_chains/ethereum/contracts/contracts/entropy,
lazer/contracts/evm.
No mainnet writes.
Files:
contracts/pyth/Pyth.sol,
contracts/pyth/PythGovernance.sol,
contracts/entropy/Entropy.sol,
contracts/entropy/EntropyGovernance.sol,
lazer/contracts/evm/src/PythLazer.sol.
Checked for: a
stranger
updatePriceFeeds
that spends
someone else's
ETH; governance
fee withdraw
without a Wormhole
VAA; Entropy
withdraw of
another
provider's fees;
reveal that
redirects a
request; Lazer
verifyUpdate
that keeps excess
or lets a stranger
upgrade.
Result: no user-exploitable finding. Not submitted.
- Pyth
updatePriceFeedschargesmsg.valueonly.withdrawFeeis internal behindexecuteGovernanceInstruction, which verifies a Wormhole VAA from the governance data source. - Entropy
request*credits provider + Pyth accrued fees frommsg.value.requesterismsg.sender.withdrawpaysmsg.senderfrom that provider's accrued fees.withdrawAsFeeManagerrequiresfeeManager == msg.sender.setFeeManageris the provider. Manualrevealrequiresreq.requester == msg.sender. Callback reveal calls the original requester. AdminwithdrawFeeis_authoriseAdminAction. - Lazer
verifyUpdaterefunds excess tomsg.senderand keepsverification_fee. Trusted signers and UUPS upgrade areonlyOwner.
Do not file Wormhole-governed fee withdraw, provider self- withdraw, or permissionless price-update fees paid by the caller as stranger theft.
Not submitted. Payment requires user KYC. Listed Pyth EVM leftover is exhausted. Remaining listed: Solana / Sui crosschain, governance staking program, Lazer Solana / Sui / Cardano, and the staking website.
2026-09-03: Axelar leftover ETH gateway / ITS / ITF (Sourcify + official GitHub)
Immunefi program
axelarnetwork
($500,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Ethereum
Sourcify
match
AxelarGatewayProxyMultisig
0x4F4495243837681061C4743b74B3eEdf548D56A5
(not
exact_match;
live runtime may
be a later
upgrade).
AXL token
0x467719aD09025FcC6cF6F8311755809d45a5E5f3
is Sourcify
match
BurnableMintableCappedERC20.
Interchain Token
Service proxy
0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C
and Factory proxy
0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66
are Sourcify
exact_match
InterchainProxy
impls
0x1B13a9BaF8… /
0xe833E9662c…
(Sourcify 404).
Official clones
/tmp/axelar-cgp
43ec407 and
/tmp/axelar-its
ff21991.
Extract
/tmp/axelar-src.
No mainnet writes.
Files:
AxelarGatewayMultisig.sol,
AxelarGateway.sol,
AxelarGatewayProxy.sol,
BurnableMintableCappedERC20.sol,
contracts/InterchainTokenService.sol,
contracts/InterchainTokenFactory.sol.
Checked for: a
stranger
execute that
mints without
operator proof;
unprotected
setup takeover
on the live
proxy; ITS
interchainTransfer
that pulls a
victim; execute
that skips the
hub / gateway
approval;
factory deploy
that mints to
the caller a
pre-existing
token.
Result: no user-exploitable finding. Not submitted.
- Sourcify gateway
executerecovers owner / operator multisig and only then self-calls mint / burn / deploy. Commands are marked executed before the inner call. - Current official
AxelarGateway.setupisonlyProxyand the proxy shadowssetupas a no-op so upgrades cannot be called through fallback. Do not treat the older flattenedsetupas live without an exact-match runtime. - AXL
mint/burn/burnFromareonlyOwner. - ITS
_interchainTransfer_takeTokensmsg.sender.executeisonlyItsHubandgateway.validateContractCall.deployInterchainTokenisonlyTokenFactory. - Factory deploy
salts with
msg.senderand mintsinitialSupplyof the new token to the deployer.
Do not file quorum-signed gateway mint, owner AXL mint, or permissionless new-token factory deploy as stranger theft.
Not submitted. Payment requires user KYC. Listed Axelar ETH gateway / ITS / ITF / AXL leftover is exhausted at the opened-contract level. Remaining listed: other-chain gateways and axlUSDC tokens, ITS GitHub tree beyond the two entry contracts, and DLT axelar-core / tofnd.
2026-09-03: GMX leftover V2 Oracle + V1 Order Book leftover (Sourcify)
Immunefi program
gmx ($5,000,000,
kyc: false).
Shift leftover
already logged.
This slice is the
listed remaining
V2 Oracle / Reader
plus V1 Order Book /
USDG / Timelock /
StakedGlp.
Arbitrum Sourcify
exact_match
Oracle
0xb8fc96d7a413C462F611A7aC0C912c2FE26EAbC4
- Reader
0x0537C767cDAC0726c76Bb89e92904fe28fd02fE1 - OrderBook
0x09f77E8A13De9A35a7231028187E9fD5DB8a2Acb - Timelock V1
0x3f3e77421e30271568eF7A0ab5C5F2667675341e - Timelock V2
0x7A967D114B8676874FA2cFC1C14F3095C88418Eb - StakedGlp
0x01AF26b74409d10e15b102621EDd29c326ba1c55andmatchUSDG0x45096e7aA921f27590f8F19e457794EB09678141. Staked Glp Tracker is SourcifymatchRewardTracker (same type already logged). Staked Glp Distributor still Sourcify 404. Extract/tmp/gmx-oracle. No mainnet interaction.
Files:
contracts/oracle/Oracle.sol,
contracts/reader/Reader.sol,
contracts/tokens/USDG.sol,
core/OrderBook.sol,
core/Timelock.sol (V1),
governance/Timelock.sol (V2),
staking/StakedGlp.sol.
Checked for: a
stranger
setPrices that
writes a token
without a
controller; Reader
that mutates
DataStore; USDG
mint by a
non-vault;
OrderBook cancel
that refunds
another account's
order; Timelock
processMint
without admin;
StakedGlp transfer
that skips the
sender cooldown.
Result: no user-exploitable finding. Not submitted.
- Oracle
setPrices/setPrimaryPrice/clearAllPricesareonlyController. Providers must be enabled. Non-atomic prices must match the token's configured provider and a Chainlink ref band. - Reader is view-only.
- USDG
mint/burnareonlyVault. Vault add / remove isonlyGov. - OrderBook create
pulls
msg.sender/msg.valueand stores the order on that account. Cancel / update readorders[msg.sender]. Execute pays the stored account and the named fee receiver. - V1 Timelock
mint / approve /
setGov / plugin
paths are
onlyAdmin(plus buffer). Token / reward manager roles are separate. - V2 Timelock
oracle-signer /
role / fee-
receiver signals
are
onlyTimelockAdminoronlyTimelockMultisig. - StakedGlp transfer unstakes the sender after GLP cooldown and restakes for the recipient.
Do not file controller oracle writes, admin timelock mint, keeper OrderBook execution-fee, or vault-only USDG mint as stranger theft.
Not submitted. Listed leftover is Arb Oracle / Reader / OrderBook / USDG / Timelock V1+V2 / StakedGlp. Remaining listed: Avax twins, Sourcify-404 Staked Glp Distributor, and same-type Reader utils already in the Reader compilation.
2026-09-03: Kiln DeFi leftover ETH vault core (Sourcify)
Immunefi program
kiln-defi
($500,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Ethereum
Sourcify match
Vault
0x1d7f221965e68475d44d1a8357f3211799b55e24,
VaultUpgradeableBeacon
0x15f7f910e5a8c86e609fd11c58f7342d86d3a25c,
ConnectorRegistry
0xEEEBc7537717a39b747015FEaE221C1F069daE0b,
VaultFactory
0xA59a98872393BE8410C42f8EED13821fa85A32a1,
AaveV3Connector
0x0D97Fa6C8F668E98C1ED9f6bB9Ec6d245d11DF41,
CompoundV3Connector
0xF259CF58d4ddc9E3C8AbEA3EEBA5710db3F71045,
MarketRegistry
0x08f80358Ce68363Ec06304cE667F1727246C852D,
SDAIConnector
0xb569824646a31fc950abe23B150d020c38B59D26.
Bitcoin.com Spark
DAI vault
0xF4918Ef824a242602E0d3e5DB07fFd4DaC4ad3Ea
is Sourcify
match
VaultBeaconProxy
impl
0x0193BA8d74e8c7F51522a25F89C405691406eF20.
No official public
kiln-defi clone
found. Extract
/tmp/kiln-defi.
No mainnet writes.
Files:
src/Vault.sol,
src/VaultFactory.sol,
src/ConnectorRegistry.sol,
src/connectors/AaveV3Connector.sol,
src/connectors/CompoundV3Connector.sol,
src/connectors/SDAIConnector.sol,
src/abstracts/FeeDispatcher.sol.
Checked for: a
stranger deposit
that mints shares
to the caller for
someone else's
assets; withdraw
that skips
allowance; factory
create that
hijacks an
existing vault;
connector
deposit /
withdraw that
moves a vault's
Aave / Compound /
sDAI position
when called
directly; fee
dispatch that
pays msg.sender.
Result: no user-exploitable finding. Not submitted.
- Vault
deposit/mintpull_msgSender()and mint toreceiver.withdraw/redeemspend allowance whencaller != ownerand payreceiver. Connector interactions arefunctionDelegateCallso Aave / Compound / sDAI positions sit on the vault. - Factory
createVaultisonlyRole(DEPLOYER_ROLE)CREATE2 of a new beacon proxy. - Registry add /
update / remove
are
CONNECTOR_MANAGER. - Connectors
supply / withdraw
to
address(this). Direct calls cannot move a vault's delegated position. dispatchFeespays stored recipients.collectPerformanceFeesisFEE_MANAGER.
Do not file role-gated vault deploy, fee manager collect, or ERC4626 self-deposit as stranger theft.
Not submitted. Payment requires user KYC. Listed Kiln DeFi ETH core leftover is exhausted. Remaining listed: BSC / Arbitrum / other-chain vault impls, factories, connectors, and additional live vault instances.
2026-09-03: Acala leftover honzon / DEX / homa leftover (cde2abf)
Immunefi program
acala
($1,000, kyc: false).
Unique unused
standing program.
Not previously
logged. Official
clone /tmp/acala
at cde2abf. Listed
assets are the
Acala runtime
GitHub and
open-web3-stack/open-runtime-module-library.
This slice is the
listed money-path
pallets. No
mainnet interaction.
Files:
modules/honzon/src/lib.rs,
modules/loans/src/lib.rs,
modules/cdp-engine/src/lib.rs,
modules/dex/src/lib.rs,
modules/homa/src/lib.rs,
modules/incentives/src/lib.rs,
modules/earning/src/lib.rs,
modules/currencies/src/lib.rs,
modules/auction-manager/src/lib.rs.
Checked for: a
stranger
adjust_loan that
moves another
account's CDP;
transfer_loan_from
without
authorization;
DEX
claim_dex_share
that mints to the
caller; homa
claim_redemption
that pays
msg.sender;
liquidate that
credits the
unsigned caller.
Result: no user-exploitable finding. Not submitted.
- Honzon
adjust_loan/ close / expand / shrink /transfer_debitall useensure_signedand adjust that signer's CDP.transfer_loan_fromrequiresAuthorizationfrom the owner. - Loans
adjust_positionpulls / payswho.transfer_loanis pallet-internal. - DEX swap / add /
remove liquidity
pull and pay the
signer.
Permissionless
claim_dex_share/refund_provisioncredit the namedowner, not the caller. Listing / abort params areListingOriginor post-expiry status only. - Homa
mint/request_redeemlock the signer.fast_match_redeems/claim_redemptionpay the named redeemer. - Incentives deposit / withdraw / claim use the signer.
- Earning bond / unbond / withdraw lock the signer.
- Currencies
transferpulls the signer.update_balanceis privileged. - CDP
liquidate/ auctioncancelare unsigned (ensure_none) and settle the named CDP / auction into protocol accounts.
Do not file permissionless claim-to-owner, unsigned liquidation of an unsafe CDP, or root listing origin as stranger theft.
Not submitted.
Listed leftover is
the opened Acala
money-path
pallets.
Remaining listed:
open-runtime-module-library,
EVM / XCM /
honzon-bridge /
liquid-crowdloan /
NFT pallets.
2026-09-03: Ostium leftover vault / trading (Sourcify)
Immunefi program
ostium
($200,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Arbitrum
Sourcify
exact_match
Transparent
proxies:
Vault
0x20D419a8e12C45f88fDA7c5760bb6923Cee27F98
impl
0xACff332d0d8c34162Be6BbABF7D676fEa7cD0F3E
(OstiumVault);
Trading
0x6D0bA1f9996DBD8885827e1b2e8f6593e7702411
impl
0x8CBb5bd2b46f993078407CEa26704aF0A901515a
(OstiumTrading,
match);
Callbacks
0x7720fC8c8680bF4a1Af99d44c6c265a74e9742a9
impl
0x9214159E33A48A252203FB47bA513B272B888F7D
(OstiumTradingCallbacks,
match);
Storage
0xccd5891083a8acd2074690f65d3024e7d13d66e7
impl
0xd40C55475D4FEA67415cD12Abc28c949fc7a7FEE
(OstiumTradingStorage).
Listed
LockedDepositNft
0xB71ec9eBD8145daCaCF6724363143cb5667A3d36
is Sourcify
exact_match
proxy whose impl
is
OstiumPrivatePriceUpKeep,
not an NFT.
Official clone
/tmp/ostium
8390ce4.
Extract
/tmp/ostium-src
and
/tmp/ostium-impl.
No mainnet writes.
Files:
src/OstiumVault.sol,
src/OstiumTrading.sol,
src/OstiumTradingCallbacks.sol,
src/OstiumTradingStorage.sol,
src/abstract/Delegatable.sol.
Checked for: a
stranger
requestDeposit
that credits
another address;
claimDeposit /
claimWithdraw
that pays the
caller someone
else's assets;
sendAssets that
is not callbacks-
only; openTrade
that pulls a
victim's USDC;
transferUsdc
callable by
anyone;
openTradeMarketCallback
that skips the
price upkeep.
Result: no user-exploitable finding. Not submitted.
- ERC4626
deposit / mint /
withdraw /
redeem revert
FunctionDisabled.requestDepositpullsmsg.senderintopendingDepositRequest[msg.sender]. Claim / cancel / reclaim use that mapping and paymsg.sender. sendAssetsisonlyCallbacks.receiveAssetsanddistributeRewardpullmsg.sender.- Trading
openTrade/closeTradeMarketuse_msgSender()(direct caller or an approved EIP-712 delegate). CollateraltransferUsdcisonlyTradingOrCallbacks. - Callbacks
isPriceUpKeeprequires the registry price-upkeep for that pair.
Do not file keeper-gated settlement, gov fee claim, or user-approved delegate trading as stranger theft.
Not submitted. Payment requires user KYC. Listed Ostium vault / trading / callbacks / storage leftover is exhausted at the opened-contract level. Remaining listed: keepers, registry, pair/price routers, timelock, and the web / Telegram apps.
2026-09-03: Acala leftover EVM / XCM / bridge leftover (cde2abf)
Immunefi program
acala
($1,000, kyc: false).
Honzon / DEX / homa
leftover already
logged. This slice
is the remaining
listed Acala
runtime pallets:
EVM, EVM-accounts,
EVM-bridge,
honzon-bridge,
XCM interface,
liquid-crowdloan,
and NFT.
Official clone
/tmp/acala at
cde2abf. No
mainnet interaction.
Files:
modules/evm/src/lib.rs,
modules/evm-accounts/src/lib.rs,
modules/evm-bridge/src/lib.rs,
modules/honzon-bridge/src/lib.rs,
modules/xcm-interface/src/lib.rs,
modules/liquid-crowdloan/src/lib.rs,
modules/nft/src/lib.rs.
Checked for: a
stranger
eth_call that
spends another
mapped account;
claim_account
that steals an
unrelated padded
balance without a
signature;
to_bridged that
pays the caller
from a third
party; NFT
transfer of a
token the signer
does not own;
crowdloan redeem
that burns someone
else's LCDOT.
Result: no user-exploitable finding. Not submitted.
- EVM
call/eth_call_v2map the signer to an EOA and debit that mapped source. claim_accountrequires an EIP-712 signature over the signer and merges only the padded address that belongs to that ETH key.- EVM-bridge is a runtime helper (ERC20 / liquidate selectors). It has no public extrinsics.
- Honzon-bridge
to_bridged/from_bridgedpull the signer and pay the signer 1:1 from the pallet account. Address set isUpdateOrigin. - XCM interface
fee / weight
updates are
UpdateOrigin. - Liquid-crowdloan
redeemburns the signer's LCDOT and pays that signer. Redeem currency set is governance. - NFT
transfer/burnrequire the signer to own the token. Mint is class issuer.
Do not file signed-key account merge, 1:1 pallet stable swap, or governance XCM fee updates as stranger theft.
Not submitted.
Listed Acala
runtime leftover
that this clone
opens is exhausted
at the opened
pallet level.
Remaining listed:
open-runtime-module-library
(33bc94a; tokens /
xtokens leftover
logged below).
2026-09-03: Acala leftover ORML leftover (33bc94a)
Immunefi program
acala
($1,000, kyc: false).
Honzon / DEX / homa and
EVM / XCM / bridge leftovers
already logged. This slice
is the remaining listed
open-web3-stack/open-runtime-module-library
money-path pallets.
Official clone /tmp/orml
at 33bc94a. Sparse
checkout: tokens,
xtokens, currencies,
oracle, vesting,
payments, auction,
nft, unknown-tokens,
rewards,
asset-registry.
No mainnet interaction.
Files:
tokens/src/lib.rs,
xtokens/src/lib.rs,
currencies/src/lib.rs,
oracle/src/lib.rs,
vesting/src/lib.rs,
payments/src/lib.rs,
auction/src/lib.rs,
nft/src/lib.rs,
unknown-tokens/src/lib.rs,
rewards/src/lib.rs,
asset-registry/src/lib.rs.
Checked for: a
stranger transfer that
debits another account;
force_transfer /
set_balance /
update_balance callable
without root; xtokens
WithdrawAsset from a
third-party sovereign
account; oracle
feed_values by a
non-member; vesting
claim_for that pays the
caller; payments
release / cancel by
the wrong party;
accept_and_pay that
pulls a requested
sender; NFT transfer
without ownership.
Result: no user-exploitable finding. Not submitted.
- Tokens
transfer/transfer_all/transfer_keep_aliveareensure_signedand debit that signer.do_transfersubtractsfrom.freeand respects frozen locks viaensure_can_withdraw.force_transferandset_balanceareensure_root. - Xtokens all six
transfer extrinsics
take
ensure_signed. XCM isprepare_and_executed asAccountIdToLocation(who), soWithdrawAssetpulls the signer's sovereign account. Destination deposit is the dest recipient, not the caller. - Currencies
transfer/transfer_native_currencydebit the signer.update_balanceisensure_root. - Oracle
feed_valuesrequires aMembersoperator or root (recorded asRootOperatorAccountId). Combined values come only from those authorized raw feeds. - Vesting
claimupdates the signer's lock. Permissionlessclaim_foronly refreshesdest's lock; it does not pay the caller.vested_transferneedsVestedTransferOriginand transfers from that origin. Schedule rewrite is root. - Payments
payreserves the signer's amount.releaseis the creator.cancelis the recipient and refunds the creator (or drops aPaymentRequestedrow).resolve_paymentis the stored resolver.request_paymentstores a request without pulling funds.accept_and_payreserves and settles the signer. - Auction
bidrecords the signer;Handler::on_new_biddecides acceptance (Acala auction-manager leftover already logged). - NFT
transfer/burnrequireinfo.owner. This crate has no public extrinsics (Acala NFT wrapper leftover already logged). - Unknown-tokens has
no public
extrinsics.
deposit/withdraware the XCMUnknownAssettrait. - Rewards has no public extrinsics. Share / claim helpers are used by the already-logged Acala incentives pallet.
- Asset-registry
register_asset/update_assetneedAuthorityOrigin.
Do not file
permissionless
claim_for lock
refresh, recipient
cancel that refunds
the creator, root
set_balance, or
XCM withdraw of the
signer's own
sovereign account as
stranger theft.
Not submitted.
Listed ORML leftover
that money-path
pallets open is
exhausted at the
opened-pallet level.
Remaining listed:
authority /
gradually-update /
parameters /
rate-limit /
xcm-support / xcm
/ traits support
crates (no user-fund
extrinsics).
2026-09-03: GMX leftover V1 Avalanche twins leftover (Sourcify)
Immunefi program
gmx ($5,000,000).
Arb V1 / V2 leftovers
already logged. This
slice is listed
Avalanche (chain
43114) twins that
Sourcify opens.
Extract /tmp/gmx-avax.
No mainnet writes.
Sourcify exact_match:
Router
0x5F719c2F1095F7B9Fc68a68e35B51194f4b6abe8,
GMX
0x62edc0692BD897D2295872a9FFCac5425011c661,
EsGMX
0xFf1489227BbAAC61a9209A08929E4c2a526DdD17,
Extended Gmx Tracker
0xB0D12Bf95CC1341d6C845C978daaf36F70b5910d
(RewardTracker),
Fee Glp Tracker
0xd2D1162512F927a7e282Ef43a362659E4F2a728F
(RewardTracker),
Staked Gmx Distributor
0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a,
Fee Gmx Distributor
0x03f349b3cc4f200d7fae4d8ddaf1507f5a40d356,
Fee Glp Distributor
0x1de098faf30bd74f22753c28db17a2560d4f5554,
Gmx Vester
0x472361d3cA5F49c8E633FB50385BfaD1e018b445,
Glp Vester
0x62331A7Bd1dfB3A7642B7db50B5509E57CA3154A,
Staked Glp
0x5643F4b25E36478eE1E90418d5343cb6591BcB9d,
Order Book
0x4296e307f108B2f583FF2F7B7270ee7831574Ae5.
Sourcify 404 (skip): Vault, Glp Manager, Reward RouterV2, GLP, BnGMX, USDG, most trackers, Bonus / Staked Glp distributors.
Files:
contracts/core/Router.sol,
contracts/core/OrderBook.sol,
contracts/staking/StakedGlp.sol,
contracts/staking/RewardTracker.sol,
contracts/staking/RewardDistributor.sol,
contracts/staking/Vester.sol,
contracts/gmx/GMX.sol,
contracts/gmx/EsGMX.sol,
contracts/tokens/MintableBaseToken.sol.
Checked for: a
stranger
pluginTransfer without
plugin approval;
OrderBook cancel that
refunds the caller
someone else's order;
stakeForAccount /
claimForAccount /
depositForAccount
without handler;
distribute paying a
non-tracker; GMX mint
by a non-minter;
StakedGlp transfer
during cooldown.
Result: no user-exploitable finding. Not submitted. Same types as already- reviewed Arb V1 contracts; Avax bytecode matches those gates.
- Router
swap/directPoolDepositpullmsg.sender.pluginTransfer/ plugin position helpers require a gov-listed plugin andapprovedPlugins[account][plugin]. - OrderBook create
binds
msg.senderand pulls that account viapluginTransfer. Cancel refundsmsg.sender's mapped order. Execute is permissionless settlement of that stored order. - RewardTracker
stake/unstake/claimbindmsg.sender.*ForAccountpaths are handler-only. - RewardDistributor
distributeisrewardTracker-only. Token withdraw / interval set are gov / admin. - Vester
deposit/claim/withdrawbindmsg.sender.depositForAccount/claimForAccount/transferStakeValuesare handler-only. - StakedGlp transfer
respects
glpManagercooldown, then handler-stakes to the recipient. - GMX / EsGMX
mint/burnareonlyMinter.setMinterisonlyGov.
Do not file
handler-gated
*ForAccount,
plugin-approved
pluginTransfer,
permissionless
order execute, or
gov minter mint as
stranger theft.
Not submitted. Listed Avax leftover that Sourcify opens is exhausted at the opened-contract level. Remaining listed: Sourcify-404 Vault / GlpManager / RewardRouterV2 / trackers / distributors, Arb Sourcify-404 Staked Glp Distributor, and same-type V2 utils.
2026-09-03: Kiln On-Chain v2 leftover (Sourcify)
Immunefi program
kiln / Kiln
On-Chain v2
($500,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Official
kilnfi staking
repos are 404.
Ethereum Sourcify
match on every
probed listed
hatcher, cub, and
implementation.
Nexus
0x8a113da63f02811e63c1e38ef615df94df5d9e70
is an ERC1967
proxy to
Nexus
0x0a08355d39a964010f1c23dd9791ec99a0131048.
Hatchers are
PluggableHatcher
beacons. Live
impls: vFactory
0x06beba9903cdb7b4806e2958581653c145a7e8d7,
vTreasury
0xa06634ed78c5121c2a3702b90b6e3926c7b2a641,
vPool
0xa4c04e7598c5147113b7b03f606b524c630143ce,
vWithdrawalRecipient
0x4b7f5f03f2624e120e5934b3b45fa328af610183,
vExecLayerRecipient
0xe2b0ae1eaddc234e36bc6f3af09f49905b1c8efe,
vCoverageRecipient
0x6cd5ddecb0caa51b8026c4ceaf06f3323210a903,
vOracleAggregator
0xe4dfefaff7f92c86c08107b3201270fa78885319,
vExitQueue
0xc57a4b65fc95befb4f29e81a03ff3feb037d3b0d.
Kiln factory cub
and Coinbase
Cloud cub share
factoryHatcher.
Kiln / Coinbase
pools share
poolHatcher.
Branded LSTs
(owsETH, ocsETH,
and the other
listed *ETH
wrappers) are
ERC1967 proxies
to Sourcify
exact_match
Native20
0x0843359cae1187b432eeb26e1b40c3a2b2374d7e.
No mainnet writes.
Extract
/tmp/kiln-v2.
Files:
src/PluggableHatcher.sol,
lib/utils.sol/src/Hatcher.sol,
lib/utils.sol/src/Cub.sol,
src/vFactory.sol,
src/vPool.sol,
src/vExitQueue.sol,
src/vOracleAggregator.sol,
src/vWithdrawalRecipient.sol,
src/vExecLayerRecipient.sol,
src/vCoverageRecipient.sol,
src/vTreasury.sol,
src/Nexus.sol,
src/Native20.sol,
src/MultiPool20.sol,
src/MultiPool.sol.
Checked for: a
stranger deposit
that sets another
owner; factory
withdraw /
setOwner without
the current owner;
pool share mint
to the caller on
someone else's
ETH; first-depositor
donation inflation
via injectEther;
exit-queue claim
that pays the
caller; recipient
pull to a
non-pool; oracle
submitReport by
a non-member;
Native20 stake /
requestExit
mis-attribution;
Nexus spawnPool
by a stranger;
Cub
___initializeCub
hijack.
Result: no user-exploitable finding. Not submitted.
- vFactory
depositisonlyDepositor(wc)and writesownerfrom the calldata of that allowed depositor (the pool passesaddress(this)).setOwner/setFeeRecipient/exit/_withdrawrequired.owner == msg.sender. Dedicated-channel withdraw deploys the CREATE2 minimal recipient and paysrecipientfrom the owner call. - vPool
depositisonlyDepositorand mints tomsg.sender. First0.1 etherof underlying mints 1:1, thenmulDiv.injectEtheris recipient / exit queue only.transferSharesmovesmsg.sender.purchaseValidatorsis permissionless but spends the pool's committed ETH into the factory. - vExitQueue
claimis permissionless and paysownerOf(ticket). Tickets mint to the share sender or a packed 20-byte recipient the sender chose.pullisonlyPool. - Recipients
pull/cover/requestTotalExitsareonlyPool. CoverageremoveEther/removeSharesare admin. Treasurywithdrawis operator or global recipient. - Oracle
submitReportisonlyOracleMemberand needs quorum beforevPool.report. - Nexus
spawnFactory/spawnPool/ hatcher replace areonlyAdmin. - Native20
stakemints wrapper shares tomsg.sender.requestExitburnsmsg.senderand prints exit tickets tomsg.sender. - Cub
___initializeCubis same-tx after CREATE2 from the hatcher.hatch/plugare admin / nexus. Upgrade / global fixdelegatecallis hatcher admin.
Do not file
admin / operator /
oracle-quorum /
treasury
commission, or
permissionless
purchaseValidators
/ claim of a
correctly-owned
ticket, as
stranger theft.
Not submitted. Payment requires user KYC. Listed Kiln On-Chain v2 smart-contract leftover is exhausted at the opened-contract level.
2026-09-03: Kamino leftover klend + kvault (a087609 / 1d146d7)
Immunefi program
kamino
($1,500,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Official
clones
/tmp/kamino-klend
a087609 (release
1.25.0) and
/tmp/kamino-kvault
1d146d7 (release
2.2.2). Listed
program IDs:
KLend
KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD,
KVault
KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd.
No mainnet
interaction.
Files:
programs/klend/src/handlers/handler_deposit_reserve_liquidity.rs,
handler_deposit_obligation_collateral.rs,
handler_withdraw_obligation_collateral.rs,
handler_borrow_obligation_liquidity.rs,
handler_liquidate_obligation_and_redeem_reserve_collateral.rs,
handler_initiate_obligation_ownership_transfer.rs,
handler_approve_obligation_ownership_transfer.rs,
handler_accept_obligation_ownership_transfer.rs,
programs/klend/src/lending_market/lending_operations.rs,
programs/kvault/src/handlers/handler_deposit.rs,
handler_withdraw.rs.
Checked for: a
stranger withdraw
of another
obligation's
collateral; borrow
without the
obligation owner;
healthy-position
liquidation;
ownership
accept without
being
pending_owner;
vault deposit that
mints shares to
someone else while
pulling a victim
ATA; vault
withdraw that
burns another
user's shares.
Result: no user-exploitable finding. Not submitted.
- Reserve deposit
pulls
user_source_liquiditywithowneras the SPL authority and mints cTokens to the destination ATA the signer passed. - Obligation
deposit /
withdraw /
borrow use
has_one = ownerand a signerowner. Withdraw destination ATAtoken::authority = owner. - Liquidation
calls
assert_obligation_liquidatablethencalculate_liquidation. LTV override is staging-only and only when liquidator == owner. - Ownership
initiate is
current owner.
Approve is
global_admin. Accept requirespending_ownersigner. - Vault deposit /
withdraw:
usersigner, user token and share ATAstoken::authority = user. Deposit mints to that ATA. Withdraw pays that ATA.
Do not file admin fee / referrer / protocol-fee withdraw, or permissionless liquidation of an unhealthy obligation, as stranger theft.
Not submitted. Payment requires user KYC. Listed Kamino klend + kvault money-path leftover is exhausted at the opened-handler level. Remaining listed: Scope oracle, KFarms, Kamino Liquidity, and the listed third-party oracle interfaces (Meteora / JUP perp / RedStone / Securitize / Switchboard / Adrena).
2026-09-03: Ostium leftover keepers / registry leftover (Sourcify)
Immunefi program
ostium
($200,000, kyc: true).
Vault / trading leftover
already logged. This
slice is the remaining
listed keepers,
registry, routers,
pair stores, verifier,
timelock, and
LockedDepositNft.
Extract
/tmp/ostium-keep.
No mainnet writes.
Sourcify (Arb
42161):
Registry
0x799a139aE56e11F0476aCE2f6118CfcAed9608d2
(match,
OstiumRegistry);
TimelockOwner
0xeB85dC6095c74D36500C9cdcaCc15EcDC223Bbf7
(match,
OstiumTimelockOwner);
LockedDepositNft
0xb4f1123BE58f5d69E1cf565ED8756C7fcf31c8D3
(match);
Verifier
0xd456939e54F68Ef9B0BE62aBB2EC4A37397Cb814
(exact_match,
OstiumVerifier);
OpenPnlFeed proxy
0xE607aC9FF58697c5978AfA1Fc1C5C437a6D1858c
impl
0x2Ce8Cd263DDc784F554196840bb70AB3a2ffF969
(OstiumOpenPnl);
PrivatePriceUpKeep
proxy
0xB71ec9eBD8145daCaCF6724363143cb5667A3d36
impl
0x0aEBC4094B60Ea4E21E937E80DafDD58C07C5ebB;
TradesUpKeep proxy
0x959Da1452238F71F17f7DA5dbA2e9c04FEf57324
impl
0x49BcCc51fb6a80F86a5aaA9Bd7DF07040Dfb4CC2;
PriceUpKeep proxy
0x52B2a78E12b09B66C6c8ce291D653D40bAb77f0c
impl
0x95b0511e8FB69E9940d82fBdD186a41aeD9ffDd9;
PriceRouter proxy
0x52453FBC4A33F7A2A0a01d67B952625816f161b4
impl
0xb22d4f94194Bf9c932CF34605ba2D2E0075ecDE5;
PairInfos proxy
0x3890243a8fc091c626ed26c087a028b46bc9d66c
impl
0xAA87e13f153d417E6a613E103bfD9a14f07ecb74;
PairsStorage proxy
0x260E349F643f12797fDc6f8c9d3df211D5577823
impl
0x15b4b5A08a37fC9e0dc50550D1284a2aEEa081A6.
Files:
OstiumRegistry.sol,
OstiumTimelockOwner.sol,
OstiumLockedDepositNft.sol,
src/OstiumVerifier.sol,
src/OstiumOpenPnl.sol,
src/OstiumPrivatePriceUpKeep.sol,
src/OstiumTradesUpKeep.sol,
src/OstiumPriceUpKeep.sol,
src/OstiumPriceRouter.sol,
src/OstiumPairInfos.sol,
src/OstiumPairsStorage.sol.
Checked for: a
stranger
performUpkeep that
settles without a
forwarder; getPrice
that is not
router/trading-only;
verify that accepts
an unauthorized
signer; OpenPnl /
PairInfos writers
callable by anyone;
NFT mint not
vault-only; registry
registerContract
without gov.
Result: no user-exploitable finding. Not submitted.
- Price / private
price / trades
performUpkeeprequireisForwarder(timelock registers; gov unregisters). Price fulfill needs a Chainlink verifier report whose feed id and timestamp match the router-created order. Private fulfill needsOstiumVerifierecrecoverof an authorized signer. - PriceRouter
getPriceisonlyTrading. PriceUpKeepgetPriceisonlyRouter. - Verifier
verifyis view-only and rejects non-authorized signers. Signer set isonlyGov. - OpenPnl
updateAccTotalPnl/ closed rollover areonlyCallbacks. Acc rollover isonlyPairInfos. - PairInfos fee
writes are gov /
manager.
storeTradeInitialAccFeesandupdateDynamicSpreadStateareonlyCallbacks. - PairsStorage
add/update pair /
fee / leverage are
onlyGov.updateGroupCollateralis callbacks or trading. - Registry
register / update
is
onlyGov. Role set isonlyOwner. - LockedDepositNft
mint/burnareonlyVault. Transfers are standard ERC721 owner / approval. - Timelock is OZ
TimelockController(schedule / execute behind roles). - PriceUpKeep
withdrawEthisonlyGov.
Do not file forwarder-gated settlement, trading- only price request, gov pair config, or vault-only NFT mint as stranger theft.
Not submitted. Payment requires user KYC. Listed Ostium leftover that Sourcify opens is exhausted at the opened-contract level. Remaining listed: the web / Telegram apps.
2026-09-03: Decentraland leftover marketplace, bid, and rentals
Immunefi program
decentraland
($500,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Official
clone
/tmp/dcl-marketplace
32d17b0. Bid
Sourcify flatten
/tmp/dcl-src/Bid
plus official
/tmp/dcl-bid
ef7def6. Rentals
implementation
Sourcify
exact_match
/tmp/dcl-src/RentalsImpl.
Marketplace proxy
0x8e5660b4ab70168b5a6feea0e0315cb49c8cd539
OZ2 impl
0x19a8ed4860007a66805782ed7e0bed4e44fc6717
(Sourcify
match). Bid
0xe479dfd9664c693b2e2992300930b00bfde08233
(Sourcify
match, target
ERC721Bid).
Rentals proxy
0x3a1469499d0be105d4f77045ca403a5f6dc2f3f5
impl
0xe90636e24d8faf02aa0e01c26d72dab9629865cb.
No mainnet writes.
Files:
contracts/marketplace/Marketplace.sol,
ERC721Bid.sol,
contracts/Rentals.sol.
Checked for: a
stranger
createOrder on
someone else's
NFT; cancelOrder
by a non-seller;
executeOrder
that pays the
caller as seller
or pulls the NFT
without payment;
bid accept that
pays a non-owner
or sends the NFT
to the caller;
rental claim by
a non-lessor;
acceptListing
without a valid
lessor signature.
Result: no user-exploitable finding. Not submitted.
- Marketplace
createOrderrequires_msgSender() == ownerOf(assetId)and marketplace approval.cancelOrderis seller or contract owner.executeOrderpulls MANA from the buyer to the stored seller (minus owner cut) andsafeTransferFromseller to buyer. Price must match the stored order. - Bid
_placeBidrecordsmsg.sender.cancelBidlooks up the caller's bid. Accept isonERC721Receivedfrom the NFT: pays MANA from bidder to_fromand transfers the NFT tobid.bidder. - Rentals
acceptListingverifies the listing signer and pays tenant MANA to lessor + fee collector.claimrequireslessor == _msgSender()and!getIsRented.
Do not file
marketplace owner
cut, admin
cancelOrder, or
permissionless
accept of a
correctly priced
listing / bid, as
stranger theft.
Not submitted. Payment requires user KYC. Listed Decentraland marketplace / bid / rentals leftover is exhausted at the opened-contract level. Remaining listed: MANA, LAND / ESTATE proxies, name registrar / controller, Collections V1/V2, vesting factories, and Polygon MANA / collections.
2026-09-03: Kamino leftover Scope + KFarms leftover (fe53523 / bfa1860)
Immunefi program
kamino
($1,500,000, kyc: true).
klend + kvault leftover
already logged. This
slice is listed Scope
oracle and KFarms.
Official clones
/tmp/kamino-scope
fe53523 (release
0.41.0) and
/tmp/kamino-kfarms
bfa1860 (release
1.7.0). Listed program
IDs:
Scope
HFn8GnPADiny6XqUoWE8uRPPxb29ikn4yTuPa9MF2fWJ,
KFarms
FarmsPZpWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr.
No mainnet
interaction.
Files:
programs/scope/src/lib.rs,
programs/scope/src/handlers/handler_refresh_prices.rs,
handler_update_mapping_and_metadata.rs,
handler_freeze_price.rs,
programs/scope/src/program_id.rs,
programs/kfarms/src/lib.rs,
programs/kfarms/src/handlers/handler_stake.rs,
handler_unstake.rs,
handler_harvest_reward.rs,
handler_withdraw_unstaked_deposits.rs,
handler_deposit_to_farm_vault.rs,
handler_withdraw_from_farm_vault.rs,
handler_withdraw_treasury.rs,
handler_withdraw_reward.rs,
handler_set_stake_delegated.rs,
handler_reward_user_once.rs.
Checked for: a
stranger refresh
that writes a price
without a source
oracle; mapping
update without
admin; farm stake
that pulls another
ATA; harvest that
pays the caller;
withdraw_unstaked
of another user's
deposits; vault
withdraw without
withdraw authority.
Result: no user-exploitable finding. Not submitted.
- Scope
refresh_price_listis permissionless and copies from mapped source accounts (Pyth / Switchboard / CLMM / etc.). Frozen entries skip. Mapping / metadata updates requireconfiguration.admin. Freeze / resume needcan_freeze/can_resume. - Scope
*-itfcrates are type bindings to listed third- party program IDs (Meteora / JUP perp / RedStone / Securitize / Switchboard / Adrena / SBoD). They have no money-path instructions. - KFarms
stakepullsuser_atawithownersigner anduser_state.has_one = owner.unstake/withdraw_unstaked_depositsbind that owner and payuser_ata(has_one = owner). harvest_rewardpaystoken::authority = user_state.owner. Ifis_harvesting_permissionlessa stranger payer must still use the owner's ATA.deposit_to_farm_vaultisfarm_admin.withdraw_from_farm_vaultiswithdraw_authority.withdraw_rewardisfarm_admin.withdraw_treasuryisglobal_admin.set_stake_delegatedandreward_user_oncerequire the farmdelegate_authority.
Do not file permissionless oracle refresh from mapped sources, permissionless harvest-to-owner ATA, or admin / delegate farm withdraw as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed Scope +
KFarms leftover
that official
GitHub opens is
exhausted at the
opened-handler
level. Remaining
listed: Kamino
Liquidity program
(6LtLpnUF…; no
public program
repo, only
kliquidity-sdk)
and the website.
2026-09-03: Folks Finance leftover spoke + hub loan (7f631fe)
Immunefi program
folksfinance
($200,000, kyc: true).
Unique unused
standing program.
Listed assets are
docs URLs; in-scope
is Exact Match
Verified code from
folks-finance-xchain-contracts.
Official clone
/tmp/folks-xchain
7f631fe. No live
Sourcify address
match this pass.
No mainnet writes.
Files:
contracts/spoke/SpokeToken.sol,
contracts/spoke/SpokeErc20Token.sol,
contracts/spoke/SpokeCommon.sol,
contracts/hub/Hub.sol,
contracts/hub/LoanManager.sol,
contracts/hub/AccountManager.sol.
Checked for: a
spoke deposit that
credits another
account while
pulling the
caller; hub
withdraw / borrow
without loan
ownership; hub
directOperation
fToken withdraw to
a stranger;
liquidation that
moves a healthy
loan.
Result: no user-exploitable finding. Not submitted.
- Spoke
deposit/repay/createLoanAndDepositpullmsg.sendervia_receiveTokenand set payloaduserAddresstomsg.sender. Hub_receiveMessagerequires that address is registered toaccountIdon the source chain. LoanManagerdeposit / withdraw / borrow / repay areHUB_ROLEandisUserLoanOwner.- Hub
directOperationneedsverifyCallerPermissionOnHub(registered or delegate).withdrawFTokenpaysmsg.sender.liquidateuses the caller'saccountIdas liquidator and requires that account ownsliquidatorLoanId. - Spoke
SendTokenaccepts only the hub and payspayload.userAddress.
Do not file admin listing / fee claim, or permissionless liquidation of an undercollateralised loan into the liquidator's own loan, as stranger theft.
Not submitted. Payment requires user KYC. Listed Folks Finance spoke + hub loan leftover is exhausted at the opened-file level. Remaining listed: Exact Match live addresses if docs resolve them, hub pools, oracle nodes, and bridge adapters (Wormhole / CCIP).
2026-09-03: Variational leftover SettlementPool factory (exact_match)
Immunefi program
variational
($100,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Arb
Sourcify
exact_match on
listed factory
0x0F820B9afC270d658a9fD7D16B1Bdc45b70f074C
target
SettlementPoolFactory.
Extract
/tmp/variational-src/Factory
includes
SettlementPool.sol
from that
verification.
Listed OLP vault
0x74bbbb0e7f0bad6938509dd4b556a39a4db1f2cd
and treasury
0x5e91b40467fb8902c46a7b6cb90482363188d645
Sourcify 404.
No official
public contracts
repo found. No
mainnet writes.
Files:
src/SettlementPoolFactory.sol,
src/SettlementPool.sol.
Checked for: a
stranger
createPool that
pulls a victim's
USDC; pool
initialize
hijack;
depositUSDC that
pulls another
party;
withdrawUSDC /
withdrawFees by
a non-oracle to
the caller.
Result: no user-exploitable finding. Not submitted.
createPoolis owner or oracle. Optional creation fee istransferFrom( feePaidBy, feeRequestor)(needs allowance). Clone +initializein the same transaction.initializerequiresmsg.sender == factoryandfactory == 0.depositUSDCisonlyPartiesand pullsmsg.sender. Atomic / on- behalf deposits areonlyOracleand pull addresses that approved the pool.withdrawUSDCisonlyOracleand pays arequestorthat must be creator orotherAddresses.withdrawFeesisonlyOracle.
Do not file oracle-gated settlement withdraw / fee sweep, or factory owner pool create, as stranger theft.
Not submitted. Payment requires user KYC. Listed Variational SettlementPool factory leftover is exhausted at the opened-file level. Remaining listed: OLP vault and treasury (Sourcify 404), and the web / Omni apps.
2026-09-03: Velodrome leftover Router + Pool (b3065d8)
Immunefi program
velodromefinance
($100,000, kyc: true).
Unique unused
standing AMM
program. Not
previously logged
(0x Settler
Velodrome adapter
is a different
program). Official
clone
/tmp/velo-contracts
b3065d8. Optimism
Sourcify match
on listed Router
0xa062aE8A9c5e11aaA026fc2670B0D65cCc8B2858,
PoolFactory
0xF1046053aa5682b4F9a81b5481394DA16BE5FF5a,
and Voter
0x41C914ee0c7E1A5edCD0295623e6dC557B5aBf3C.
No mainnet writes.
Files:
contracts/Router.sol,
contracts/Pool.sol.
Checked for: a
router swap that
pulls a victim
while sending
output to the
caller; LP
removeLiquidity
that burns
another user's
shares; pool
swap that
violates K;
permissionless
skim of
reserves.
Result: no user-exploitable finding. Not submitted.
- Router
add / remove /
swap pull
_msgSender()(ERC2771 trusted forwarder) and mint / send output to thetoargument. Routes must resolve through an approved factory CREATE2 pool. - Pool
mintcreditstofrom the reserve delta. First mint locksMINIMUM_LIQUIDITYataddress(1).burnpaystofrom LP sitting on the pool. swappays out then requires_k(balance) >= _k(reserve)after fees. Flash callback is toto.skimsends onlybalance - reserve.
Do not file
trusted-forwarder
meta-tx, user-
supplied
UNSAFE_swap
amounts, or
permissionless
skim of donated
excess, as
stranger theft.
Not submitted. Payment requires user KYC. Listed Velodrome Router + Pool leftover is exhausted at the opened-file level. Remaining listed: Voter, gauges, distributor, minter, VELO, VotingEscrow, sink stack, and reward factories.
2026-09-03: Velodrome leftover Voter + VotingEscrow (b3065d8)
Immunefi program
velodromefinance
($100,000, kyc: true).
Router + Pool
leftover already
logged. This slice
is listed Voter
0x41C914ee0c7E1A5edCD0295623e6dC557B5aBf3C
and VotingEscrow
0xFAf8FD17D9840595845582fCB047DF13f006787d.
Same official
clone
/tmp/velo-contracts
b3065d8. Optimism
Sourcify match
on Voter from the
prior pass. No
mainnet writes.
Files:
contracts/Voter.sol,
contracts/VotingEscrow.sol.
Checked for: a
stranger vote /
reset on
someone else's
veNFT;
withdraw that
pays the caller
without owning
the lock;
merge that burns
a victim NFT;
depositManaged
without approval.
Result: no user-exploitable finding. Not submitted.
- Voter
vote/reset/poke/depositManaged/withdrawManagedrequireve.isApprovedOrOwner(_msgSender(), tokenId). createLockmints to_msgSender()and pulls that sender's VELO.increaseAmount/increaseUnlockTime/withdraw/mergerequire approved-or- owner on each tokenId.withdrawburns the NFT and payssender.depositForon a managed NFT is distributor- only. On a normal NFT it is a donation into that lock.withdrawManagedon the escrow isvoteronly.
Do not file
permissionless
depositFor
donation into an
existing lock, or
approved-operator
vote / withdraw,
as stranger
theft.
Not submitted. Payment requires user KYC. Listed Velodrome Voter + VotingEscrow leftover is exhausted at the opened-file level. Remaining listed: gauges, distributor, minter, VELO, sink stack, and reward factories.
2026-09-03: Velodrome leftover Gauge + RewardsDistributor (b3065d8)
Immunefi program
velodromefinance
($100,000, kyc: true).
Router / Pool /
Voter /
VotingEscrow
leftovers already
logged. This slice
is listed
Distributor
0x9D4736EC60715e71aFe72973f7885DCBC21EA99b
and the Gauge
implementation
used by
GaugeFactory
0x8391fE399640E7228A059f8Fa104b8a7B4835071.
Same official
clone
/tmp/velo-contracts
b3065d8. No
mainnet writes.
Files:
contracts/gauges/Gauge.sol,
contracts/RewardsDistributor.sol.
Checked for: a
stranger
withdraw of
another staker's
LP; getReward
that pays the
caller; rebase
claim that
sends VELO to
the caller
instead of the
veNFT owner.
Result: no user-exploitable finding. Not submitted.
- Gauge
withdrawdecreasesbalanceOf[sender]and payssender.getRewardrequires_msgSender() == accountor voter, and transfers to_account.depositpulls the sender and credits_recipient(donation).notifyRewardAmountis voter-only. - RewardsDistributor
claim/claimManyare permissionless. Expired locks payve.ownerOf. Active locks callve.depositForon that tokenId.
Do not file permissionless rebase claim that credits the correct lock / owner, or staking LP into another recipient, as stranger theft.
Not submitted. Payment requires user KYC. Listed Velodrome Gauge + RewardsDistributor leftover is exhausted at the opened-file level. Remaining listed: minter, VELO, sink stack, and reward factories.
2026-09-03: Granite leftover money-path leftover (Hiro)
Immunefi program
granite-protocol
($100,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Two live
Stacks markets from
the unofficial
asset list: aeUSDC
market
SP26NGV9AFZBX7XBDBS2C7EC7FCPSAV9PKREQNMVS
- state
SP35E2BBMDT2Y1HB0NTK139YBGYV3PAPK3WA8BRNA(publish height 2853789 / 503684) and usdCx marketSP3M2BYF7RGF8WKW5FVDNJ6WR8D7AR9BHDXAKPXZE(publish height 5466162). Official repoGraniteProtocol/core-v1at518603e. Source pulled read-only from Hiro (/tmp/granite-src). No mainnet writes.
Files:
borrower-v1,
liquidity-provider-v1,
flash-loan-v1,
liquidator-v1,
state-v1,
withdrawal-caps-v1,
staking-v1,
math-v1,
linear-kinked-ir-v1,
staking-reward-v1.
Checked for: a
stranger LP
deposit /
withdraw that
mints or burns
another account's
shares; first-
depositor share
inflation via
donation;
borrow /
add-collateral /
remove-collateral
that move a
victim's position
without
tx-sender;
repay that
pulls a non-payor;
flash-loan that
skips repay;
liquidation of a
healthy account
or same-block
borrow; staking
finalize-unstake
that pays a
non-owner ticket.
Result: no user-exploitable finding. Not submitted.
- State
add-assets/remove-assets/transfer-from/transfer-to/ borrow / repay / collateral / liquidate writers requireallowed-contracts. LP deposit pullscontract-callerand mints the named recipient. Withdraw / redeem burncontract-callershares (withdraw rounds shares up; redeem rounds assets down) and pay the named recipient. Share price uses thetotal-assetsvar, not the raw SIP-010 balance, so a donation does not inflate shares.increase-total-assetsis testnet-only. The newer usdCx LP also rejects a 1-asset first deposit. borrow/add-collateral/remove-collateralbindmaybe-usertotx-sender(elsecontract-caller). Collateral add pullsuser. Collateral remove and borrow payuserafter an LTV check on Pyth prices.repaymay nameon-behalf-ofbut pullscontract-caller.- Flash loan
transfers the
market asset to
contract-caller, callbacks an allow-listed (or governance-enabledallow-any) contract, then pulls principal plus fee. Fee config is governance-only. - Liquidation
requires health
< 1.0, a later block thanborrowed-block, and post-health<= 1.005. Collateral payscontract-caller; repay pulls the liquidator. Same-block liquidation is rejected. - Withdrawal caps are LP / borrower / liquidator callers only. Bucket refill and decay are not a theft path.
- Staking
stakepulls LP fromcontract-caller.initiate-unstakeburns that caller's staked LP and writes the ticket under the caller.finalize-unstakepays only that caller's ticket afterfinalization-at.increase-lp-staked-balance/ slash are allowed-contract only.
Do not file governance pause / reserve withdraw / allowed-contract admin, Pyth feed updates signed by Pyth, or permissionless liquidation of an unhealthy account as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Hiro opens for these money- path types is exhausted at the opened-contract level. Remaining listed: governance / meta-governance (large admin trees), listed Pyth + Wormhole adapter rows (third-party), and the website.
2026-09-03: FBTC leftover ETH FireBridge + minter leftover (Sourcify)
Immunefi program
fbtc ($100,000,
kyc: true). Unique
unused standing
program. Ethereum
Sourcify
exact_match on
listed FireBridge
proxy
0xbee335BB44e75C4794a0b9B54E8027b111395943
(impl
0xC5E2f85CB57350d3aE918d8B038f891f8ED6f6E5
FireBridge),
FBTCMinter
0x80b534D4bB3D809FbDA809DCB26D3f220634AED7,
FBTC
0xC96dE26018A54D51c097160568752c4E3BD6C364,
FeeModel
0xd12D39E682715a40dbC860fa07F02bF48841294e,
FBTCGovernorModule
0x09e4c43eD89E5972df026d94FdA3a7680637c59A,
and LockedFBTCFactory
proxy
0x722b9348712418469DD6bb6c92C2560072537584
(impl
0x9cDC53dbcA3a2862708a12dCF8e311A8387b7f13
LockedFBTCFactory,
bundled
LockedFBTC.sol).
Extract /tmp/fbtc-src.
No mainnet writes.
Files:
contracts/FireBridge.sol,
contracts/FBTCMinter.sol,
contracts/FBTC.sol,
contracts/base/FToken.sol,
contracts/FeeModel.sol,
contracts/FBTCGovernorModule.sol,
src/LockedFBTCFactory.sol,
src/LockedFBTC.sol.
Checked for: a
stranger
addMintRequest
that mints to the
caller; addBurnRequest
/ cross-chain that
burns a victim;
confirmMintRequest
that is not
minter-gated;
FToken.mint /
burn without the
bridge; LockedFBTC
confirmRedeemFbtc
that pays a
non-minter.
Result: no user-exploitable finding. Not submitted.
FToken.mint/burn/payFeeareonlyBridge.- FireBridge
addMintRequest/addBurnRequestareonlyActiveQualifiedUser. Mint dest ismsg.sender. Burn / cross-chain burnmsg.senderafter the fee pull. Deposit txids are one-shot. confirmMintRequest/confirmBurnRequest/confirmCrosschainRequestareonlyMinter. FBTCMinter forwards those underMINT_ROLE/BURN_ROLE/CROSSCHAIN_ROLE. Cross-chain confirm mints the encodeddstAddressafter the source-hash check.- FeeModel
setters are
onlyOwner. Governor module pause / lock / qualified-user / fee updates are owner or named roles. - LockedFBTC
mint / redeem /
confirm / burn
are
MINTER_ROLE.mintLockedFbtcRequestpullsmsg.senderFBTC, thenaddBurnRequestas the wrapper (must already be a qualified user).confirmRedeemFbtcburns the caller's locked tokens and pays that caller. Transfers are disabled.createLockedFBTCis permissionless but the new wrapper cannot burn through FireBridge until owner adds it as a qualified user.
Do not file qualified-user mint/burn, minter-role confirm, owner qualified-user admin, or permissionless factory deploy of an isolated wrapper as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens on Ethereum for these types is exhausted. Remaining listed: other-chain FireBridge / Minter / FBTC / FeeModel twins (same types).
2026-09-03: Gearbox leftover core-v3 pool + credit leftover (510fc65)
Immunefi program
gearbox ($150,000,
kyc: true). Unique
unused standing
program. Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md.
This slice is
core-v3 510fc65
(main): PoolV3,
CreditFacadeV3,
CreditManagerV3,
CreditAccountV3.
AddressProvider
0xF7f0a609BfAb9a0A98786951ef10e5FE26cC1E38
is Sourcify match
(not a proxy).
Clone
/tmp/gearbox-core.
No mainnet writes.
Files:
contracts/pool/PoolV3.sol,
contracts/credit/CreditFacadeV3.sol,
contracts/credit/CreditManagerV3.sol,
contracts/credit/CreditAccountV3.sol.
Checked for: a
stranger ERC-4626
withdraw that
burns another
owner without
allowance; pool
lendCreditAccount
from a non-manager;
facade
multicall /
closeCreditAccount
on a victim
account;
addCollateral
that pulls a
non-caller;
CreditAccount
execute /
safeTransfer
without the
manager;
liquidation of a
healthy
non-expired
account.
Result: no user-exploitable finding. Not submitted.
- Pool
deposit/mintpullmsg.senderand mintreceiver.withdraw/redeemburnownerafter_spendAllowancewhenmsg.sender != owner. First- depositor note in the header requires dead shares before borrowing. lendCreditAccounttransfers to the named account only ifmsg.senderhas a credit-manager debt slot under its limit.repayCreditAccountreverts when that slot'sborrowed == 0.- Facade
closeCreditAccount/multicallrequiremsg.sender == borrower.botMulticallrequires a non-zero approved bot permission.openCreditAccountassignsonBehalfOf(degen-NFT mode forcesmsg.sender). - Manager
open / close /
liquidate /
addCollateral /
withdrawCollateral
/
externalCallarecreditFacadeOnly.addCollateralpulls the facade- suppliedpayer(facade passesmsg.sender). Adapterexecute/approveCreditAccountrequire a registered adapter and an active account. - CreditAccount
safeTransfer/executeare manager-only.rescueis factory-only. - Liquidation
requires
unhealthy or
expired. Partial
liquidation
pulls the
liquidator's
underlying and
seizes
discounted
collateral to
to.
Do not file
opening an
account
onBehalfOf
someone else,
permissionless
liquidation of an
unhealthy /
expired account,
or ACL pause /
configurator as
stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
core-v3 opens
for these types
is exhausted at
the opened-file
level. Remaining
listed: oracles-v3,
integrations-v3,
bots-v3,
permissionless,
and periphery-v3
emergency / kyc /
migration.
2026-09-03: Burrow leftover main contract leftover (0dbfa18)
Immunefi program
burrow ($250,000,
kyc: true). Unique
unused standing
program. Listed
asset is
contract.main.burrow.near.
Official repo
NearDeFi/burrowland
at 0dbfa18. Clone
/tmp/burrowland.
No mainnet writes.
Files:
contract/src/actions.rs,
contract/src/fungible_token.rs,
contract/src/price_receiver.rs,
contract/src/booster_staking.rs.
Checked for: a
stranger
execute /
ft_on_transfer
that withdraws
another account;
oracle_on_call
from a non-oracle;
liquidation of a
healthy account;
force_close that
pays the caller.
Result: no user-exploitable finding. Not submitted.
executeis one-yocto and loadspredecessor. Withdraw burns that account's supplied shares andft_transfers to the same account. Borrow / decrease- collateral require a post- action health check (max_discount == 0) and need prices, so they fail on the emptyPrices::new()path.ft_on_transfercreditssender_idfor the predecessor token, then optionallyExecutes as that sender (same empty prices).DepositToReserveincreasesreserved.oracle_on_callrequirespredecessor == oracleand recency / staleness checks, then executes assender_id.Liquidatecannot target self. Victim must havemax_discount > 0. In-assets repay from the liquidator's supplied shares; out- assets move discounted collateral to the liquidator. Post-health must stay at risk and improve.ForceCloseis config-gated and requires borrowed > collateral. It moves collateral intoreservedand does not pay the caller.- Booster
stake / unstake
bind
predecessor.
Do not file permissionless liquidation of an at-risk account, oracle-gated priced actions, or reserve force-close as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
burrowland opens
is exhausted at
the opened-file
level. Remaining
listed: none on
the unofficial
dump (single
NEAR contract).
2026-09-03: Decentraland leftover MANA, LAND, and ESTATE
Immunefi program
decentraland
($500,000, kyc: true).
Marketplace / bid /
rentals leftover
already logged.
This slice is
listed MANA +
LAND / ESTATE
proxies. Official
clone
/tmp/dcl-land
c820aa1. MANA
Sourcify match
/tmp/dcl-src/mana/MANAToken.sol.
LAND proxy
0xF87E31492Faf9A91B02Ee0dEAAd50d51d56D5d4d
(LANDProxy.sol,
Sourcify match).
Live LAND
application
0x554BB6488bA955377359bED16b84Ed0822679CDC
(Sourcify match,
flatten
/tmp/dcl-src/land-impl).
Estate proxy
0x959e104E1a4dB6317fA58F8295F586e1A978c297
(ZeppelinOS,
impl
0xDCF39b96B4DF02FF98fC6f3916D41f782ff59f7f,
Sourcify
exact_match,
/tmp/dcl-src/estate-live).
erc821
FullAssetRegistry /
ERC721Base
transfer path
from official
decentraland/erc821.
No mainnet writes.
Files:
MANAToken.sol,
LANDRegistry.sol,
EstateRegistry.sol,
ERC721Base.sol.
Checked for: a
stranger mint of
MANA; transferFrom
that spends without
allowance; LAND
assignNewParcel by
a non-deployer;
transferLand /
transferFrom of
someone else's
parcel; Estate
mint /
onERC721Received
from a non-LAND
registry; Estate
transferLand by a
non-owner; XOR
fingerprint collision
used as stranger
theft against a
marketplace bid.
Result: no user-exploitable finding. Not submitted.
- MANA
mintisonlyOwner.burnsubtracts the caller's own balance.transfer/transferFromarewhenNotPaused.transferFromdeductsallowed[from][msg.sender].approverequires a zero reset (known ERC20 race, not stranger theft). - LAND
assignNewParcelisonlyDeployer.transferFromforbidsto == estateRegistry(must usetransferLandToEstate). Overridden_doTransferFromclearsupdateOperatorthen calls erc821onlyAuthorized(owner, token approval, or operator).transferLandToEstatealso requiresestateRegistry.ownerOf(estateId) == msg.sender.updateLandDatais metadata only.registerBalanceis the caller's own MiniMe accounting token. - Estate
mintandonERC721ReceivedareonlyRegistry._transferLandiscanTransfer(owner or approved).transferFromrejects an empty Estate and updates MiniMe thensuper.transferFrom. LiveverifyFingerprintacceptsgetFingerprintV2first. Legacy XORgetFingerprintis fallback only before1795705200and only for estates with fewer than 19 LANDs. XOR collision is documented in the live implementation as unsafe.
Do not file owner-gated MANA mint / pause, known ERC20 approve-zero reset, deployer LAND assign, update-operator metadata edits, own-account MiniMe register, or XOR fingerprint fallback during the documented transition window (seller- controlled composition), as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed
Decentraland
MANA / LAND /
ESTATE leftover
is exhausted at
the opened-contract
level. Remaining
listed: name
registrar /
controller
(DCLRegistrar
0x2A1874…ACb8,
DCLController
0x684329…0772),
Collections
V1/V2
(ERC721Collection
0xc04528…5CDd /
0xeCf073…01b1),
vesting
factories, and
Polygon MANA /
collections.
2026-09-03: Babylon leftover vigilante + covenant leftover (9a4c506 / 4e7ffcd)
Immunefi program
babylon-labs
($500,000, kyc: true).
Unique unused
standing program.
Listed DLT assets
include
vigilante
release/v0.24.x and
covenant-emulator
release/v0.16.x.
Official clones
/tmp/babylon-vigilante
9a4c506 and
/tmp/babylon-covenant
4e7ffcd. No chain
writes from this VM.
Files:
btcstaking-tracker/btcslasher/slasher.go,
btcstaking-tracker/stakingeventwatcher/stakingeventwatcher.go,
covenant/covenant.go,
covenant-signer/signerapp/signer.go,
covenant-signer/signerservice/middlewares/hmac_auth.go.
Checked for: a
covenant signature
on a slashing tx
that does not
match
params.SlashingPkScript;
unbonding fee /
time mismatches
that still get
signed; slasher
that spends a
delegation without
extracted FP key
evidence;
unbonding watcher
that reports a
spend without an
inclusion proof.
Result: no user-exploitable finding. Not submitted.
- Covenant
AddCovenantSignaturesskips delegations that already have quorum, have unbonding time !=UnbondingTimeBlocks, or sit outside min/max staking time / value.decodeDelegationTransactions/decodeUndelegationTransactionscallCheckSlashingTxMatchFundingTxwithparams.SlashingPkScriptandMinSlashingTxFeeSat. Unbonding fee must equalparams.UnbondingFee. Stake expansion re-queries the previous delegation before signing. - Covenant-signer HMAC middleware rejects missing / invalid HMAC when a key is configured (constant-time compare). Empty key is operator config, not stranger theft of staked BTC.
- Slasher
SlashFinalityProvideronly walks active / unbonded delegations under an extracted FP BTC SK from evidence. It does not invent keys. - Staking-event
watcher reports
a spend only
after
waitForStakeSpendInclusionProof. Stake expansion waits k-deep. BabylonMsgBTCUndelegatestill validates the proof on-chain.
Do not file operator HMAC-off signer, permissionless evidence reporting of a real slash, or on-chain undelegate of a proven spend as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official vigilante v0.24.x
- covenant-emulator v0.16.x opens is exhausted at the opened-file level. Remaining listed: finality-provider v2.x, staking- expiry-checker, staking-queue- client, babylon node, and the website / toolkit rows.
2026-09-03: Decentraland leftover names and vesting factories
Immunefi program
decentraland
($500,000, kyc: true).
MANA / LAND /
ESTATE leftover
already logged.
This slice is
listed name
registrar /
controller and
ETH vesting
factories.
Sourcify match
flattens:
DCLRegistrar
0x2A187453064356c898cAe034EAed119E1663ACb8
(/tmp/dcl-src/names/…/DCLRegistrar.sol),
DCLController
0x6843291BD86857D97F0D269e698939fb10D60772
(/tmp/dcl-src/names/…/DCLController.sol),
TokenVesting
0x42F32e19365D8045661A006408Cc6d1064039FbF,
BatchVestings
0xC57185366bcda81CDE363380e2099758712038d0,
MinimalProxyFactory
0xE357273545C152f07afE2c38257B7b653FD3f6d0.
Official
avatars-contract
raw
DCLController.sol
/
DCLControllerV2.sol
compared for
context. V2
0xBe92B49a…deC56c
is Sourcify
exact_match
but not in
the unofficial
assets dump.
No mainnet writes.
Files:
DCLRegistrar.sol,
DCLController.sol,
TokenVesting.sol,
BatchVestings.sol,
MinimalProxyFactory.sol.
Checked for: a
stranger
register of a
taken name; a
name minted
without paying
MANA; controller
reentrancy that
mints two names
for one burn;
reclaim that
moves a name the
caller does not
own; vesting
release /
revoke by a
non-beneficiary
/ non-owner;
CREATE2 init
front-run that
steals another
user's vest.
Result: no user-exploitable finding. Not submitted.
- Registrar
registerisonlyControllerandisMigrated. Availability requires ENS owner== 0and!_exists._registeruses OZ_mint(noonERC721Received).reclaim(tokenId, owner)requires_isApprovedOrOwner.reclaim(tokenId)isonlyControllerand sets ENS toownerOf.migrateNamesisonlyOwnerisNotMigrated. - Controller V1
charges
PRICE(100 MANA) frommsg.senderviatransferFromthenburn. Beneficiary may differ from payer (gift). Name charset is 2–15[A-Za-z0-9]. Payment is after mint; there is no receiver hook to reenter. - TokenVesting
initializeis once.release/releaseTo/changeBeneficiaryareonlyBeneficiary.revokeisonlyOwnerandrevocable.releaseForeignTokencannot move the vesting token. - BatchVestings
only loops
createVesting. Factory salt iskeccak256(salt, msg.sender)then CREATE2 + optional init in the same call.
Do not file
gift
registration to
a chosen
beneficiary,
owner-gated
controller add /
domain transfer /
migrate, owner
revoke of a
revocable vest,
or V2
transferFrom
unchecked-return
(not listed;
MANA reverts on
failure), as
stranger theft.
Not submitted.
Payment requires
user KYC.
Listed
Decentraland
names + ETH
vesting leftover
is exhausted at
the opened-contract
level. Remaining
listed:
Collections
V1/V2
(ERC721Collection
0xc04528…5CDd /
0xeCf073…01b1
and related
factory rows)
and Polygon
MANA /
collections.
2026-09-03: Decentraland leftover ETH collections, marketplace, and remaining vesting
Immunefi program
decentraland
($500,000, kyc: true).
MANA / LAND /
ESTATE and names
- ETH vesting
leftovers already
logged. This slice
is listed ETH
ERC721Collectionwearables, the listed Ethereum marketplace, and remaining ETH vesting / ProxyAdmin rows. Sourcify:ERC721Collection0xc04528c14c8FfD84c7c1fb6719B4A89853035CDd(match),ERC721Collection0xeCf073f91101cE5628669C487AeE8f5822A101b1(match),DecentralandMarketplaceEthereum0x1b67D0e31eeB6B52D8eEEd71D3616C2F5b33b8E7(exact_match),PeriodicTokenVesting0xB76b389cd04595321D51F575f5D950df1Cef3dD7(exact_match),OwnableBatchVestings0x24B18Ac1C0cC1cFa14b03Fe5c4580Ab85191608A(exact_match),ProxyAdmin0xb49882c17281D3451972ae7e476CB3E0698Af712(exact_match). No mainnet writes.
Files:
ERC721Collection.sol
(both),
DecentralandMarketplaceEthereum.sol,
Marketplace.sol,
Verifications.sol,
PeriodicTokenVesting.sol,
OwnableBatchVestings.sol.
Checked for: a
stranger
issueToken past
max issuance;
batchTransferFrom
of someone else's
wearable; marketplace
accept that moves
assets without a
valid signer
signature or after
expiry / reuse;
vesting release
by a
non-beneficiary;
releaseSurplus
that pulls vested
tokens.
Result: no user-exploitable finding. Not submitted.
- Both
collections
issueToken/issueTokensareonlyAllowed.addWearableisonlyOwnerand cannot rewrite an existing key. Issuance incrementsissued[key]and reverts whenissued >= maxIssuance.batchTransferFrom/safeBatchTransferFromloop OZtransferFrom/safeTransferFrom(owner, approved, or operator). - Marketplace
acceptiswhenNotPausednonReentrant._verifyTradechecks unused trade id, cancelled / overused signature, effective + expiration, contract / signer indexes, optional allowlist Merkle, then EIP-712 signature. Sent assets leave the signer; received assets leave the caller. ERC20 takes afeeRate / 1e6cut tofeeCollector. Composable ERC721 (verifyFingerprint) is checked beforesafeTransferFrom. - Periodic
vesting
releaseisonlyBeneficiaryand capped bygetReleasable.revoke/releaseSurplus/releaseForeignTokenareonlyOwner. Surplus cannot exceedbalance - (nonSurplus - released). - Ownable
batch
vestings
createVestingsis owner-only after a one-shotinitialize. - ProxyAdmin is stock OZ owner-gated upgrade admin.
Do not file allowed-minter issuance, owner wearable adds, signed trade fill at the signed price, owner revoke / surplus of a revocable vest, or ProxyAdmin upgrade, as stranger theft.
Not submitted. Payment requires user KYC. Listed Decentraland ETH collections + marketplace + remaining ETH vesting leftover is exhausted at the opened-contract level. Remaining listed: Polygon MANA / collections (and other Polygon rows).
2026-09-03: Gearbox leftover oracles-v3 leftover (287739a)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md.
This slice is
oracles-v3 287739a
(main): everything in
contracts/ except
contracts/test/. Clone
/tmp/gearbox-oracles.
No mainnet writes.
Files:
contracts/oracles/LPPriceFeed.sol,
contracts/oracles/BoundedPriceFeed.sol,
contracts/oracles/CompositePriceFeed.sol,
contracts/oracles/ConstantPriceFeed.sol,
contracts/oracles/ZeroPriceFeed.sol,
contracts/oracles/SingleAssetLPPriceFeed.sol,
contracts/oracles/curve/CurveStableLPPriceFeed.sol,
contracts/oracles/curve/CurveCryptoLPPriceFeed.sol,
contracts/oracles/curve/CurveTWAPPriceFeed.sol,
contracts/oracles/erc4626/ERC4626PriceFeed.sol,
contracts/oracles/lido/WstETHPriceFeed.sol,
contracts/oracles/pendle/PendleTWAPPTPriceFeed.sol,
contracts/oracles/updatable/PythPriceFeed.sol,
contracts/oracles/updatable/RedstonePriceFeed.sol,
contracts/traits/PriceFeedValidationTrait.sol.
Checked for: a
permissionless
updatePrice that
writes a forged
Pyth / Redstone
answer; an LP
donation that
inflates collateral
past the limiter
window; a composite
or bounded feed
that skips
staleness; a Pendle
PT that prices above
the asset after
expiry; an ERC-4626
or wstETH rate
without a lower
bound.
Result: no user-exploitable finding. Not submitted.
PriceFeedValidationTraitrequires 8 decimals on wrapped feeds, pairsskipPriceCheckwith a zero / non-zero staleness period, and rejects negative, zero (unlessskipCheck), or stale answers.LPPriceFeedskipPriceCheckis true because it checks locally. Exchange rate belowlowerBoundreverts; aboveupperBound(+200bps) is capped.setLimiterisonlyOwnerand the live rate must sit inside the new window.- Bounded feed
validates the
underlying then
caps upside
only (stable
overvalue
defense).
Composite
multiplies
target/base ×
base/USD, keeps
the earlier
timestamp, and
always
staleness-checks
feed0
(
skipCheck0 = false). - Curve stable
aggregate is the
min of
underlying
prices times
get_virtual_price/ 1e18. Curve crypto uses the geometric mean timesnCoins. Curve TWAP bounds are immutable: below lower reverts, above upper caps. - ERC-4626 uses
convertToAssetsof one share; wstETH usesstEthPerToken. Both inherit the LP limiter. - Pendle PT uses
the market
ln(impliedRate)TWAP until expiry, then the asset price, haircut whensyIndex < pyIndex. - Pyth
latestRoundDatausesgetPriceUnsafeplus a 10-minute / 1-minute publish window and a maxconf/priceratio.updatePriceis permissionless but forwards a Hermes payload and requires the post-update publish time to match the expected timestamp. Fee is paid from precharged ETH. - Redstone
requires an
authorised
signer set and
threshold.
updatePriceearly-stops on an older timestamp, thengetOracleNumericValueFromTxMsgchecks signatures.skipPriceCheckis false, so a never-updated zero price is rejected by the consumer. - Constant feed
stores a
positive
immutable price.
Zero feed is an
intentional
disabled-asset
sentinel
(
skipPriceCheck true, answer0).
Do not file owner limiter moves, Pyth ETH fee drain via valid Hermes updates, Constant / Zero as configured oracles, or admin-chosen Redstone signers as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
oracles-v3
opens is
exhausted at the
opened-file
level. Remaining
listed:
integrations-v3,
bots-v3,
permissionless,
and periphery-v3
emergency / kyc /
migration.
2026-09-03: Decentraland leftover Polygon MANA, collections, and marketplace
Immunefi program
decentraland
($500,000, kyc: true).
ETH MANA / LAND /
ESTATE, names +
vesting, and ETH
collections +
marketplace leftovers
already logged.
This slice is
listed Polygon
MANA, Collection
V2 factory /
manager, and the
Polygon marketplace
- credits path.
Sourcify chain
137:
UChildERC20(MANA)0x7FFB3d637014488b63fb9858E279385685AFc1e2(match),ERC721CollectionFactoryV20xB549B2442b2BD0a53795BC5cDcBFE0cAF7ACA9f8(exact_match),ERC721CollectionV2impl0x006080C6061C4aF79b39Da0842a3a22A7b3f185e(exact_match),CollectionManager0x9D32AaC179153A991e832550d9F96441Ea27763A(exact_match),Rarities0x17113b44fdd661A156cc01b5031E3aCF72c32EB3,RaritiesWithOracle0xA9158E22F89Bb3F69c5600338895Cb5FB81e5090,Committee0xAeec95a8AA671A6D3Fec56594827D7804964fA70(match),Forwarder0xBF6755A83C0dCDBB2933A96EA778E00b717d7004,DecentralandMarketplacePolygon0xA40b1d129B8906888720686F3a01921dDF37716F,CreditsManagerPolygon0x8B3A40CA1b6F5CaFC99d112a4d02E897d1FD8Cc5,CouponManager0x3Fd3056EE72a2a85e9392FAB3A450E7736536081. No mainnet writes.
Files:
UChildERC20.sol,
CollectionManager.sol,
ERC721CollectionFactoryV2.sol,
ERC721BaseCollectionV2.sol,
Forwarder.sol,
DecentralandMarketplacePolygon.sol,
CreditsManagerPolygon.sol.
Checked for: a
stranger Polygon
MANA deposit;
createCollection
that skips the
rarity fee;
issueTokens by
a non-minter
past
maxSupply;
forwardCall by
an arbitrary
caller; marketplace
accept that
moves assets
without a valid
signer;
useCredits that
spends another
user's credit.
Result: no user-exploitable finding. Not submitted.
- Polygon MANA
depositisonly(DEPOSITOR_ROLE).withdrawburns_msgSender()'s own tokens. - Collection
manager
createCollectionsumsrarities.getRarityByNameprices andtransferFroms that MANA from the caller tofeesCollector, then forwardsfactory.createCollection(factory isonlyOwner; ForwarderforwardCallis caller or owner only).manageCollectionis committee- allowlisted selectors + COLLECTION_HASH check.
- Collection V2
issueTokensrequiresisCompleted && isApproved._issueTokenallows creator / global minter or decrements per-item allowance, and reverts when `totalSupply + 1maxSupply`.
- Marketplace Polygon converts USD-pegged MANA via aggregator, then the same signed-trade accept path as ETH (sent from signer, received from caller, fees / royalties from the ERC20 payer).
- Credits
useCreditsisnonReentrantwhenNotPaused. Credit hash binds_sender+ chain + this contract + credit; signer must holdCREDITS_SIGNER_ROLE. Spent value is tracked per hash. Admin withdraws are role-gated.
Do not file depositor-role MANA mint, committee collection manage, creator / allowed minter issuance, signed trade fill, or protocol-signed credit spend, as stranger theft.
Not submitted. Payment requires user KYC. Listed Decentraland Polygon MANA + collection V2 factory/manager
- marketplace / credits leftover is exhausted at the opened-contract level. Remaining listed Polygon rows (if any unopened store / rarities / committee helpers) can be a later pass.
2026-09-03: Gearbox leftover integrations-v3 adapter + zapper leftover (39e70f0)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md.
This slice is
integrations-v3 39e70f0
(main) money-path core:
AbstractAdapter, Uniswap
V2 / V3, Curve V1 base,
ERC-4626 vault adapter,
and zapper bases /
underlying / deposit /
farming traits. Clone
/tmp/gearbox-int.
No mainnet writes.
Files:
contracts/adapters/AbstractAdapter.sol,
contracts/adapters/uniswap/UniswapV2.sol,
contracts/adapters/uniswap/UniswapV3.sol,
contracts/adapters/curve/CurveV1_Base.sol,
contracts/adapters/erc4626/ERC4626Adapter.sol,
contracts/zappers/ZapperBase.sol,
contracts/zappers/ERC20ZapperBase.sol,
contracts/zappers/ETHZapperBase.sol,
contracts/zappers/traits/UnderlyingTrait.sol,
contracts/zappers/traits/DepositTrait.sol,
contracts/zappers/traits/FarmingTrait.sol.
Checked for: a
stranger adapter
call that swaps
or vaults a
victim credit
account; a swap
that honors a
caller-chosen
recipient or an
unallowlisted
path; an ERC-4626
receiver /
owner override;
a zapper deposit
or redeem that
pulls another
user's tokens.
Result: no user-exploitable finding. Not submitted.
AbstractAdaptercreditFacadeOnlybindsmsg.senderto the connected facade._creditAccountis the manager's active account._execute/_executeSwapSafeApprovego through the manager; max approval is reset to1. Tokens must already be collateral (_getMaskOrRevert).- Uniswap V2 / V3
ignore the
caller
recipient/toand force the credit account. Paths must be at most 3 hops through configurator- allowed pools whose tokens are collateral. - Curve V1 base
exchange/exchange_diffarecreditFacadeOnly. Coin and LP tokens are collateral- checked in the constructor. - ERC-4626
deposit/mint/withdraw/redeemignorereceiver/ownerand always use the active credit account. - Zapper
deposit/redeempullmsg.sender(ormsg.valuefor ETH). Pool redeem burnsowner = msg.senderwhentokenOutis the pool. Permits are frommsg.sender. Farming traittransferFroms farm tokens from that same owner. Receiver is a gift, not a pull of a victim.
Do not file
configurator pool
allowlists,
caller-chosen
zapper
receiver, or
facade-gated
adapter use on
the caller's own
account as
stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
integrations-v3
opens for this
adapter + zapper
core is
exhausted at the
opened-file
level. Remaining
listed: other
integrations
adapters
(Balancer,
Camelot, Convex,
Fluid, Infinifi,
Lido, Mellow,
Midas, Pendle,
Securitize, Sky,
TraderJoe,
Uniswap V4,
Upshift,
Velodrome) and
helpers; bots-v3;
permissionless;
periphery-v3
emergency / kyc /
migration.
2026-09-03: Velodrome leftover Minter, VELO, sink, and reward factories (b3065d8)
Immunefi program
velodromefinance
($100,000, kyc: true).
Router / Pool,
Voter / VotingEscrow,
and Gauge /
RewardsDistributor
leftovers already
logged. This slice
is listed minter,
VELO, sink stack,
and reward
factories.
Official clone
/tmp/velo-contracts
b3065d8.
No mainnet writes.
Files:
contracts/Minter.sol,
contracts/Velo.sol,
contracts/sink/SinkPool.sol,
contracts/gauges/sink/SinkGauge.sol,
contracts/factories/sink/SinkGaugeFactory.sol,
contracts/factories/sink/SinkPoolFactory.sol,
contracts/factories/VotingRewardsFactory.sol,
contracts/factories/ManagedRewardsFactory.sol,
contracts/rewards/FeesVotingReward.sol,
contracts/rewards/VotingReward.sol,
contracts/rewards/LockedManagedReward.sol,
contracts/VeloForwarder.sol.
Checked for: a
stranger
Velo.mint;
updatePeriod
that pays the
caller the
emission;
SinkGauge.getReward
that drains
locked
emissions;
notifyRewardAmount
from a
non-gauge;
getReward on
someone else's
veNFT.
Result: no user-exploitable finding. Not submitted.
- VELO
mint/setMinteraremsg.sender == minter. - Minter
updatePeriodis permissionless but only advances once per week. New VELO goes toteam(teamRate ≤ 5%),rewardsDistributor(growth), andvoter.notifyRewardAmount(emissions).nudgeis epochGovernor only.setTeam/setTeamRateare team-only with a pending accept. - SinkPool is
an empty
placeholder.
SinkGauge
notifyRewardAmountis voter-only andtransferFroms VELO to the minter.getRewardis a no-op. Factories return the single pre-deployed sink pool / gauge. - Voting
rewards
getRewardrequires veisApprovedOrOwneror voter. FeesnotifyRewardAmountrequiresvoter.gaugeToFees(sender) == this. Locked managed rewards notify / getReward are VotingEscrow only._deposit/_withdrawareauthorized(voter). - VeloForwarder is stock OpenGSN Forwarder.
Do not file
permissionless
weekly
updatePeriod,
team emission
cut, voter-only
sink notify that
returns VELO to
the minter, or
ve-owner reward
claim, as
stranger theft.
Not submitted. Payment requires user KYC. Listed Velodrome minter + VELO + sink + reward factories leftover is exhausted at the opened-file level. Remaining listed: none on the official contracts tree beyond already- logged Router / Pool / Voter / VE / Gauge / Distributor.
2026-09-03: Gearbox leftover bots-v3 leftover (ebec19d)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md:
bots-v3 everything in
contracts/bots. This
slice is main
ebec19d: the only
in-scope bot,
PartialLiquidationBotV3.
Clone /tmp/gearbox-bots.
No mainnet writes.
Files:
contracts/bots/PartialLiquidationBotV3.sol,
contracts/interfaces/IPartialLiquidationBotV3.sol.
Checked for: a
stranger
partiallyLiquidate
on a healthy
account; a
liquidation that
seizes collateral
without paying
underlying; a
price-update that
bypasses the
health-factor
gate; a withdraw
of underlying as
the seized token;
a fee sent to the
caller instead of
treasury.
Result: no user-exploitable finding. Not submitted.
partiallyLiquidateis permissionless butbotMulticallrequires an approved bot withDECREASE_DEBT | WITHDRAW_COLLATERALandBOT_PERMISSIONS_SET. The liquidatortransferFroms their own underlying onto the account (fee-on-transfer measured).- Account must
be liquidatable
under
minHealthFactorbefore the call. Seized token cannot be underlying (or a phantom whose deposited token is underlying). - Seized amount
is
`convert(repaid)
- 1e4 /
liquidationDiscount
, using scaled manager premium / fee. Fee withdraws to the immutabletreasury. Seized collateral goes to caller- chosento` (liquidation premium, not a victim pull).
- 1e4 /
liquidationDiscount
- Optional
priceUpdatesgo through the facadepriceFeedStore. Withdraw triggers the facade collateral check. After the multicall, HF must remain inside[minHealthFactor, maxHealthFactor]. nonReentrant. Constructor rejects a zero treasury andmaxHF < 100%ormaxHF < minHF.
Do not file
owner-approved
bot
liquidation,
configurator
premium / fee
scale, or
liquidator
to as
stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
bots-v3
opens is
exhausted at the
opened-file
level. Remaining
listed: other
integrations
adapters /
helpers;
permissionless;
periphery-v3
emergency / kyc /
migration.
2026-09-03: Kamino leftover Liquidity program IDL (35579c1)
Immunefi program
kamino
($1,500,000, kyc: true).
klend + kvault and
Scope + KFarms
leftovers already
logged. This slice
is listed Kamino
Liquidity. Official
on-chain program
repo
(Kamino-Finance/kamino-liquidity
/ kliquidity)
is not public
(clone 401).
Reviewed official
SDK + IDL clone
/tmp/kamino-liq-sdk
35579c1
(kliquidity-sdk
v15.0.2). Program
ID from SDK docs:
6LtLpnUFNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc.
No mainnet
interaction.
Files:
src/idl/kliquidity.json
(deposit,
depositAndInvest,
withdraw,
invest,
executiveWithdraw,
emergencySwap,
withdrawFromTreasury,
collectFeesAndRewards).
Checked for: a
stranger
withdraw of
another user's
shares; admin-less
emergencySwap /
treasury sweep;
unsigned
deposit that
pulls someone
else's tokens.
Result: no user-exploitable finding at the IDL-constraint level. Not submitted.
deposit/depositAndInvest/withdrawrequireuserisSigner. Withdraw burnssharesAmountfromuserSharesAta. Token-account owner matching is not visible in the IDL (that check lives in the closed program).investisactionsAuthoritysigner (keeper / admin path).executiveWithdraw,emergencySwap, andwithdrawFromTreasuryrequireadminAuthoritysigner.collectFeesAndRewardsis a signed user/keeper compound into the strategy vaults, not a stranger payout.
Do not file signer-gated deposit / withdraw, admin emergency swap, or permissionless fee compound into the vault, as stranger theft.
Not submitted. Payment requires user KYC. Listed Kamino Liquidity leftover is exhausted at the public IDL / SDK level. Remaining listed: closed-source program internals (ATA owner / share math) if a later source drop opens, and listed third-party oracle interfaces (Meteora / JUP / RedStone / Securitize / Switchboard / Adrena) if still unused.
2026-09-03: Gearbox leftover integrations-v3 remaining adapters leftover (39e70f0)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md.
Adapter + zapper core
already logged. This slice
is more integrations-v3
39e70f0 money-path
adapters: Pendle Router,
Balancer V3 Router,
Convex BaseRewardPool,
Lido V1, Sky DAI/USDS,
Uniswap V4. Clone
/tmp/gearbox-int.
No mainnet writes.
Files:
contracts/adapters/pendle/PendleRouterAdapter.sol,
contracts/adapters/balancer/BalancerV3RouterAdapter.sol,
contracts/adapters/convex/ConvexV1_BaseRewardPool.sol,
contracts/adapters/lido/LidoV1.sol,
contracts/adapters/sky/DaiUsdsAdapter.sol,
contracts/adapters/uniswap/UniswapV4.sol.
Checked for: a
stranger adapter
call on a victim
account; a Pendle
or Balancer swap
that honors a
caller receiver;
a Convex
stake / withdraw
that targets
another staker; a
Lido submit that
mints stETH off
the credit
account; a Sky
wrap that sends
to a caller-chosen
usr.
Result: no user-exploitable finding. Not submitted.
- All six
adapters are
creditFacadeOnlyand execute on the manager's active credit account. - Pendle forces the credit account as receiver, allowlists market / token / PT pairs, and only redeems PT after YT expiry.
- Balancer V3
swaps / add /
remove require
configurator
pool status.
wethIsEthanduserDataare forced false / empty. Tokens come from the credit account. - Convex stake /
withdraw /
unwrap pass
through
_executesomsg.senderon the pool is the credit account. Phantom token must matchstakedPhantomToken. Extra rewards are collateral- checked. - Lido
submitwraps WETH through the gateway with referral = pool treasury. WETH and stETH are collateral. - Sky ignores
usrand wraps to the credit account. DAI and USDS are collateral. - Uniswap V4
requires an
allowed pool
key,
ignores
hookData, and maps ETHaddress(0)to WETH. Tokens must be collateral.
Do not file configurator pair / pool allowlists or facade-gated adapter use on the caller's own account as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
integrations-v3
opens for these
adapter types is
exhausted at the
opened-file
level. Remaining
listed: Camelot,
Fluid, Infinifi,
Mellow, Midas,
Securitize,
TraderJoe,
Upshift,
Velodrome
adapters and
helpers;
permissionless;
periphery-v3
emergency / kyc /
migration.
2026-09-03: Folks Finance leftover hub pools, oracle node, and adapters (7f631fe)
Immunefi program
folksfinance
($200,000, kyc: true).
Spoke + hub loan
leftover already
logged. This slice
is listed hub
pools, one oracle
node, and
Wormhole / CCIP /
Hub adapters.
Official clone
/tmp/folks-xchain
7f631fe.
No mainnet writes.
Files:
contracts/hub/HubPool.sol,
HubCircleTokenPool.sol,
HubNonBridgedTokenPool.sol,
contracts/hub/logic/HubPoolLogic.sol,
contracts/oracle/nodes/PriceDeviationSameOracleCircuitBreakerNode.sol,
contracts/bridge/WormholeDataAdapter.sol,
CCIPDataAdapter.sol,
HubAdapter.sol.
Checked for: a
stranger
mintFToken /
updatePoolWithWithdraw;
adapter
receiveWormholeMessages
from a non-relayer
or wrong peer;
CCIP receive from
an unlisted
adapter;
HubAdapter
sendMessage
that bridges
tokens for a
non-router.
Result: no user-exploitable finding. Not submitted.
- HubPool
deposit /
withdraw /
borrow / repay
/ liquidation
accounting and
fToken
mint / burn
are
LOAN_MANAGER_ROLE.getSendTokenMessageandclearTokenFeesareHUB_ROLE.verifyReceiveTokenrequires the source to be the registered spoke for that chain. Circle pool_sendTokentransfers the underlying to the selected adapter. - Circuit-breaker node compares two parent prices and reverts or falls back when deviation exceeds tolerance or both parents share a type. No token movement.
- Wormhole
sendMessageisonlyBridgeRouter.receiveWormholeMessagesisonlyWormholeRelayerand requires the source adapter to matchgetChainAdapter. - CCIP
_ccipReceive(router-gated by CCIPReceiver) checks source selector + peer adapter beforebridgeRouter.receiveMessage. - HubAdapter
sendMessageisonlyBridgeRouterand can only target the hub chain.
Do not file
role-gated pool
index updates,
permissionless
updateInterestIndexes,
or
relayer-authenticated
cross-chain
delivery, as
stranger theft.
Not submitted. Payment requires user KYC. Listed Folks Finance hub pool
- adapter leftover is exhausted at the opened-file level. Remaining listed: Exact Match live addresses if docs resolve them, and other oracle node types if still unused.
2026-09-03: Gearbox leftover permissionless governor + configurator leftover (b1b5e5b)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md:
permissionless
everything in
contracts/ except
contracts/test/. This
slice is main b1b5e5b
money-path /
privilege core:
MarketConfigurator,
TreasurySplitter,
Governor, CrossChainMultisig,
BytecodeRepository, ACL.
Clone /tmp/gearbox-pl.
No mainnet writes.
Files:
contracts/market/MarketConfigurator.sol,
contracts/market/TreasurySplitter.sol,
contracts/market/Governor.sol,
contracts/global/CrossChainMultisig.sol,
contracts/global/BytecodeRepository.sol,
contracts/market/ACL.sol.
Checked for: a
stranger
createMarket /
configurePool on
an existing suite;
a treasury
distribute or
withdrawToken to
the caller; a
governor execute
of an unqueued
tx; a
cross-chain batch
with forged
signatures; a
bytecode
deploy of
unallowed init
code; an ACL
grantRole by a
non-owner.
Result: no user-exploitable finding. Not submitted.
- MarketConfigurator
create /
configure /
shutdown /
factory upgrade
/ periphery add
are
onlyAdmin. Emergency configure / role revoke areonlyEmergencyAdmin. Factory authorize isonlySelf. - TreasurySplitter
distribute/configureare admin or treasury proxy. Configure needs both admins then aonlySelfsetter. Proportions must sum to 1e4. Splitter cannot be a receiver.withdrawTokenisonlySelf. - Governor queue
is
queueAdminOnly. Execute isexecutionAdminOnlyunless permissionless execution was already allowed (after delay). Veto isvetoAdminOnly. Admin changes aretimeLockOnly. Ownership cannot be renounced. - CrossChainMultisig
submitBatchis owner + mainnet.signBatchneeds an approved signer and threshold before execute. Off-mainnetexecuteBatchchecksprevHash, unique signers, and threshold. Signer / threshold changes areonlySelf. - BytecodeRepository
uploadBytecodeis public but author-signed (author-only on mainnet) and does not allow deploy.deployuses only an allowed(cType, ver)hash. System allow isonlyOwner. Public allow needs an audited bytecode in a public domain with the author as type owner. - ACL
grantRole/revokeRoleareonlyOwner.
Do not file admin market create, two-admin splitter moves, queued timelock execute, or DAO-signed cross-chain batches as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
permissionless
opens for this
governor +
configurator
core is
exhausted at the
opened-file
level. Remaining
listed:
factories,
InstanceManager,
AddressProvider,
PriceFeedStore,
helpers; other
integrations
adapters /
helpers;
periphery-v3
emergency / kyc /
migration.
2026-09-03: Gearbox leftover periphery-v3 emergency + migration leftover (2a63cf2)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md:
periphery-v3
contracts/emergency,
contracts/kyc, and
contracts/migration
except *Previewer. This
slice is main 2a63cf2.
There is no contracts/kyc
tree. Clone
/tmp/gearbox-peri.
No mainnet writes.
Files:
contracts/emergency/MultiPause.sol,
contracts/emergency/TreasuryLiquidator.sol,
contracts/migration/LiquidityMigrator.sol,
contracts/migration/AccountMigratorBot.sol,
contracts/migration/AccountMigratorAdapter.sol,
contracts/migration/AccountMigratorAdapterV30.sol,
contracts/migration/AccountMigratorAdapterV31.sol.
Checked for: a stranger pause of markets; a treasury liquidation that sends seized collateral to the caller; a pool migration that redeems a victim without approval; a credit-account migration by a non-borrower.
Result: no user-exploitable finding. Not submitted.
- MultiPause
pause entry
points are
pausableAdminsOnly. Targets come from the registered market configurator. - TreasuryLiquidator
setLiquidatorStatus/setMinExchangeRateareonlyTreasury.partiallyLiquidateFromTreasuryisonlyLiquidatorand only on a registered facade. Funds leave the treasury; seized collateral is sent totreasury. - LiquidityMigrator
migrateisonlyOwner(instance-owner proxy). It redeemsuser'spoolFromshares (needs allowance) and deposits the same assets back touserinpoolTo. Assets must match. - AccountMigratorBot
migrateCreditAccountrequiresmsg.senderto be both source borrower andparams.accountOwner, thenbotMulticall. Innermigrateis only the active credit account. AdaptermigrateiscreditFacadeOnlyand unlock is bot-only.
Do not file pausable-admin pauses, treasury-approved liquidations, instance-owner pool migration after user approval, or owner-initiated account migration as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
periphery-v3
opens for
emergency /
migration (and
the missing kyc
folder) is
exhausted at the
opened-file
level. Remaining
listed:
permissionless
factories /
InstanceManager /
PriceFeedStore /
helpers; other
integrations
adapters /
helpers.
2026-09-03: Gearbox leftover integrations-v3 leftover adapters leftover (39e70f0)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md.
Prior adapter leftovers
already logged Uniswap /
Curve / ERC-4626 / Pendle /
Balancer / Convex / Lido /
Sky. This slice is the
remaining integrations-v3
39e70f0 adapters:
Camelot V3, FluidDex,
Infinifi, Mellow, Midas,
Securitize, TraderJoe,
Upshift, Velodrome V2.
Clone /tmp/gearbox-int.
No mainnet writes.
Files:
contracts/adapters/camelot/CamelotV3Adapter.sol,
contracts/adapters/fluid/FluidDexAdapter.sol,
contracts/adapters/velodrome/VelodromeV2RouterAdapter.sol,
contracts/adapters/traderjoe/TraderJoeRouterAdapter.sol,
contracts/adapters/infinifi/InfinifiGatewayAdapter.sol,
contracts/adapters/mellow/Mellow4626VaultAdapter.sol,
contracts/adapters/mellow/MellowClaimerAdapter.sol,
contracts/adapters/midas/MidasIssuanceVaultAdapter.sol,
contracts/adapters/midas/MidasRedemptionVaultAdapter.sol,
contracts/adapters/securitize/SecuritizeOnRampAdapter.sol,
contracts/adapters/upshift/UpshiftVaultAdapter.sol.
Checked for: a
stranger swap that
honors a caller
recipient / to;
an Infinifi mint
off the credit
account; a Midas
or Securitize
deposit that
mints to the
caller; an
Upshift redeem
that claims to a
chosen receiver.
Result: no user-exploitable finding. Not submitted.
- All adapters
are
creditFacadeOnlyand execute on the manager's active credit account. - Camelot,
Velodrome, and
TraderJoe ignore
caller
recipient/toand force the credit account. Paths must be configurator- allowed (at most 3 hops). - FluidDex
ignores
toand swaps constructor- bound token0 / token1, both collateral. - Infinifi
ignores
toand mints / stakes to the credit account. USDC / iUSD / siUSD are collateral. Locked tokens are allowlisted. - Mellow 4626
inherits
ERC-4626
(receiver /
owner forced
to the credit
account).
Claimer
multiAcceptrequires an allowed multiVault and claims via the account. - Midas instant
deposit /
redeem require
allowed tokens
and run
_executeas the credit account. - Securitize on-ramp swap spends liquidity token from the account. DS and liquidity tokens are collateral.
- Upshift
deposit is
ERC-4626.
Instant
withdraw /
redeem revert.
requestRedeem/claimgo through the gateway asmsg.sender(the credit account). Phantom token must match.
Do not file configurator pool / token allowlists or facade-gated adapter use on the caller's own account as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
integrations-v3
opens for these
remaining
adapter types is
exhausted at the
opened-file
level. Remaining
listed:
integrations
helpers;
permissionless
factories /
InstanceManager /
PriceFeedStore /
helpers.
2026-09-03: Gearbox leftover permissionless factories + instance leftover (b1b5e5b)
Immunefi program
gearbox ($150,000,
kyc: true). Official
scope is
Gearbox-protocol/security
bug-bounty/v3_1-scope.md.
Governor + configurator
already logged. This slice
is permissionless
b1b5e5b factories and
instance setup:
AbstractFactory,
PoolFactory,
CreditFactory,
InstanceManager,
PriceFeedStore,
MarketConfiguratorFactory.
Clone /tmp/gearbox-pl.
No mainnet writes.
Files:
contracts/factories/AbstractFactory.sol,
contracts/factories/PoolFactory.sol,
contracts/factories/CreditFactory.sol,
contracts/instance/InstanceManager.sol,
contracts/instance/PriceFeedStore.sol,
contracts/instance/MarketConfiguratorFactory.sol.
Checked for: a
stranger
deployPool /
deployCreditSuite;
an instance
activate or
address rewrite;
a price-feed
allow that
injects a fake
oracle; a
configurator
factory
shutdown of
someone else's
market.
Result: no user-exploitable finding. Not submitted.
- AbstractFactory
configure/emergencyConfiguredefault-revert._ensureCallerIsMarketConfiguratorchecks the factory registry. - PoolFactory
deployPooland CreditFactorydeployCreditSuite/configure/emergencyConfigureareonlyMarketConfigurators. They return Call arrays for the configurator to execute. - InstanceManager
activateisonlyOwner(cross-chain governance) once. Global configure / address set areonlyCrossChainGovernance. Local configure isonlyOwner. Treasury configure isonlyTreasury. Governance transfer is two-step. - PriceFeedStore
add / remove /
allow / forbid /
configure are
onlyOwner(instance manager proxy).updatePricesis public but only for registered updatable feeds and forwards their own signedupdatePricepayload. - MarketConfiguratorFactory
createMarketConfiguratoris public (permissionless new curator, not an existing market).shutdownMarketConfiguratoris the configurator's own admin and requires zero live pools.addMarketConfiguratorisonlyCrossChainGovernance.
Do not file permissionless new-curator deploys, instance-owner feed allowlists, or signed on-demand price updates as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
permissionless
opens for these
factory /
instance types
is exhausted at
the opened-file
level. Remaining
listed:
permissionless
helpers
(Constant /
Zero feed,
DefaultIRM,
ProxyCall,
EIP712Mainnet);
integrations
helpers.
2026-09-03: Kiln DeFi leftover Arbitrum + BSC vaults (Sourcify)
Immunefi program
kiln-defi
($500,000, kyc: true).
Listed remaining after
ETH vault core
(39284). Not
previously logged.
Official docs
https://docs.kiln.fi/v1/kiln-products/defi/security/source-code
Arbitrum Sourcify
match Vault
0xacF8cafa86795Cd30A8cBB7157a75ef4c118D7E7,
VaultUpgradeableBeacon
0xB03DDF4375E879B8E3bc240527bc55988c975ac4,
VaultFactory
0x9fe6B2c958ba79b9EEf48608678eB6Be1Dbc6bD0,
BlockList
0x27f264eC0003e7309CC4A7201D4cC8b6fa46afd7,
CompoundV3MarketRegistry
0x9cb057f462BBd076E5dD30C5f5d5dfa97ab006D3.
exact_match
AaveV3Connector
0x3990c145f71A32ff0A3A20cDa2090B9A786eb9aD
and
CompoundV3Connector
0xB9B55f53dBfBCD46a8B85083054E4bbe1073AD53.
ConnectorRegistry
0xDceF4a9535becd16c4ec149980445a4DeA976D89
is Sourcify 404;
Arbitrum Blockscout
verified
ConnectorRegistry.
Bitnovo Comp v3
USDC proxy
0x19A0F016Ac3989e754ab8216810beD8503bDA37e
is Sourcify 404;
Blockscout
VaultBeaconProxy.
BSC Sourcify
match Vault
0x5B5E6f108B2FBB72789A35D4E8FDD2f4822f4Fde
and factory /
beacon /
BlockList;
exact_match
AaveV3Connector
0x7cC875AbA6dE71c484205482A950F56bc1963726
and
VenusConnector
0x045d8C112645301565935f250f4520008c26F50F.
BSC
ConnectorRegistry
and Cool Wallet
proxy are
Sourcify 404.
Extract
/tmp/kiln-defi-arb-src
and
/tmp/kiln-defi-bsc-src.
Arb and BSC
Vault.sol /
VaultFactory.sol /
AaveV3Connector.sol /
BlockList.sol
hashes match
each other and
differ from the
older ETH extract
in /tmp/kiln-defi.
No mainnet writes.
Files:
src/Vault.sol,
src/VaultFactory.sol,
src/FeeDispatcher.sol,
src/BlockList.sol,
src/ConnectorRegistry.sol,
src/proxy/VaultUpgradeableBeacon.sol,
src/connectors/AaveV3Connector.sol,
src/connectors/CompoundV3Connector.sol,
src/connectors/VenusConnector.sol,
src/connectors/utils/MarketRegistry.sol,
src/libraries/MultisendLib.sol.
Checked for: a
stranger deposit
that mints shares
for someone
else's assets;
withdraw that
skips allowance;
public
forceWithdraw
that pays the
caller; factory
create that
hijacks an
existing vault;
FeeDispatcher
dispatchFees /
incrementPending*
that pull a
vault's max
approval when
msg.sender is
not the vault;
connector
deposit /
withdraw /
claim that
move a vault's
Aave / Compound /
Venus position
when called
directly;
reinvest
swap-target
calldata usable
by a stranger.
Result: no user-exploitable finding. Not submitted.
- Vault
deposit/mintpull_msgSender()and mint toreceiver.withdraw/redeemspend allowance whencaller != owner. Connector interactions arefunctionDelegateCallso protocol positions sit on the vault. forceWithdrawis public but requires the user to be on the internal blocklist and not OFAC, and paysblockedUser.delegateToFactoryisonlyFactory.initialize/upgradeareonlyFactory.- Factory
createVault/upgradeVault/removeVaultareDEPLOYER_ROLE. - FeeDispatcher
storage is
keyed by
msg.sender.dispatchFeestransferFroms the caller to stored recipients. PublicincrementPending*andsetFeeRecipientsonly write the caller's slot. - Registry add /
update / remove
are
CONNECTOR_MANAGER. Pause / freeze are role-gated. - Aave / Compound
/ Venus
connectors
supply or mint
to
address(this). Direct calls cannot move a vault's delegated position.claim/reinvestpayloads run only through vaultCLAIM_MANAGER. - Venus
viewExchangeRateis view-only fortotalAssets. MarketRegistry is constructor- immutable.
Do not file
role-gated vault
deploy, claim-
manager swap
payloads,
permissionless
forceWithdraw
to the blocked
user, or
ERC4626
self-deposit as
stranger theft.
Not submitted. Payment requires user KYC. Listed Kiln DeFi Arbitrum + BSC leftover is exhausted at the opened-file level. Remaining listed: Polygon / Optimism / Base vault impls, factories, connectors (including Base Metamorpho), and additional live vault instances.
2026-09-03: Kiln DeFi leftover Polygon + Optimism + Base vaults (Sourcify)
Immunefi program
kiln-defi
($500,000, kyc: true).
Listed remaining after
Arbitrum + BSC
(f0b2ec2). Not
previously logged.
Official docs
https://docs.kiln.fi/v1/kiln-products/defi/security/source-code
Polygon Sourcify
match Vault
0x39fc3bd5a3f909498224bAD8118eE3F4d11fA426,
beacon, factory,
BlockList, and
Cool Wallet
AaveV3 USDT
proxy
0x03441c89e7b751bb570f9dc8c92702b127c52c51
(VaultBeaconProxy).
exact_match
AaveV3Connector
0xB37b7048873D90c68B997F6D078648e866F17287.
Polygon
ConnectorRegistry
is Sourcify 404.
Optimism Sourcify
match Vault
0x14C01e411Dbf8e648214458dab5558D46c84619A,
beacon, factory,
BlockList.
exact_match
ConnectorRegistry
0x307320C7323EB80C721c41469BEE3776Fa8A96D2
and
AaveV3Connector
0x3511d6378322BDBA40a59891Ec61f9A7C387667f.
Dakota proxy is
Sourcify 404.
Base Sourcify
match Vault
0xDEDDCc8D5C0b9D920Dc7a3BEC1Fc112C40379ca8,
factory,
BlockList.
exact_match
beacon,
ConnectorRegistry
0x3D72BfC5a2368BCD7f019c061843B06De3EbBFFd,
AaveV3Connector
0x611E4996BE1dd6b7777A593949E3b60446c21113,
CompoundV3Connector
0x2eF8cb41DD108d429bf8D664d6fb907C8d71753b,
and
MetamorphoConnector
0xe4B3e16AA6c028c676852dEfe2Fd742050ee1E03.
Extract
/tmp/kiln-defi-pob-src.
Polygon /
Optimism / Base
Vault.sol /
VaultFactory.sol /
AaveV3Connector.sol /
BlockList.sol
hashes match the
Arb extract
(20c00306685e6065
vault). OP/Base
ConnectorRegistry.sol
matches Arb
Blockscout.
Base Compound v3
connector matches
Arb. No mainnet
writes.
Files:
src/Vault.sol
(hash-identical to
Arb/BSC),
src/connectors/MetamorphoConnector.sol,
src/proxy/VaultBeaconProxy.sol,
src/ConnectorRegistry.sol,
src/proxy/VaultUpgradeableBeacon.sol.
Checked for: a
stranger
Metamorpho
deposit /
withdraw that
moves a vault's
4626 shares when
called directly;
claim /
reinvest that
accept a swap
payload; beacon
proxy
constructor that
lets a stranger
re-init a live
vault.
Result: no user-exploitable finding. Not submitted.
- Metamorpho
deposit/withdrawuseaddress(this)as owner. Vault calls viafunctionDelegateCallso Morpho shares sit on the vault. Direct calls cannot move a vault's position.claimandreinvestalways revert (NothingToClaim/NothingToReinvest).totalAssets/maxDeposit/maxWithdraware views againstmsg.sender. VaultBeaconProxyis an OZBeaconProxyconstructor wrapper. Cool Wallet Polygon proxy source is that wrapper only.- Core vault /
factory /
fee /
registry /
Aave paths
are the same
as the
Arbitrum + BSC
leftover.
createVaultremainsDEPLOYER_ROLE. BeaconupgradeToisIMPLEMENTATION_MANAGER.
Do not file role-gated beacon upgrades or ERC4626 self-deposit as stranger theft.
Not submitted. Payment requires user KYC. Listed Kiln DeFi Polygon / Optimism / Base leftover is exhausted at the opened-file level. Remaining listed: newer Ethereum impl / factory / connector addresses in current docs (distinct from the older ETH core leftover), and additional live vault instances.
2026-09-03: Kiln DeFi leftover newer Ethereum impls (Sourcify)
Immunefi program
kiln-defi
($500,000, kyc: true).
Listed remaining after
Polygon / Optimism /
Base (8f78313).
Current docs
https://docs.kiln.fi/v1/kiln-products/defi/security/source-code
use Ethereum
addresses distinct
from the older ETH
core leftover
(39284 /
40070). Not
previously logged.
Sourcify match
Vault
0x869855168858364368e62A5D1D092cc1dbD31f5a,
beacon
0x15f7f910e5a8c86e609fd11c58f7342d86d3a25c,
BlockList
0x7e7F84Da187117e06AbB03E1454E07Af42D0E4BE.
exact_match
ConnectorRegistry
0xdE63817c82e93499357aE198518f90Ac1bE93A72,
docs VaultFactory
proxy
0xe175F13eB9383bCC61822Ca17ecB02038b00030D
(OZ
TransparentUpgradeableProxy;
impl
0x4A1Ede66750e8e44a1569A4Af3F53fb31De3Dd32
is Sourcify
match
VaultFactory),
AaveV3Connector
0x08c28e1c82C09487DCB15a3e0839e8C888EeE3CD,
CompoundV3Connector
0xbeaa30DCB697CFFB64E319A3Fc4b0688Be5aE790,
SDAIConnector
0x22Fc700401FABbB7de1872461E8733d74e02f88a,
MetamorphoConnector
0xDa5FfFCF097A95E0aE6e6eC9b966da5ba89844f2,
AngleSavingConnector
0x3443Ea9BcC9E1E515e567a278bDae103e7324d1d.
Extract
/tmp/kiln-defi-eth-new-src.
Vault / factory /
registry / Aave /
Compound /
BlockList /
Metamorpho hashes
match the Arb
extract. Newer
SDAI differs from
the older ETH
extract only by
adding
reinvest →
NothingToReinvest.
No mainnet writes.
Files:
src/connectors/AngleSavingConnector.sol,
src/connectors/SDAIConnector.sol,
src/connectors/MetamorphoConnector.sol,
src/Vault.sol,
src/VaultFactory.sol.
Checked for: a
stranger Angle /
sDAI deposit /
withdraw that
moves a vault's
4626 shares when
called directly;
claim /
reinvest that
accept a swap
payload; factory
proxy that lets a
stranger
initialize or
hijack the impl.
Result: no user-exploitable finding. Not submitted.
- AngleSaving
deposits and
withdraws to
address(this)on the immutablestUSD/stEUR4626. Vault calls viafunctionDelegateCall. Direct calls cannot move a vault's position.claim/reinvestalways revert.maxDeposit/maxWithdrawreturn 0 whenpaused() == 1. Constructor rejects a 4626 withtotalAssets() == 0. - Newer SDAI is
the same
address(this)
4626 pattern
plus
reinvestrevert. No swap target. - Metamorpho source matches the Base leftover.
- Docs factory
address is a
transparent
proxy. Impl
createVaultremainsDEPLOYER_ROLEand hash- matches Arb.
Do not file role-gated vault deploy or ERC4626 self-deposit as stranger theft.
Not submitted. Payment requires user KYC. Listed Kiln DeFi docs addresses (ETH + Arb + BSC
- Polygon + Optimism + Base) are exhausted at the opened-file level. Remaining listed: additional live vault instances if a later pass wants proxies rather than impls.
2026-09-03: Axelar leftover other-chain gateways + axlUSDC (Sourcify)
Immunefi program
axelarnetwork
($500,000, kyc: true).
Listed remaining after
ETH gateway / ITS /
ITF (39948). Not
previously logged.
Official clones
/tmp/axelar-cgp
43ec407 and
/tmp/axelar-its
ff21991. ETH
extract
/tmp/axelar-src.
Avalanche Sourcify
match gateway
0x5029C0EFf6C34351a0CEc334542cDb22c7928f78.
Polygon Sourcify
match gateway
0x6f015F16De9fC8791b234eF68D486d2bF203FBA8
and axlUSDC
0x750e4C4984a9e0f12978eA6742Bc1c5D248f40ed.
Moonbeam Sourcify
match gateway
0x4F4495243837681061C4743b74B3eEdf548D56A5.
BSC Sourcify
match gateway
proxy
0x304acf330bbE08d1e512eefaa92F6a57871fD895
and axlUSDC
0x4268B8F0B87b6Eae5d897996E6b845ddbD99Adf3.
Fantom gateway and
Avalanche axlUSDC
are Sourcify 404.
Extract
/tmp/axelar-other-src.
Avax / Polygon /
Moonbeam
AxelarGateway.sol
and
AxelarGatewayMultisig.sol
hashes match the
ETH extract
(e5d2f8fa62b565d8
/
4b2e8ff81137e79d).
No mainnet writes.
Files:
AxelarGateway.sol,
AxelarGatewayMultisig.sol,
AxelarGatewayProxy.sol,
BurnableMintableCappedERC20.sol
(gateway flatten +
listed axlUSDC).
Checked for: a
chain-specific
fork that lets
execute mint
without operator
proof; proxy
setup takeover;
axlUSDC mint /
burn /
burnFrom that
a stranger can
call.
Result: no user-exploitable finding. Not submitted.
- Avax / Polygon /
Moonbeam
verified trees
are the same
multisig
gateway already
opened on
Ethereum.
executerecovers owner / operator quorum and only then self-calls mint / burn / deploy. - BSC verified
source is the
AxelarGatewayProxywith constructorsetupdelegatecall and a publicsetupno-op. Fallback delegatecalls the stored implementation.receiverevertsNO_ETHER. - Polygon and BSC
axlUSDC
mint/burn/burnFromareonlyOwner.
Do not file quorum-signed gateway mint or owner-gated axlUSDC mint as stranger theft on another chain.
Not submitted. Payment requires user KYC. Listed Axelar Avalanche / Polygon / Moonbeam gateways and Polygon / BSC axlUSDC leftover is exhausted at the opened-file level. Remaining listed: Fantom / Aurora gateways, Avalanche / Fantom / Moonbeam axlUSDC, ITS GitHub tree beyond the two entry contracts, and DLT axelar-core / tofnd.
2026-09-03: Babylon leftover finality-provider leftover (fd28092)
Immunefi program
babylon-labs
($500,000, kyc: true).
Vigilante +
covenant leftover
already logged.
This slice is
listed
finality-provider
release/v2.x.
Official clone
/tmp/babylon-fp
fd28092. No
chain writes from
this VM.
Files:
eotsmanager/service/hmac.go,
eotsmanager/store/eotsstore.go,
eotsmanager/localmanager.go,
eotsmanager/service/rpcserver.go,
eotsmanager/config/config.go,
finality-provider/service/finality_submitter.go,
finality-provider/service/eots_manager_adapter.go,
finality-provider/service/rand_committer.go.
Checked for: a
stranger HMAC-bypass
that gets another
FP's EOTS
signature;
SaveEOTSKeyName
remapping a live
PK; double-sign at
the same height;
submitting finality
for a height
already voted;
empty-HMAC as
configured
operator risk.
Result: no user-exploitable finding. Not submitted.
- HMAC interceptor
bypasses only
/proto.EOTSManager/Pingand/proto.EOTSManager/SaveEOTSKeyName. Sign / unlock / create-key / randomness stay HMAC-gated when a key is set. Empty HMAC key skips auth (operator config; same pattern as the vigilante leftover). AddEOTSKeyNamerejects a duplicate PK (ErrDuplicateEOTSKeyName/ErrDuplicateEOTSKeyRecord). HMAC-bypassSaveEOTSKeyNamecannot remap an existing mapping.SignEOTSandgetEOTSPrivKeycheck that the keyring private key matches the requested PK. The HMAC-bypass alias (attacker PK → victim key name) fails withpublic key mismatch(TestKeyAliasingAttackPrevented/ batch twin).SignEOTSmutex +signRecordbucket: same height + same msg returns the stored sig; same height + different msg returnsErrDoubleSign.UnsafeSignEOTSdefaults disabled (IsUnsafeEndpointsDisabledtrue).SignBatchEOTSrejects duplicate heights and omits a height that would double-sign. SubmitterFilterBlocksForVotingskips height ≤ last voted and requires voting power. Pubrand commit signs the commitment hash via HMAC- gatedSignSchnorrSig.
Do not file
operator HMAC-off
eotsd, the
documented
SaveEOTSKeyName
HMAC bypass after
the aliasing
check, or
default-off
UnsafeSignEOTS
as stranger
theft.
Not submitted. Payment requires user KYC. Listed leftover that official finality-provider v2.x opens is exhausted at the opened-file level. Remaining listed: staking-expiry- checker, staking-queue- client, babylon node, and the website / toolkit rows.
2026-09-03: Pyth leftover Solana receiver + Sui contracts (4dd956e)
Immunefi program
pythnetwork
($250,000, kyc: true).
Listed remaining after
EVM leftover
(39935). Not
previously logged.
Official sparse
clone
/tmp/pyth-crosschain
4dd956e. Opened
target_chains/solana
(pyth-solana-receiver,
pyth-push-oracle,
pyth-price-store)
and
target_chains/sui/contracts.
programs/core-bridge
is the vendored
Wormhole core
bridge, not a
Pyth fee path.
No mainnet writes.
Files:
programs/pyth-solana-receiver/src/lib.rs,
programs/pyth-push-oracle/src/lib.rs,
programs/pyth-price-store/src/processor/submit_prices.rs,
sources/pyth.move,
sources/price_info.move,
sources/governance/governance.move,
sources/governance/set_fee_recipient.move.
Checked for: a
stranger
post_update
that spends
someone else's
lamports; treasury
withdraw; rent
reclaim of
another writer's
price account;
Sui
update_single_price_feed
that takes a
victim's Coin;
governance fee /
recipient change
without a
governance VAA.
Result: no user-exploitable finding. Not submitted.
- Solana
post_update/post_update_atomic/post_twap_updatechargepay_single_update_feefrom the signerpayerinto a treasury PDA. Comments state there is currently no withdraw from that PDA.set_fee/ data sources / wormhole / minimum signatures areGovernance(payer == governance_authority). Authority transfer is two-step request / accept. reclaim_rent/reclaim_twap_rentclose the update account topayeronly whenwrite_authority == payer.init_if_neededrequires the same write authority once initialized.- Push oracle
CPI-signs as
the price-feed
PDA and still
pays the
receiver fee
from
payer. - Price-store
submit_pricesonly writes the publisher's own buffer after PDA + buffer key checks. No token movement. - Sui
update_single_price_feedrequires `coin::value(&fee)= base_update_fee
anddeposit_fee_coinsinto that sharedPriceInfoObject. There is no withdraw of those coins.set_fee_recipientis governance-VAA only and is documented as unused leftover state.execute_governance_instruction` verifies a governance data source VAA and rejects stale sequence numbers.
Do not file payer-paid update fees, write- authority rent reclaim, or Wormhole- governed fee config as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed Pyth
Solana receiver +
Sui contract
leftover is
exhausted at the
opened-file
level. Remaining
listed:
governance
staking program
(pyth-network/governance),
Lazer Solana /
Sui / Cardano.
2026-09-03: Babylon leftover staking-expiry-checker leftover (73f4c7b)
Immunefi program
babylon-labs
($500,000, kyc: true).
Vigilante +
covenant leftover
and
finality-provider
leftover already
logged. This
slice is listed
staking-expiry-checker
release/v1.x.
Official clone
/tmp/babylon-expiry
73f4c7b. No
chain writes from
this VM.
Files:
internal/services/watch_btc_events.go,
internal/services/delegation_handlers.go,
internal/services/pollers.go,
internal/utils/state_transition.go,
internal/db/delegation.go,
internal/db/expiry.go.
Checked for: a stranger Mongo write that marks someone else's delegation unbonded before the timelock; withdrawn without a real BTC spend; slashing spend labeled as a clean withdraw.
Result: no user-exploitable finding. Not submitted.
- This service
only writes
Phase-1 API
Mongo labels
(
unbonding/unbonded/withdrawn). It cannot spend a staking UTXO. IsValidUnbondingTxrebuilds the unbonding path from stored staker / FP / covenant params, checks transfer + spent staking outpoint, no RBF / locktime, and expected unbonding output + fee. Invalid path spends are ignored.- Withdrawal
validators
require the
witness script
to match the
rebuilt
timelock path
(staking or
unbonding).
Qualified
withdraw is
only from
unbonded. - Expiry poller
uses
expire_height <= BTC tipthenQualifiedStatesToUnbonded(Active or Unbonding by tx type). HistoricalIsUTXOSpentcan label withdrawn without re-validating the spend tx (documented TODO). That is an indexer label after a real spend, not stranger theft of BTC.
Do not file operator Mongo writes, indexer mislabel of a real spend, or stale Active after a slashing path spend as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official staking-expiry- checker v1.x opens is exhausted at the opened-file level. Remaining listed: staking-queue- client, babylon node, and the website / toolkit rows.
2026-09-03: Pyth leftover governance staking program (42e0aa4)
Immunefi program
pythnetwork
($250,000, kyc: true).
Listed remaining after
Solana receiver +
Sui (64d5401).
Official sparse
clone
/tmp/pyth-governance
42e0aa4. Opened
staking/programs/staking.
No mainnet writes.
Files:
src/lib.rs,
src/context.rs,
src/utils/risk.rs,
src/state/positions.rs,
src/state/vesting.rs.
Checked for: a
stranger
withdraw_stake
to an account
they control;
accept_split
that moves
another user's
custody without
pda_authority;
recover_account
/
transfer_account
of a staked
account;
slash_account
callable by a
non-pool
authority.
Result: no user-exploitable finding. Not submitted.
withdraw_stakerequiresownersigner andhas_one = owneron metadata. Destination token accountownermust equal the signer. Risk check keeps unvested + locked exposure.create_position/close_position/request_splitare owner-signed and only rewrite position / split-request state. Tokens stay in the custody PDA.accept_splitispda_authority(config.has_one = pda_authority) and requiresnext_index == 0plus matching request amount / recipient. Tokens move source custody → new custody owned by the requested recipient.recover_accountisgovernance_authorityand only rewrites owner from a token account pubkey to that token account'sowner. Requires empty positions.transfer_accountis the same authority + empty-positions gate.slash_accountispool_authorityand transfers slashed PYTH to the supplied destination.
Do not file owner self- withdraw, authority- approved split, or pool-authority slash as stranger theft.
Not submitted. Payment requires user KYC. Listed Pyth governance staking leftover is exhausted at the opened-file level. Remaining listed: Lazer Solana / Sui / Cardano.
2026-09-03: Babylon leftover staking-queue-client leftover (c4b08ad)
Immunefi program
babylon-labs
($500,000, kyc: true).
Vigilante,
covenant,
finality-provider,
and
expiry-checker
leftovers already
logged. This
slice is listed
staking-queue-client
release/v1.x.
Official clone
/tmp/babylon-queue
c4b08ad. No
chain writes from
this VM.
Files:
client/rabbitmq_client.go,
client/schema.go,
client/client.go,
queuemngr/queue_manager.go,
config/queue.go.
Checked for: a stranger who can inject a staking / unbonding / withdraw event that moves BTC or mints BABY; queue credentials in default config usable against production.
Result: no user-exploitable finding. Not submitted.
- This repo is a
RabbitMQ
client + event
schema. It
does not
touch BTC or
Babylon
consensus.
Push*Eventonly JSON- marshals andSendMessages to named queues. - Consume is
manual-ack.
Requeue clones
the body to
the delay
queue then
acks the
original.
Default
user/password/localhostare local operator config, not a remote money-path. - A type
assertion on
x-processing-attemptscan panic a consumer if the header is the wrong type. That is operator liveness, not theft.
Do not file operator RabbitMQ credentials or a consumer panic on a bad header as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official staking-queue- client v1.x opens is exhausted at the opened-file level. Remaining listed: babylon node and the website / toolkit rows.
2026-09-03: Pyth leftover Lazer Sui + Cardano (4dd956e)
Immunefi program
pythnetwork
($250,000, kyc: true).
Listed remaining after
governance staking
(843027c). Official
sparse clone
/tmp/pyth-crosschain
4dd956e. Opened
lazer/contracts/sui
and
lazer/contracts/cardano.
Listed Solana Lazer
repo
https://github.com/pyth-network/pyth-lazer
(contracts/solana)
clone failed
(fatal: could not read Username /
401). That tree is
not in
pyth-crosschain.
No mainnet writes.
Files:
sui/sources/pyth_lazer.move,
sui/sources/actions.move,
sui/sources/governance.move,
sui/sources/state.move,
cardano/validators/pyth_state.ak,
cardano/validators/pyth_price.ak,
cardano/lib/pyth/governance.ak.
Checked for: a
stranger Sui path
that moves coins
from State;
upgrade /
update_trusted_signer
without a Wormhole
PTGM VAA; Cardano
withdraw that
drains tokens;
PurgeExpiredWithdrawScripts
or script-hash
upgrade without
owner NFT /
governance VAA.
Result: no user-exploitable finding. Not submitted.
- Sui
parse_and_verify_le_ecdsa_update_v2recovers secp256k1 and requires the pubkey on the trusted-signer list withclock.timestamp_ms() < expires_at_ms. It returns a parsedUpdate. No coins move. - Sui
init_lazer/upgrade/commit_upgrade/update_trusted_signerare Wormhole VAA PTGM module 3 (UpgradeSuiLazerContract/UpdateTrustedSigner264Bit).upgradealso requires `version == meta::version()- 1`. No coins move.
- Cardano
pyth_price.withdrawis the Cardano withdraw purpose, not a token drain. It checks the credential hash is the active (or still-valid deprecated) withdraw script and that each Lazer update verifies against trusted signers + the tx validity range. ReturnsTrueon success. Tests fail outdated / wrong / missing signers. - Cardano
pyth_stategovernance actions (UpdateTrustedSigner,UpgradeSpendScript,UpgradeWithdrawScript) require a Wormhole VAA.PurgeExpiredWithdrawScriptsis owner-NFT only and only drops expired deprecated hashes.
Do not file ECDSA verify with no coin movement, PTGM-gated upgrade / signer update, Cardano withdraw-purpose success, or owner-NFT purge as stranger theft.
Not submitted. Payment requires user KYC. Listed Pyth Lazer Sui + Cardano leftover is exhausted at the opened-file level. Remaining listed: Solana Lazer if a public source drop opens.
2026-09-03: Babylon leftover node btcstaking leftover (132d050)
Immunefi program
babylon-labs
($500,000, kyc: true).
Listed DLT
babylonlabs-io/babylon
is the latest official
release. Official
clone /tmp/babylon-node
tag v4.4.0
132d050. This
slice is
x/btcstaking
create / covenant /
inclusion / undelegate /
selective slash /
stake expand.
No chain writes
from this VM.
Files:
x/btcstaking/keeper/msg_server.go,
x/btcstaking/keeper/btc_delegations.go,
x/btcstaking/keeper/inclusion_proof.go,
x/btcstaking/keeper/finality_providers.go,
x/btcstaking/keeper/unbonding_transaction_sig_validation.go,
x/btcstaking/types/validate_parsed_message.go.
Checked for: a stranger CreateBTCDelegation that binds someone else's UTXO; covenant sigs that activate without quorum; inclusion proof reuse / too-early; BTCUndelegate without the staker's spend sig; Selective slashing without a recovered FP SK; stake expand that hijacks another staker's output.
Result: no user-exploitable finding. Not submitted.
- Create requires
a verified PoP,
a unused staking
tx hash, known
unslashed FPs,
and
ValidateParsedMessageAgainstTheParams(rebuilds staking / unbonding / slashing scripts, checks slashing pk script + fees, staker slashing sigs). - Covenant sigs require a params covenant PK, reject duplicates and already-unbonded dels, verify adaptor slashing sigs and the unbonding Schnorr.
- Inclusion needs covenant quorum, not already included / unbonded, merkle + k-deep, not coinbase, start ≥ tip at creation.
BTCUndelegateneeds a BTC inclusion proof, a spend of the staking out, andVerifySpendStakeTxStakerSig. Unexpected spends still require the staker key.- Selective slash
derives the FP
PK from the
recovered SK and
slashes only an
existing
unslashed FP.
Exported
BtcUndelegateis the v4.3 upgrade remediator, not a user handler.
Do not file staker-signed unexpected unbonding, gov param updates, or slashing an FP whose SK the reporter holds as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
babylon v4.4.0
opens for
btcstaking create /
covenant /
inclusion /
undelegate /
slash is
exhausted at the
opened-file
level. Remaining
listed: incentive
withdraw, finality
votes,
checkpointing /
epoching /
costaking / mint,
btclightclient,
and website /
toolkit rows.
2026-09-03: Babylon leftover node incentive leftover (132d050)
Immunefi program
babylon-labs
($500,000, kyc: true).
Node btcstaking
leftover already
logged on
v4.4.0
132d050. This
slice is
x/incentive
withdraw /
set-withdraw.
No chain writes
from this VM.
Files:
x/incentive/keeper/msg_server.go,
x/incentive/keeper/reward_gauge.go,
x/incentive/keeper/store.go,
x/incentive/keeper/reward_tracker.go,
proto/babylon/incentive/tx.proto.
Checked for: a stranger WithdrawReward that drains another stakeholder's gauge; SetWithdrawAddress that redirects someone else's payout; BTC-staker withdraw that also pulls a different costaker's coins.
Result: no user-exploitable finding. Not submitted.
MsgWithdrawRewardproto signer isaddress. The handler loads that address's gauge, paysGetWithdrawAddr(fallback: the stakeholder), thenSetFullyWithdrawn.- BTC-staker
withdraw first
sendAllBtcRewardsToGaugefor that delegator only, then also withdraws the same address's COSTAKER gauge. MsgSetWithdrawAddressproto signer isdelegator_address. Blocked withdraw addresses are rejected.
Do not file proto-signer enforced self- withdraw or a self-set withdraw address as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
babylon v4.4.0
opens for
incentive
withdraw is
exhausted at the
opened-file
level. Remaining
listed: finality
votes,
checkpointing /
epoching /
costaking / mint,
btclightclient,
and website /
toolkit rows.
2026-09-03: Axelar leftover Aurora/Fantom gateways + remaining axlUSDC
Immunefi program
axelarnetwork
($500,000, kyc: true).
Listed remaining after
other-chain gateways
(3e5d78d). Official
clones
/tmp/axelar-cgp
43ec407 and
/tmp/axelar-its
ff21991. Extract
/tmp/axelar-remaining-src.
Aurora Sourcify
match gateway
0x304acf330bbE08d1e512eefaa92F6a57871fD895
(same CREATE3
address as BSC).
Official Fantom
gateway (cgp
mainnet.json +
deployments
AxelarGateway)
is the same
address;
Sourcify match
AxelarGatewayProxyMultisig.
Avalanche Routescan
verified axlUSDC
0xfaB550568C688d5D8A52C7d794cb93Edc26eC0eC.
Fantom axlUSDC
0x1B6382DBDEa11d97f24495C9A90b7c88469134a4
and Moonbeam
axlUSDC
0xCa01a1D0993565291051daFF390892518ACfAD3A
are Sourcify 404;
runtime bytecode
hashes match the
Avalanche token
(c62c1cea8912ca54,
code_len 9924).
Immunefi-listed
Fantom proxy
0x5e3C572A97D898Fe359a2Cea31c7D46ba5386895
is Sourcify 404
with unique
bytecode
(b93b9f8b8364e3a7);
official docs
supersede it.
No mainnet writes.
Files:
AuroraGateway/AxelarGatewayProxy.sol,
FantomOfficialGateway/AxelarGateway.sol,
FantomOfficialGateway/AxelarGatewayMultisig.sol,
AvaxAxlUSDC/BurnableMintableCappedERC20.sol.
Checked for: an
Aurora / Fantom
fork that lets
setup take over
the proxy; axlUSDC
mint / burn /
burnFrom a
stranger can call.
Result: no user-exploitable finding. Not submitted.
- Aurora verified
source hash
8662d57459f55164matches the BSCAxelarGatewayProxyalready opened. Constructorsetupdelegatecall; publicsetupis a no-op;receiverevertsNO_ETHER. Runtime bytecode also matches BSC (6ba05a4232da8515). - Official Fantom
0x304acf…source hashes match Avax / Polygon / Moonbeam (e5d2f8fa62b565d8/4b2e8ff81137e79d/cd558c77e454c8d5). Runtime bytecode matches those proxies (28b80f5e462aa20f).executestill needs owner / operator quorum. - Avalanche
axlUSDC source
hash
cc8e280c4b8081c2matches Polygon axlUSDC.mint/burn/burnFromareonlyOwner. Fantom and Moonbeam tokens share that runtime bytecode.
Do not file
proxy setup
no-op, quorum
gateway mint, or
owner-gated
axlUSDC mint as
stranger theft
on Aurora /
Fantom /
Avalanche /
Moonbeam.
Not submitted.
Payment requires
user KYC.
Listed Axelar
Aurora gateway,
official Fantom
gateway, and
Avalanche /
Fantom /
Moonbeam axlUSDC
leftover is
exhausted at the
opened-file /
bytecode-match
level. Remaining
listed: Immunefi
Fantom historic
proxy
0x5e3C57… if a
public source
drop opens, ITS
GitHub tree
beyond the two
entry contracts,
and DLT
axelar-core /
tofnd.
2026-09-03: Babylon leftover node finality leftover (132d050)
Immunefi program
babylon-labs
($500,000, kyc: true).
Node btcstaking +
incentive leftovers
already logged on
v4.4.0
132d050. This
slice is
x/finality
votes, pubrand,
unjail, tally,
and EndBlock
rewards.
No chain writes
from this VM.
Files:
x/finality/keeper/msg_server.go,
x/finality/types/msg.go,
x/finality/keeper/evidence.go,
x/finality/keeper/tallying.go,
x/finality/keeper/rewarding.go.
Checked for: a stranger vote that finalizes a fork; fabricated evidence that slashes an honest FP; overlapping pubrand that resets randomness; unjail of another FP; rewards on an unfinalized height.
Result: no user-exploitable finding. Not submitted.
AddFinalitySigrequires activation height, an indexed block that is not already BTC-timestamped, a live unjailed FP with voting power, timestamped pubrand inclusion, andeots.Verify. Exact duplicate votes are rejected.- A fork vote
stores
evidence. Slash
runs only when
both canonical
and fork EOTS
exist at that
height
(
slashFinalityProvider→SlashFinalityProvider- event).
CommitPubRandListneeds a registered FP, Schnorr over(start || num || commitment), min pubrand, and no overlap with the last commit.UnjailFinalityProviderrequiressigner == fp.Addrand a passed jailing period.- Tally is
voted*3 > total*2. Rewards run only on finalized heights.
Do not file a permissionless valid EOTS vote (the sig is the auth) or slash of a real double-signer as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
babylon v4.4.0
opens for
finality votes /
pubrand / unjail
is exhausted at
the opened-file
level. Remaining
listed:
checkpointing /
epoching /
costaking / mint,
btclightclient,
and website /
toolkit rows.
2026-09-03: Axelar leftover ITS token manager / handler / token (ff21991)
Immunefi program
axelarnetwork
($500,000, kyc: true).
Listed remaining after
Aurora / Fantom
gateways + axlUSDC
(3b31536). Official
clone /tmp/axelar-its
ff21991. Entry
InterchainTokenService
/ InterchainTokenFactory
already opened
(39948). This slice
is the rest of the
token-moving ITS
tree. No mainnet
writes.
Files:
contracts/TokenHandler.sol,
contracts/token-manager/TokenManager.sol,
contracts/interchain-token/InterchainToken.sol,
contracts/interchain-token/InterchainTokenStandard.sol,
contracts/proxies/TokenManagerProxy.sol,
contracts/utils/InterchainTokenDeployer.sol.
Checked for: a
stranger
giveToken /
takeToken that
mints or unlocks
without ITS;
mintToken /
burnToken
without
onlyService;
InterchainToken.mint
without minter;
init takeover of
a live token;
interchainTransferFrom
without allowance.
Result: no user-exploitable finding. Not submitted.
- ITS calls
TokenHandleronly viadelegatecall. DirectgiveToken/takeTokenmint / burn go toTokenManager.onlyService(msg.senderis the handler, not ITS) and revert. Lock/unlocktransferFromuses the handler as spender, butapproveServiceapproves ITS. TokenManager.mintToken/burnTokenareonlyService.setupisonlyProxy.- Native
InterchainToken.mint/burnareonlyRole(MINTER). Deployerinitis once-only; the implementation constructor already initializes, and the clone isinited in the samedeployInterchainTokencall. interchainTransfersendsmsg.sender.interchainTransferFrom_spendAllowances first.executeisonlyItsHub+gateway.validateContractCall.expressExecutefronts the executor's own tokens and is repaid when the approved message arrives.
Do not file delegatecall-only handler mint, service-gated manager mint, minter-gated token mint, or express fronting as stranger theft.
Not submitted. Payment requires user KYC. Listed Axelar ITS token-moving tree leftover is exhausted at the opened-file level. Remaining listed: Hyperliquid ITS variants if a live deploy is in scope, DLT axelar-core / tofnd, and the Immunefi Fantom historic proxy if a public source drop opens.
2026-09-03: Folks leftover live Avalanche hub addrs + remaining oracle nodes (7f631fe)
Immunefi program
folksfinance
($200,000, kyc: true).
Listed remaining after
hub pools + adapters
(46284). Official
clone /tmp/folks-xchain
7f631fe. Live
Avalanche hub
addresses from
Folks-Finance/xchain-js-sdk
src/chains/evm/hub/constants/chain.ts.
Sourcify is 404 on
all of them.
Routescan verified
(compiler 0.8.23)
and every Folks
file hashes match
the clone. Extract
/tmp/folks-live-src.
No mainnet writes.
Files:
Hub.sol live
0xb39c03297E87032fF69f4D42A6698e4c4A934449
(hash b6db7e5116087d89),
LoanManager.sol
0xF4c542518320F09943C35Db6773b2f9FeB2F847e
(6743d0a77af37912),
OracleManager.sol
0x7218Bd1050D41A9ECfc517abdd294FB8116aEe81
(fd96b9ad83c7b0bc),
NodeManager.sol
0x802063A23E78D0f5D158feaAc605028Ee490b03b
(299407a7b899a234),
HubCircleTokenPool.sol
USDC
0x88f15e36308ED060d8543DA8E2a5dA0810Efded2
(8973bf60c10d87c7),
plus unused oracle
nodes
ChainlinkNode.sol,
PythNode.sol,
ReducerNode.sol,
StalenessCircuitBreakerNode.sol,
ExternalNode.sol,
ConstantNode.sol,
PriceDeviationCircuitBreakerNode.sol,
VaultAssetToSharesNode.sol.
Checked for: a
live-address fork
that drops
HUB_ROLE /
isUserLoanOwner;
OracleManager.setNodeId
without
MANAGER_ROLE;
an oracle node
that moves tokens.
Result: no user-exploitable finding. Not submitted.
- Live Hub / LoanManager / HubCircleTokenPool sources are byte-identical to the already opened clone. Same role and ownership gates.
OracleManagersetNodeId/setNodeManagerareMANAGER_ROLE.processPriceFeedis view.NodeManager.registerNodeis permissionless but only stores a price graph. All remaining node types are view: they read Chainlink / Pyth / parents / ERC-4626 and return a price. No coins move. Immunefi already excludes third-party oracle data without a contract bug.
Do not file hash-matched hub role gates, manager-gated oracle wiring, or view-only price nodes as stranger theft.
Not submitted. Payment requires user KYC. Listed Folks live Avalanche hub addrs and remaining oracle node types are exhausted at the opened-file / bytecode-match level. Sourcify Exact Match is still absent. Remaining listed: spoke live addrs on other chains if they diverge, hub/spoke rewards, and the Algorand docs path.
2026-09-03: Babylon leftover node costaking + mint leftover (132d050)
Immunefi program
babylon-labs
($500,000, kyc: true).
Node btcstaking +
incentive +
finality leftovers
already logged on
v4.4.0
132d050. This
slice is
x/costaking
params / fee-collector
split / costaker
gauges and
x/mint block
provision.
No chain writes
from this VM.
Files:
x/costaking/keeper/msg_server.go,
x/costaking/keeper/intercept_fee_collector.go,
x/costaking/keeper/hooks_incentive.go,
x/costaking/keeper/reward_tracker.go,
x/costaking/keeper/score.go,
x/costaking/abci.go,
x/mint/abci.go,
x/mint/keeper/keeper.go,
x/mint/module.go.
Checked for: stranger mint of BABY; a fee-collector intercept that pays the caller; costaker withdraw of another address's pool; permissionless score rewrite.
Result: no user-exploitable finding. Not submitted.
- Costaking's only
Msg is
UpdateParams.authoritymust match the keeper authority. AScoreRatioBtcByBabychange rewrites scores viaUpdateAllCostakersScore(gov-only). HandleCoinsInFeeCollectoris BeginBlock. Portions come from params (ValidatorsPortionCostakingPortion). Transfers are module-to-module (fee collector → distribution / costaking).- Validator
direct rewards
pass a
temporary
Commission.Rate = 1.0copy intoAllocateTokensToValidator. That copy is not persisted. BeforeRewardWithdrawruns only forCOSTAKERand that address.costakerWithdrawRewardsincrements the period andCalculateCostakerRewardsAndSendToGaugefor that costaker only. Payout still goes through the already-reviewed incentive proto signer.- Staking hooks
update
ActiveBabyfor the hookeddelAddronly. - Mint has no
user Msg
(
RegisterInterfacesis empty;GetTxCmdis nil).BeginBlockermints the block provision to the mint module thenSendCoinsToFeeCollector. Queries only cover inflation / annual provisions / genesis time.
Do not file gov-gated score rewrite, module fee-collector splits, or intended block mint as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
babylon v4.4.0
opens for
costaking params
/ fee-collector
split / gauges
and mint
provision is
exhausted at the
opened-file
level. Remaining
listed:
checkpointing /
epoching,
btclightclient,
and website /
toolkit rows.
2026-09-03: Folks leftover live spoke addrs (7f631fe)
Immunefi program
folksfinance
($200,000, kyc: true).
Listed remaining after
live Avalanche hub
addrs (59649a2).
Official clone
/tmp/folks-xchain
7f631fe. Live spoke
addresses from
xchain-js-sdk
src/common/constants/chain.ts.
Extract
/tmp/folks-spoke-src.
No mainnet writes.
Files / live:
ETH / Base
SpokeCommon
0xc7bc4A43384f84B8FC937Ab58173Edab23a4c3cD
(Sourcify match),
ETH / Base / Arb
USDC
SpokeCircleToken
0xF4c542518320F09943C35Db6773b2f9FeB2F847e
(Sourcify
exact_match),
Arbitrum
SpokeCommon
0x57D77FD37670e22188d1c92D7cEc931bccf074A4
(Sourcify match),
Avalanche
SpokeCommon
0xc03094C4690F3844EA17ef5272Bf6376e0CF2AC6
and USDC
0xcD68014c002184707eaE7218516cB0762A44fDDF
(Sourcify 404;
Routescan
verified).
Checked for: a
chain-specific
spoke fork that
credits another
account while
pulling the
caller; hub
SendToken from
a non-hub
source.
Result: no user-exploitable finding. Not submitted.
- Live
SpokeCommon.sol(6fc7733a72c52b22),SpokeToken.sol(eadef8ff666d3ef8), andSpokeCircleToken.sol(b74655134ebc9005) hash-match the already opened clone. deposit/repay/createLoanAndDepositstill pullmsg.sendervia_receiveToken(safeTransferFromon Circle) and set payloaduserAddresstomsg.sender._receiveMessageSendTokenstill requiressourceChainId/sourceAddressto be the hub.- Live
Messages.sollacks the clone's laterClaimRewardsV2- padding enum
slots. Encode /
decode of
userAddressis unchanged. Immunefi already excludes incentive contracts.
- padding enum
slots. Encode /
decode of
Do not file
hash-matched
spoke pull-from-
sender or
hub-gated
SendToken as
stranger theft
on another
chain.
Not submitted. Payment requires user KYC. Listed Folks live spoke addrs on ETH / Base / Arbitrum / Avalanche are exhausted at the opened-file / exact-match level. Remaining listed: rewards (out of scope as incentives), other spoke tokens if they diverge, and the Algorand docs path.
2026-09-03: Babylon leftover node checkpointing + epoching leftover (132d050)
Immunefi program
babylon-labs
($500,000, kyc: true).
Node btcstaking +
incentive +
finality +
costaking/mint
leftovers already
logged on
v4.4.0
132d050. This
slice is
x/checkpointing
wrapped create-
validator / BLS
vote extensions /
seal / BTC verify
and x/epoching
wrapped staking
queue / mature
unbonding.
No chain writes
from this VM.
Files:
x/checkpointing/keeper/msg_server.go,
x/checkpointing/types/msgs.go,
proto/babylon/checkpointing/v1/tx.proto,
x/checkpointing/keeper/registration_state.go,
x/checkpointing/keeper/keeper.go,
x/checkpointing/vote_extensions/vote_ext.go,
x/checkpointing/prepare/proposal.go,
x/checkpointing/abci.go,
x/epoching/keeper/msg_server.go,
proto/babylon/epoching/v1/tx.proto,
x/epoching/keeper/delegation_pool.go,
x/epoching/keeper/epoch_msg_queue.go,
x/epoching/keeper/modified_staking.go,
x/epoching/keeper/hooks.go,
x/epoching/abci.go.
Checked for: a stranger wrap that undelegate another address; drain of the delegate pool; a fake BLS checkpoint that finalizes early unbonding; permissionless epoch/staking params.
Result: no user-exploitable finding. Not submitted.
- Checkpointing's
only Msg is
WrappedCreateValidator. Proto signer is nestedmsg_create_validator.CheckMsgCreateValidatorrejects an existing owner / consensus PK, wrong denom, and below-min self-bond, then locks that validator's coins into the epoching delegate pool. CreateRegistrationrefuses a second BLS PK for the same validator and refuses the same BLS PK under another validator. PoP lives inValidateBasic(CLI calls it); msg_server does not re-verify. A validator that skips PoP can only brick its own BLS slot.- Vote
extensions
apply on the
last epoch
block. Verify
matches the
CometBFT
signer, epoch,
block hash, and
VerifyBLSSig. PrepareProposal also rejects a wrong-epoch VE (cometbft#2361 late-precommit path). SealCheckpointre-runsVerifyRawCheckpoint(voted*3 > total*2+ BLS multi-sig) before persist.- BTC
VerifyCheckpointaccepts the local sealed ckpt or another valid quorum on the same hash. A valid quorum on a different hash sets the conflicting flag; EndBlocker panics. Status walks Sealed → Submitted → Confirmed → Finalized. - Epoching
wrapped staking
Msgs use proto
signer
msg(inner delegator / validator / authority).UpdateParamsandWrappedStakingUpdateParamsare authority- gated. - Delegate /
create-validator
lock from the
inner address
into
DelegatePooland unlock to that same address at epoch end beforeHandleQueuedMsg. Unlock failure skips execute (funds stay in the pool). Failed unwraps are skipped inside a cache. ApplyMatureUnbondingruns only fromAfterRawCheckpointFinalizedand completes the staking module's mature pairs. It is not a user Msg.
Do not file nested-signer wrapped staking, gov-gated params, BLS self-brick, or intended checkpoint-gated unbonding as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
babylon v4.4.0
opens for
checkpointing
create-validator
/ BLS VE / seal
/ BTC verify and
epoching wrapped
staking / mature
unbonding is
exhausted at the
opened-file
level. Remaining
listed:
btclightclient,
and website /
toolkit rows.
2026-09-03: Babylon leftover node btclightclient + btccheckpoint leftover (132d050)
Immunefi program
babylon-labs
($500,000, kyc: true).
Node DLT leftovers
through
checkpointing +
epoching already
logged on
v4.4.0
132d050. This
slice is
x/btclightclient
header insert /
fork-by-work and
x/btccheckpoint
SPV submit /
k-deep finalize.
No chain writes
from this VM.
Files:
x/btclightclient/keeper/msg_server.go,
x/btclightclient/types/msgs.go,
x/btclightclient/types/btc_light_client.go,
proto/babylon/btclightclient/v1/tx.proto,
x/btccheckpoint/keeper/msg_server.go,
x/btccheckpoint/types/msgs.go,
x/btccheckpoint/types/btcutils.go,
x/btccheckpoint/keeper/keeper.go,
x/btccheckpoint/keeper/submissions.go,
x/btccheckpoint/abci.go,
proto/babylon/btccheckpoint/v1/tx.proto.
Checked for: a stranger header that rewrites the tip without PoW; an SPV proof that finalizes a fake epoch; a duplicate or ancestor-skip that jumps finality; permissionless timeout change.
Result: no user-exploitable finding. Not submitted.
MsgInsertHeadersproto signer issigner. Default allow-list is empty (AllowAllReporters). Headers must form a chain, passCheckBlockHeaderContextCheckBlockHeaderSanity(difficulty / PoW), and either extend the tip or fork from a known parent with more cumulative work. A known first header cannot start a fork.UpdateParamson both modules is authority- gated.CheckpointFinalizationTimeoutcannot change.InsertBTCSpvProofproto signer issubmitter.ParseTwoProofsrequires two txs, header PoW, merkle inclusion, one OP_RETURN each, matching tag/version parts, andConnectParts. Header depth comes from the light client. Duplicate keys and already- finalized epochs revert.VerifyCheckpointmust accept the local sealed ckpt (or a valid quorum on the same hash). A conflicting valid quorum returns success so the halt flag persists.- Epochs after
1 need an
ancestor
submission
still on the
main chain
that
HappenedAfteraccepts. - EndBlocker
OnTipChangere-scores submissions by depth / tx index. Confirmed isBtcConfirmationDepth; finalized isCheckpointFinalizationTimeout. Lost headers drop that submission.
Do not file permissionless valid-PoW headers (empty allow-list is intended), a real BTC SPV of a sealed ckpt, or k-deep finalization as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
babylon v4.4.0
opens for
btclightclient
headers and
btccheckpoint
SPV / finalize
is exhausted at
the opened-file
level. Remaining
listed: website
/ toolkit rows.
2026-09-03: Folks leftover live native / ERC20 spokes (7f631fe)
Immunefi program
folksfinance
($200,000, kyc: true).
Listed remaining after
Circle spokes
(2764498). Official
clone /tmp/folks-xchain
7f631fe. Live
addresses from
xchain-js-sdk
chain.ts. No mainnet
writes.
Files / live:
ETH native
SpokeGasToken
0xe3B0e4Db870aA58A24f87d895c62D3dc5CD05883
and ETH wBTC
SpokeErc20Token
0xb39c03297E87032fF69f4D42A6698e4c4A934449
(Sourcify
exact_match;
Base native is the
same CREATE3
gas spoke),
Avalanche AVAX
0xe69e068539Ee627bAb1Ce878843a6C76484CBd2c
and sAVAX
0x23a96D92C80E8b926dA40E574d615d9e806A87F6
(Sourcify 404;
Routescan
verified
SpokeGasToken /
SpokeErc20Token).
Checked for: a
native spoke that
credits another
account from the
caller's ETH; an
ERC20 spoke that
transferFroms a
victim; _sendToken
without a hub
SendToken.
Result: no user-exploitable finding. Not submitted.
- Live
SpokeGasToken.sol(ca1f37ac3117f94b) andSpokeErc20Token.sol(043913c418cd73e3) hash-match the clone, as doSpokeToken.sol/RateLimited.sol. - Gas
_receiveTokenonly subtractsamountfrommsg.value; payloaduserAddressis stillmsg.sender. - ERC20
_receiveTokensafeTransferFromsmsg.sender. _sendTokenstill only runs after hub-gatedSendToken.
Do not file hash-matched native/ERC20 pull-from-sender or hub-gated payout as stranger theft.
Not submitted. Payment requires user KYC. Listed Folks EVM spoke token types (Circle / gas / ERC20) are exhausted at the opened-file / exact-match level. Remaining listed: rewards (out of scope as incentives) and the Algorand docs path.
2026-09-03: Folks leftover Algorand xALGO consensus (67467b8)
Immunefi program
folksfinance
($200,000, kyc: true).
Listed remaining after
EVM spokes
(fde2103). Docs
URL
docs.folks.finance/developer/contracts
is the Algorand
path. Official
lend app IDs live
in
algorand-js-sdk
(MainnetDepositsAppId
971353536,
MainnetPoolManagerAppId
971350278) but
loan / deposit /
pool TEAL is not
in a public repo
(ABI JSON only).
Opened public
algo-liquid-staking-contracts
/tmp/folks-xalgo
67467b8. Mainnet
consensus app
1134695678,
xALGO ASA
1134696561. No
mainnet writes.
Files:
contracts/xalgo/consensus_v3.py,
contracts/xalgo/consensus_state_v3.py,
contracts/common/inner_txn.py.
Checked for: a
stranger
immediate_mint
that spends
another user's
ALGO; burn that
sends ALGO
without an
xALGO transfer
from the caller;
claim_delayed_mint
that mints to the
claimer; admin
fee drain by a
non-admin.
Result: no user-exploitable finding. Not submitted.
immediate_mint/delayed_mintrequirecheck_algo_sent(sender == Txn.sender(), receiver is the app, no rekey / close).burnrequirescheck_x_algo_sentof the xALGO ASA fromTxn.sender()to the app, then pays ALGO to the chosen receiver.claim_delayed_mintis permissionless after the delay round and mints to the stored receiver. The caller only receives the box min-balance refund.claim_feesends unclaimed fees to the admin, not the caller.update_scis admin + time delay + scheduled program hashes.
Do not file self-funded mint, xALGO-gated burn, permissionless claim-to-stored- receiver, or admin fee claim as stranger theft.
Not submitted. Payment requires user KYC. Listed Folks Algorand public xALGO leftover is exhausted at the opened-file level. Remaining listed: Algorand lend TEAL if a public source drop opens.
2026-09-03: Axelar leftover DLT axelar-core evm / axelarnet / nexus (186e889)
Immunefi program
axelarnetwork
($500,000, kyc: true).
Listed remaining after
ITS token tree
(fbe0017). Official
sparse clone
/tmp/axelar-core
186e889. Opened
x/evm/keeper,
x/evm/abci.go,
x/axelarnet/keeper,
x/axelarnet/message_handler.go,
x/nexus/keeper.
No mainnet writes.
Files:
x/evm/keeper/msg_server.go,
x/evm/keeper/vote_handler.go,
x/evm/abci.go,
x/axelarnet/keeper/msg_server.go,
x/nexus/keeper/transfer.go,
x/nexus/keeper/lockable_asset.go.
Checked for: a
stranger
ConfirmGatewayTxs
that mints
without a
validator poll;
HandleResult
that accepts a
voter-supplied
chain; UnlockTo
to an arbitrary
address;
ExecutePendingTransfers
that pays the
caller.
Result: no user-exploitable finding. Not submitted.
ConfirmGatewayTxsonly starts polls. Events become confirmed inHandleResultafter the poll result chain matches poll metadata (not the voter-supplied field).- EndBlocker
routes only
ContractCall/ContractCallWithToken.TokenSentis marked failed. Amount / sender / dest come from the confirmed event. - Destination
mint is an
ApproveContractCallWithMintcommand after multisigSignCommands. LockFrom/UnlockTomove bank coins from the given account or escrow. Native / ICS20 escrow; external mint / burn is module bank.ExecutePendingTransfersis permissionless but unlocks to the pending transfer's recipient, then fees to the configured collector.
Do not file permissionless poll start, quorum-confirmed GMP mint, or recipient-bound pending unlock as stranger theft.
Not submitted. Payment requires user KYC. Listed Axelar DLT evm / axelarnet / nexus leftover is exhausted at the opened-file level. Remaining listed: tofnd and Hyperliquid ITS if a live deploy is in scope.
2026-09-03: Livepeer leftover Arb bonding + tickets + LPT bridge leftover (Sourcify)
Immunefi program
livepeer
($40,000, kyc: true).
No leftover heading
existed. Sourcify
opens every listed
address. Controller
getContract +
proxy slot 1
resolve the
ManagerProxy
targets. No
mainnet writes
from this VM
except read-only
eth_call /
eth_getStorageAt.
Files (Sourcify):
BondingManager impl
0xbe197fcb…0bd2
(proxy
0x35Bcf3c3…3e40),
TicketBroker impl
0x3b68fbf8…52b7
(proxy
0xa8bB618B…e41B),
Minter
0xc20DE371…c52,
L2LPTGateway
0x6D2457a4…318,
L1LPTGateway
0x6142f1C8…676,
BridgeMinter
0x8dDDB96C…405,
L1Escrow
0x6A23F494…10A.
Checked for: a stranger bond that steals another delegator's stake; a ticket redeem without the sender sig; Minter mint to the caller; L2 inbound mint without the L1 counterpart alias.
Result: no user-exploitable finding. Not submitted.
bond/unbond/withdrawStake/withdrawFeesusemsg.sender.bondForWithHintlets a third party pay LPT (transferFromthe caller) but cannot change an already-bonded owner's delegate or force self-delegation on an Unbonded owner.transferBondunbonds the caller and writes a lock for the receiver.rewardis the caller transcoder.rewardForTranscoderrequirestranscoderToRewardCaller[_transcoder] == msg.sender.slashTranscoderisonlyVerifier. The opened comments say Verifier is the null address today and the path is out of audit scope until governance enables it.updateTranscoderWithFeesisonlyTicketBroker.- Ticket redeem
needs the
sender ECDSA,
unused hash,
recipientRand
preimage,
winning
keccak(sig, rand) < winProb, a locked sender, and auxData that matches the RoundsManager block hash inside the validity window. Payout credits the recipient's fee pool, not the redeemer. - Minter
createReward/trustedTransferTokens/trustedBurnTokensareonlyBondingManager. ETH withdraw is BondingManager or JobsManager.setCurrentRewardTokensisonlyRoundsManager.migrateToNewMinteris Controller owner. - L2
outboundTransferburnsmsg.sender(or the routerfrom).finalizeInboundTransferisonlyL1Counterpart(L1 alias). - L1
outboundTransfertransferFroms the sender into escrow.finalizeInboundTransferisonlyL2Counterpart(inbox bridge- outbox
sender).
Extra mint
uses
BridgeMinter.bridgeMint(onlyL1LPTGateway).
- outbox
sender).
Extra mint
uses
- L1Escrow
approveisDEFAULT_ADMIN_ROLE.
Do not file third-party bond-for that pays the caller's LPT, a valid signed winning ticket, or counterpart- gated LPT mint as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for Livepeer bonding / tickets / Minter / LPT bridge is exhausted at the opened-file level. Remaining listed: RoundsManager, BondingVotes, Governor, Treasury, ServiceRegistry, MerkleSnapshot, L2Migrator, DelegatorPool, PollCreator, L1Migrator, L1/L2 data caches, and the go-livepeer website.
2026-09-03: Livepeer leftover remaining rounds + votes + migrators leftover (Sourcify)
Immunefi program
livepeer
($40,000, kyc: true).
Listed remaining after
Arb bonding + tickets
- LPT bridge leftover
(
a5ab106). Sourcify opens every remaining listed address. Official protocol clone/tmp/livepeer-protocole02052a. No mainnet writes from this VM except read-onlyeth_call/eth_getStorageAt. No exploit PoCs.
Files (Sourcify):
RoundsManager impl
0x92d804ed…e841
(proxy
0xdd6f56Dc…c39f),
BondingVotes impl
0x68af8037…3119
(proxy
0x0B9C2548…169A),
LivepeerGovernor impl
0xd2ce37bc…1634
(proxy
0xcFE4E287…6aa0),
Treasury
0xf82C1FF4…8C4,
ServiceRegistry impl
0x38093cdc…b0a7
(proxy
0xC92d3A36…7431),
MerkleSnapshot
0x10736ffa…5f7,
L2Migrator impl
0x93bb0307…58c
(proxy
0x148D5b6B…2085),
DelegatorPool
0xfdb06109…567,
PollCreator
0x8bb50806…2E6,
L2LPTDataCache
0xd78b6bD0…b0B1,
ETH L1Migrator
0x2a69191B…7759,
ETH L1LPTDataCache
0x1d24838b…23D7.
Checked for: a
stranger
initializeRound
that mints extra
LPT; BondingVotes
checkpoint that
rewrites another
account's votes
without
BondingManager;
L2 claimStake
that steals
another EOA's
snapshot stake;
L1 migrate of
another address
without their
key/sig;
DelegatorPool
claim of another
delegator's
share;
permissionless
Merkle root set.
Result: no user-exploitable finding. Not submitted.
initializeRoundis permissionless once per round (lastInitializedRound < currRound). It storesblockHash(block-1), thenbondingManager.setCurrentRoundTotalActiveStake()andminter.setCurrentRewardTokens()(already reviewedonlyRoundsManager).setRoundLength/setRoundLockAmount/setLIPUpgradeRoundareonlyControllerOwner.- BondingVotes
checkpointBondingState/checkpointTotalActiveStakeareonlyBondingManager.delegate/delegateBySigrevert (MustCallBondingManager). Votes are view-only from checkpoints. - Treasury is an
OZ
TimelockControllerUpgradeablewrapper;initializeisinitializer. - LivepeerGovernor
is standard OZ
Governor +
Timelock +
overridable
counting.
relayisonlyGovernance.bumpGovernorVotesTokenAddressis permissionless but only copies ControllerBondingVotes. - L2Migrator
finalizeMigrateDelegator/ UnbondingLocks / Sender areonlyL1Counterpart(l1MigratorAddr)(L1 alias). One-time per l1Addr / lock / sender.claimStakeneedsclaimStakeEnabled- Merkle
LIP-73proof forkeccak(delegator, delegate, stake, fees)withdelegator == msg.sender. Fees pay that delegator.bondForapproves LPT thenbondForWithHint(already reviewed).
- Merkle
- L1Migrator
requireValidMigration:_l1Addr == _l2AddrAND (msg.sender == _l1AddrOR EIP-712 sig from_l1Addr). Replay rejected on L2. Params built from live L1 BondingManager / TicketBroker reads. Admin pause /setL2Migrator/setBridgeMinter. - DelegatorPool
claimisonlyMigrator; proportional owed stake/fees;transferBond+withdrawFeesto_delegator. - MerkleSnapshot
setSnapshotisonlyControllerOwner;verifyis view. - ServiceRegistry
setServiceURIwritesmsg.senderonly. No tokens. - PollCreator
needs
POLL_CREATION_COST(100 LPT) stake and deploys a Poll. No token transfer. Pollvoteis an event;destroyafter end is emptyselfdestruct. - L2LPTDataCache
increase/decreaseL2SupplyFromL1areonlyL2LPTGateway;finalizeCacheTotalSupplyisonlyL1Counterpart.l1CirculatingSupplyis view. - L1LPTDataCache
cacheTotalSupplyis permissionless payable (pays the retryable ticket); L2 finalize is counterpart-gated.
Do not file
permissionless
initializeRound,
a valid L1-signed
same-address
migrate, or
claimStake of
the caller's own
Merkle leaf as
stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for Livepeer rounds / votes / governor / treasury / registry / Merkle / migrators / DelegatorPool / PollCreator / data caches is exhausted at the opened-file level. Remaining listed: the go-livepeer website.
2026-09-03: Axelar leftover DLT tofnd (98de47e)
Immunefi program
axelarnetwork
($500,000, kyc: true).
Listed remaining after
axelar-core evm /
axelarnet / nexus
(126d3d9). Official
clone /tmp/axelar-tofnd
98de47e. Opened
src/main.rs,
src/config/mod.rs,
src/multisig/service.rs,
src/multisig/sign.rs,
src/multisig/keygen.rs,
src/encrypted_sled/kv.rs,
src/encrypted_sled/password.rs.
No mainnet writes.
No exploit PoCs.
Files:
src/main.rs,
src/config/mod.rs,
src/multisig/service.rs,
src/multisig/sign.rs,
src/multisig/keygen.rs,
src/encrypted_sled/kv.rs.
Checked for: a
stranger
Sign / Keygen
that drains
validator keys
without operator
trust; remote
bind that
exposes signing
by default;
password skip
that unlocks
on-disk seed for
an unauthenticated
caller.
Result: no user-exploitable finding. Not submitted.
- Default listen
is
127.0.0.1:50051.--addresscan bind0.0.0.0; that is an operator choice. tonic server has no TLS and no request interceptor. keygen/sign/key_presencehave no caller auth. Anyone who can reach the gRPC port can request a signature. Designed as a localhost / operator-trust sidecar forvald.handle_signregenerates the key from mnemonic seedkey_uidand signsmsg_to_sign. Emptypub_keyuses the active seed.
- Disk store is
XChaCha20Poly1305
with scrypt
(n=15, r=8,
p=1). Password
from stdin
unless
--no-password(documented insecure default). Wrong password fails open.
Do not file
unauthenticated
localhost gRPC
sign, optional
0.0.0.0 bind,
or
--no-password
as stranger
on-chain theft
of user funds.
Not submitted. Payment requires user KYC. Listed Axelar DLT tofnd leftover is exhausted at the opened-file level. Remaining listed: Hyperliquid ITS if a live deploy is in scope.
2026-09-03: Axelar leftover Hyperliquid ITS live (ff21991)
Immunefi program
axelarnetwork
($500,000, kyc: true).
Listed remaining after
tofnd
(41f3059). Official
clone /tmp/axelar-its
ff21991 (ITS
2.2.0). Official
deploy config
axelar-contract-deployments
mainnet
chains.hyperliquid.
Live HyperEVM
RPC
https://rpc.hyperliquid.xyz/evm
(chain 999).
Opened
contracts/hyperliquid/HyperliquidInterchainTokenService.sol,
HyperliquidInterchainToken.sol,
HyperliquidDeployer.sol,
IHyperliquidDeployer.sol,
and
InterchainToken.sol
mint / burn.
No mainnet writes.
No exploit PoCs.
Live addrs:
ITS proxy
0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C
impl
0x4Aca663c242D31F85b77bf27d5D7dA4cF69fa7bd
(runtime sha256
c0901b8f1dc0a03bcc77a1003e1ccf28e489784ac2386538e18376952af8dc63,
contains
updateTokenDeployer
selector
9ef650e5);
interchain token
impl
0x5756160f4ffBCD119D8F547CDE52d68B33083286
(runtime sha256
e3e131eb120bb0812edc4685ad2e03cd6f2f6796ccf626c5ff25161098324589,
contains
updateDeployer
4d413e7d,
deployer()
d5f39488,
and
keccak256('HyperCore deployer')
slot);
factory impl
0x6977477Bd4C053E1BfD0B6F287060c2A4E5E1aA1;
token handler
0x79aE65Ea16E88D3a7303A7FF019353140B06F39B;
token manager
0x2be6F57fb0E69D26F8c8FbbebD8403d88fbAc09c.
Sourcify chain
999 404.
Routescan
999 unsupported.
Checked for: a
stranger
updateTokenDeployer
that retakes
mint rights;
updateDeployer
callable
outside ITS;
HyperCore
deployer slot
aliasing ERC20
balances or
roles.
Result: no user-exploitable finding. Not submitted.
- Live ITS impl
is the
Hyperliquid
subclass, not
vanilla ITS.
Extra method
is
updateTokenDeployergatedonlyOperatorOrOwner. It readsregisteredTokenAddressthen callsIHyperliquidDeployer.updateDeployer. - Token
updateDeployerisonlyService. It writes only slotkeccak256('HyperCore deployer')for Core / EVM spot linking. It does not change minter roles or balances. - Inherited
mint/burnstayonlyRole(MINTER). ITS is added as minter at token setup. - TokenHandler /
TokenManager /
InterchainToken
token-moving
tree already
reviewed in
fbe0017.
Do not file operator-gated HyperCore deployer-slot writes as stranger theft of ITS balances.
Not submitted. Payment requires user KYC. Listed Axelar Hyperliquid ITS leftover is exhausted at the opened-file / live-addr level. Remaining listed: historic Fantom gateway proxy if source opens.
2026-09-03: Gala leftover ETH MTRM + GALA + SILK leftover (Sourcify)
Immunefi program
galagames
($50,000, kyc: true).
No leftover heading
existed. Sourcify
opens all three
listed ETH tokens.
Websites stay out
of this SC track.
No mainnet writes
from this VM.
No exploit PoCs.
Files (Sourcify):
Materium
0xcd17fa52…7581
(exact_match,
Materium.sol +
MinterRole.sol),
GALA proxy
0xd1d2eb1b…7cae
(EIP-1967 impl
0x8D92A681…a5f9,
Gala.sol match),
Silk
0xb045f7f3…7b23
(exact_match,
Silk.sol +
MinterRole.sol).
Checked for: a
stranger
mintBulk /
mint that
inflates supply;
stranger
addMinter /
grantRole;
GALA UUPS
upgrade without
UPGRADER_ROLE;
permit that
drains another
account without
their sig.
Result: no user-exploitable finding. Not submitted.
- Materium
mintBulkisonlyMinter.addMinteris overriddenonlyOwner(constructor owner + first minter). Cap 10_000_000_000 at 0 decimals via_beforeTokenTransferon mint. Burn does not unwind_totalMinted(cap is cumulative). - Silk
mintBulkisonlyMinter.addMinterisonlyOwner. Cap 100_000_000e8.burn/burnFromsubtract_totalMintedso a minter can remint burned units up to the cap. - GALA impl is
UUPS
upgradeable
ERC20 +
permit +
pause +
AccessControl.
initializeis disabled in the constructor.mint/mintBulkareonlyRole(MINTER_ROLE). Cap 50_000_000_000e8 on mint.addMinter/addUpgrader/addBlocklister/transferAdmingo throughgrantRole(onlyRoleof the role admin)._authorizeUpgradeisonlyRole(UPGRADER_ROLE). Pause isDEFAULT_ADMIN_ROLE. Blocklist isBLOCKLISTER_ROLEand cannot list a live minter / upgrader / blocklister.permitis OZ ERC20Permit plus blocklist / pause. - Transfers
use the
inherited
ERC20
msg.sender/transferFromallowance paths.
Do not file
minter-gated
mintBulk,
owner-gated
addMinter,
or admin-gated
GALA upgrade
as stranger
theft.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for Gala ETH tokens is exhausted at the opened-file level. Remaining listed: the gala.com / app / wallet / node / film / music websites.
2026-09-03: Serai leftover listed crypto + bitcoin leftover (4b89cf0)
Immunefi program
serai
($30,000, kyc: true).
No leftover heading
existed. Official
clone /tmp/serai
4b89cf0 (develop).
Opened every listed
path. No mainnet
writes. No exploit
PoCs.
Files:
crypto/ciphersuite/src/lib.rs
kp256/src/lib.rs,crypto/dkg/src/lib.rs,crypto/dkg/musig/src/lib.rs,crypto/frost/src/{lib,sign,nonce,algorithm}.rs,crypto/schnorr/src/lib.rs,crypto/schnorrkel/src/lib.rs,crypto/transcript/src/lib.rs,crypto/dalek-ff-group/src/lib.rs,crypto/multiexp/src/lib.rs,networks/bitcoin/src/{crypto,wallet/mod,wallet/send}.rs.
Checked for: a
stranger
Schnorr / FROST
forge without a
share; MuSig
aggregation that
drops another
key; Bitcoin
SignableTransaction
that spends a
UTXO the caller
does not hold;
DKG view that
leaks another
participant's
secret share.
Result: no user-exploitable finding. Not submitted.
- Ciphersuite
read_F/read_Greject non-canonical encodings.hash_to_Fdocuments DST substring risk; suites use expand-message XMD. - DKG
ThresholdParamsrejectst==0/t>n/ participant0.ThresholdKeys::newchecks share count and Constant interpolation only whent==n.scale(0)isNone.viewrequires the localiin the set. Offset is added only to the lowest included participant after interpolation. Serialize omits the ephemeral scalar/offset. - MuSig is
n-of-n.
Duplicate
keys revert.
Binding
factor is
hash_to_F("dkg-musig", context || n || keys || i). Missing own pubkey isNotPresent. - Schnorr is
s = r + cxwith a caller-supplied challenge (documented binding requirement). - FROST is
two-round.
CachedPreprocessreuse is documented share recovery (operator). Binding factors bind group key + message + preprocess transcript. Nonce isd + e*rho.completeverifies the group sig, then blames a bad share. Preprocess must be on an authenticated channel (documented). - Schnorrkel
HRAm prefixes
context
length.
Verify uses
schnorrkelagainst the group key. - Bitcoin
tweak_keysadds the BIP-341 unspendable script path then even-Y scale.multisigrefuses keys whose P2TR script does not match the prevout.signrequires an empty msg and signs the taproot key- spend sighash. Preprocess cache is unimplemented. - Transcript length- prefixes typed members and forks the challenge to block length extension. Multiexp / dalek-ff-group are math wrappers.
Do not file FROST preprocess reuse, an unauthenticated signing channel, or a threshold spend of keys the signers already hold as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub of listed types opens for Serai crypto + bitcoin is exhausted at the opened-file level. Remaining listed: none (other Serai crates are not in the asset list).
2026-09-03: Livepeer leftover go-livepeer client (38eb47d)
Immunefi program
livepeer
($40,000, kyc: true).
Listed remaining after
rounds / votes /
governor / helpers
(281a0b4). Official
clone
/tmp/go-livepeer
38eb47d
(release
v0.9.2).
Opened
pm/validator.go,
pm/recipient.go,
pm/sender.go,
pm/ticket.go,
pm/sigverifier.go,
crypto/verify.go,
eth/accountmanager.go,
server/webserver.go,
server/remote_signer.go,
cmd/livepeer/starter/starter.go.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
ticket redeem
without the
sender sig;
forged
recipientRand
that steals
deposit;
unauth CLI
transferTokens
on the default
bind;
remote-signer
ticket mint
against another
operator's
key without
reaching their
signer.
Result: no user-exploitable finding. Not submitted.
RecipientRandHashValidateTicketrequires recipient match, non-zero sender, `keccak256(pad32(recipientRand)), andVerifySig(sender, ticket.Hash(), sig).VerifySigusesaccounts.TextHash` and rejects high-s / bad v.recipientRandis HMAC-SHA256 of seed + sender + faceValue + winProb + expiry + price- aux under a
local 32-byte
secret.
Winning check
is
keccak(sig, pad32(rand)) < WinProb.
- aux under a
local 32-byte
secret.
Winning check
is
- Sender tickets are signed by the node's Ethereum account keystore (unlock / passphrase).
- CLI defaults to
127.0.0.1. Tx routes (transferTokens,withdraw,bond,signMessage, ticket fund / unlock) are behind-enableCliTxRoutes(default false). Wildcard-cliAddrlogs a warning. - Remote signer
GenerateLivePaymentsigns tickets with the local key. State updates need that key's sig. Webhook auth is optional. Designed as an operator sidecar.
Do not file unauthenticated localhost CLI tx routes, optional wildcard bind, or a reachable remote-signer without webhook as stranger theft of a user who did not run that node.
Not submitted. Payment requires user KYC. Listed Livepeer go-livepeer client leftover is exhausted at the opened-file level. Remaining listed: none for this program (L1 contracts stay paused).
2026-09-03: Felix leftover feUSD + borrower + redeem leftover (10b5457)
Immunefi program
felix
($100,000, kyc: true).
No leftover heading
existed. Sourcify
chain 999 404.
Official clone
/tmp/felix-contracts
10b5457. Liquity
V2-style CDP on
HyperEVM. No
mainnet writes.
No exploit PoCs.
Files:
src/feUSDToken.sol,
src/BorrowerOperations.sol,
src/Dependencies/AddRemoveManagers.sol,
src/TroveNFT.sol,
src/CollateralRegistry.sol,
src/TroveManager.sol
(redeemCollateral),
src/StabilityPool.sol
(provideToSP /
withdrawFromSP /
provideToSpOnBehalfOf),
src/ActivePool.sol
(send / mint
gates).
Live addrs
(HyperEVM 999):
feUSD proxy
0x02c6a2fa…6c70
(impl
0x444322C3…2598),
Collateral
Registry
0x9de1e570…711b,
Borrower
Operations
0x5b271dc2…0a3,
Trove Manager
0x3100f4e7…be62,
Stability Pool
0x576c9c50…fd6b,
Active Pool
0x39ebba74…cc9e,
Trove NFT
0x5ad1512e…aaa7.
Checked for: a
stranger
mint of
feUSD; close
of another
owner's trove;
Stability Pool
withdraw of
another
depositor;
redeemCollateral
that burns
someone else's
feUSD.
Result: no user-exploitable finding. Not submitted.
- feUSD
initializeis disabled in the constructor.mintis BO or Active Pool.burnis Collateral Registry / BO / TM / SP.sendToPool/returnFromPoolare SP only.setCollateralRegistryisonlyOwnerthenrenounceOwnership.setBranchAddressesis the registry owner. openTrovepulls coll and gas-comp WHYPE frommsg.senderand mints the Trove NFT to_owner.closeTrove/ coll-down adjust require owner or remove manager (AddRemoveManagers; only the NFT owner can set managers). Repay burnsmsg.senderfeUSD.- TroveNFT
mint/burnare TroveManager only. - Collateral
Registry
redeemCollateralburnsmsg.senderfeUSD after TM redeem. TMredeemCollateralis registry only. - Stability
Pool
provideToSP/withdrawFromSPusemsg.senderdeposits.provideToSpOnBehalfOfcredits_onBehalfOfbut pulls feUSD from the caller. - ActivePool
sendCollis BO / TM / SP. Interest mint is BO / TM / SP.
Do not file
opening a
trove for
another
_owner
while paying
the caller's
collateral,
or a feUSD
redemption
that takes
the lowest-
rate troves
as protocol
theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
GitHub opens
for Felix
feUSD /
borrower /
redeem / SP
is exhausted
at the
opened-file
level.
Remaining
listed: UBTC
branch twins,
price feeds,
Hint Helpers,
WHYPE
0x5555…5555,
zappers,
admin
controllers,
Sorted /
Default /
Gas /
Surplus
pools,
TroveManagerLst,
and Primacy
of Impact.
2026-09-03: Felix leftover zappers + leftover pools leftover (10b5457)
Immunefi program
felix
($100,000, kyc: true).
Listed remaining after
feUSD + borrower +
redeem leftover
(b569abc). Official
clone
/tmp/felix-contracts
10b5457. No mainnet
writes. No exploit
PoCs.
Files:
src/Zappers/{Base,WHYPE,GasComp,LeverageLST,LeverageWHYPE,Wrapper,FeUSD}Zapper.sol,
LeftoversSweep.sol,
Modules/FlashLoans/BalancerFlashLoan.sol,
src/{CollSurplus,Default,Gas}Pool.sol,
src/SortedTroves.sol,
src/HintHelpers.sol,
src/TroveManagerLst.sol,
src/{Base,}AdminController{,NoDelays,V2,V3}.sol,
src/PriceFeeds/HLPriceFeed.sol.
Checked for: a
stranger
closeTroveFromCollateral
that drains
another NFT;
flash-loan
callback that
closes without
being the
remove manager;
CollSurplus
claimColl of
another
account;
admin apply
without a
role.
Result: no user-exploitable finding. Not submitted.
- WHYPE /
GasComp
closeTroveFromCollateralandcloseTroveToRawHYPErequire owner or remove manager. Flash-loan receive isflashLoanProvideronly. Coll leftover and gas-comp go to that receiver. - Leverage
leverUp/leverDownuse the same owner / remove-manager gate. Open sets the zapper as add/remove manager then restores the caller's managers. - Wrapper close / raw HYPE / flash-loan receives are empty no-ops.
- FeUSD zapper pulls the caller's coll / USDC. Extra borrow requires this contract to be both remove manager and receiver.
- Balancer
flash loan
sets
receiver = msg.senderfor one callback and requires the Balancer vault. - CollSurplus
accountSurplusis TM;claimCollis BO. DefaultPool send / debt are TM or Active Pool. GasPool only approves BO and TM. - SortedTroves insert / reInsert are BO; remove is BO or TM.
- HintHelpers is view / predict only.
TroveManagerLstisTroveManagerwithfetchRedemptionPriceinstead offetchPrice.- Admin
propose is
PROPOSER_ROLE; apply / upgrade isDEFAULT_ADMIN_ROLE; shutdown isSHUTDOWN_ROLE.AdminControllerNoDelayssets both delays to0 days(admin, not stranger). HLPriceFeedreads Hyperliquid L1oraclePxat0x44AFB4F9…CA2a. A zero price shuts the branch via BO.- UBTC branch
twins are
the same
types
already
reviewed.
WHYPE
0x5555…5555is the Hyperliquid system wrap, not a Felix minter.
Do not file zapper close when the zapper is the owner-set remove manager, or zero-delay admin apply as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
GitHub opens
for Felix
zappers /
leftover pools /
Sorted /
HintHelpers /
TroveManagerLst
/ admin /
HLPriceFeed is
exhausted at
the opened-file
level.
Remaining
listed:
RedStone /
composite
price feeds,
and Primacy
of Impact.
2026-09-03: OnRe leftover Solana program money path (f6a4c6e)
Immunefi program
onre
($100,000, kyc: true).
Unique unused
standing program.
Official clone
/tmp/onre-sol
f6a4c6e. Default
program id
onreuGhHHgVzMWSkj2oQDLDtvvGvoepBPkqyaubFcwe
matches the listed
Solscan account.
Opened
programs/onreapp/src/lib.rs,
instructions/offer/take_offer.rs,
take_offer_permissionless.rs,
offer_utils.rs,
make_offer.rs,
mint_authority/mint_to.rs,
redemption/create_redemption_request.rs,
fulfill_redemption_request.rs,
cancel_redemption_request.rs,
vault_operations/offer_withdraw.rs.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
take_offer
that spends
another user's
ATA; mint_to
that credits a
non-boss;
redemption
fulfill that
pays the
caller instead
of the stored
redeemer;
vault withdraw
by a
non-boss.
Result: no user-exploitable finding. Not submitted.
take_offer/take_offer_permissionlessrequireuser: Signerand ATAsauthority = user.token_inis pulled from that user;token_outis minted / transferred to that user's ATA. Offer PDA seeds are the two mints.needs_approvaloffers check an ed25519 approval for that user againstapprover1/approver2. Kill switch blocks takes.mint_toisboss: Signerhas_one = bossand mints only to the boss ONyc ATA.Create redemption locks the signer's
request.redeemer` and pays that ATA. Cancel returns the unfulfilled remainder to the stored redeemer (signer may be redeemer / worker / boss).token_inand storesredeemer = signer. Fulfill requires `redeemer.key()- Offer vault
withdraw is
bosssigner +has_one = boss.
Do not file boss-only mint / vault withdraw, or a user paying their own ATA into a priced offer as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for OnRe take / mint / redeem is exhausted at the opened-file level. Remaining listed: prop AMM, buffer / reserve vault, configurable vault, and market-stats views.
2026-09-03: Felix leftover RedStone + composite price feeds leftover (10b5457)
Immunefi program
felix
($100,000, kyc: true).
Listed remaining after
zappers + leftover
pools leftover
(9e2d560). Official
clone
/tmp/felix-contracts
10b5457. Opened
src/PriceFeeds/.
No mainnet writes.
No exploit PoCs.
Files:
RedStonePriceFeedBase.sol,
RedStonePriceFeedBaseLst.sol,
RedstoneCompositePriceFeedLst.sol,
WHYPERedStonePriceFeed.sol,
BTCRedStonePriceFeedOracle.sol,
MainnetPriceFeedBase.sol,
CompositePriceFeed.sol,
and the LST
wrappers
(WSTHYPE,
KHYPE,
WHYPE).
Checked for: a
stranger
fetchPrice
that writes
an arbitrary
USD price;
permissionless
oracle
aggregator
swap.
Result: no user-exploitable finding. Not submitted.
- RedStone
feeds read
AggregatorV3.latestRoundData. Stale / non-positive / revert shuts the branch via BOshutdownFromOracleFailureand freezeslastGoodPrice. - Composite
LST feeds
multiply a
market
oracle by a
canonical
rate
provider.
fetchRedemptionPriceis the same path with a redemption flag. Shutdown switches to HYPE-USD * canonical. WHYPERedStonePriceFeedinitialize isinitializer. No setter for the aggregator after init.- Mainnet
Chainlink
base
setAddressesisonlyOwnerthen renounces. - No public
setPrice/transmiton these wrappers.
Do not file a shutdown on a stale RedStone round as stranger theft of trove collateral.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub of listed types opens for Felix price feeds is exhausted at the opened-file level. Remaining listed: Primacy of Impact.
2026-09-03: OnRe leftover prop AMM + buffer + configurable vault (f6a4c6e)
Immunefi program
onre
($100,000, kyc: true).
Official clone
/tmp/onre-sol
f6a4c6e.
Opened
programs/onreapp/src/instructions/prop_amm/buy.rs,
sell.rs,
validation.rs,
buffer/deposit_reserve_vault.rs,
withdraw_reserve_vault.rs,
settle_buffer.rs,
accrue_buffer.rs,
burn_for_nav_increase.rs,
set_buffer_fee_config.rs,
configurable_vault/set_destination.rs,
withdraw.rs,
market_info/refresh_market_stats.rs.
No mainnet writes.
No exploit PoCs.
Checked for: a stranger prop-AMM buy or sell that spends another user's ATA; permissionless configurable-vault withdraw that pays the caller; reserve-vault withdraw by a non-boss; buffer settle or accrue that mints to an attacker ATA.
Result: no user-exploitable finding. Not submitted.
OpenSwapBuy/OpenSwapSellrequireuser: Signer. User token accounts areUncheckedAccountbutget_associated_token_account/get_or_create_associated_token_accountbindauthority = userand the expected mint / token program.token_inis pulled from that user ATA;token_outis minted or paid only to that user's ATA. Pair validation requires the canonical offer PDA (asset,onyc) plus an enabledPropAmmPairStatefor that offer. Kill switch blocks both sides. Buy proceeds and fees land in seeded configurable vaults (proceeds / buy-fee); sell routes through redemption ops into proceeds / sell-fee vaults and the stored user out ATA.- Reserve
vault
deposit
is
depositor: Signerpulling the depositor's own ONyc ATA. Withdraw isboss: Signerhas_one = bossand pays only the boss ONyc ATA via the reserve-vault PDA. settle_bufferisworker: Signerhas_one = worker. Accrual mints only to reserve / management-fee / performance-fee vault ATAs validated byvalidate_buffer_onyc_vault_accounts. Fee config andburn_for_nav_increaseare boss-only.- Configurable
vault
set_destinationisboss: Signerhas_one = boss.withdrawis permissionless (caller: Signer) but the destination account must equalconfigurable_vault.withdrawal_destinationand tokens move only to that ATA. Amount0withdraws the full vault balance to the stored destination, not the caller. - Market-stats
refresh
is
permissionless
and only
recomputes
the
canonical
PDA
against
state.main_offer. View helpers (get_nav,get_tvl,get_apy, circulating supply) do not move tokens.
Do not file boss-only reserve withdraw / fee-config / NAV burn, worker-only buffer settle, a user paying their own ATA into a priced prop-AMM swap, or permissionless withdraw-to-stored-destination as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for OnRe prop AMM / buffer / configurable vault / market-stats is exhausted at the opened-file level.
2026-09-03: MUX leftover mux3 orderbook + pool + position leftover (8674f2b)
Immunefi program
mux
($100,000, kyc: false).
Unique unused
standing program
with public
GitHub smart-contract
scope.
Official clone
/tmp/mux3
8674f2b
(mux-world/mux3-protocol,
tag message
deploy).
Opened
contracts/orderbook/OrderBook.sol,
Delegator.sol,
libraries/LibOrderBook.sol,
LibOrderBook2.sol,
core/trade/FacetOpen.sol,
FacetPositionAccount.sol,
PositionAccount.sol,
pool/CollateralPool.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a stranger place/fill that spends another trader's positionId; cancel that refunds collateral to the caller; liquidity add/remove that mints or pays a non-LP; core deposit/withdraw callable outside the OrderBook; Delegator acting without the stored hot-wallet grant.
Result: no user-exploitable finding. Not submitted.
placePositionOrder,placeWithdrawalOrder,depositCollateral,withdrawAllCollateral, andmodifyPositionOrderdecode the owner frompositionIdand requiremsg.sender == ownerunlessDELEGATOR_ROLE.placeLiquidityOrderrecordsmsg.senderas the order account.transferTokenFromis Delegator-only.depositGas/withdrawGasbindaccount == msg.senderexcept Delegator.- Fills
(
fillPositionOrder,fillLiquidityOrder,fillWithdrawalOrder,fillRebalanceOrder,liquidate,fillAdlOrder,reallocate) areonlyRole(BROKER_ROLE). Open/close on the diamond (FacetOpen) and account deposit / withdraw (FacetPositionAccount) areonlyRole(ORDER_BOOK_ROLE). Position owner is the address decoded frompositionIdat account create._withdrawFromAccountpayspositionAccount.owner(optionally via the swapper). - Liquidity
add mints
shares to
orderData.account; remove burns shares held by the pool andsafeTransfers collateral to that same account. PooladdLiquidity/removeLiquidity/rebalance/receiveFeeareonlyOrderBook; open/close position on the pool isonlyCore. - Cancel:
owner
(or
broker
after
expiry,
or
Delegator)
can
cancel a
position /
withdrawal
order.
Open-position
collateral
and LP
add/remove
inventory
refund to
orderData.account, notmsg.sender. Liquidity cancel is owner-only.
msg.senderDelegator.delegateismsg.sendergranting a hot wallet a finiteactionCount._consumeDelegationrequires `delegation.delegatorand a remaining count. OrderBookDELEGATOR_ROLE` is admin-granted and not a stranger path.
Do not file broker-only fills, admin DELEGATOR_ROLE, owner-set hot-wallet delegation, or a trader paying their own tokens into a priced order as stranger theft.
Not submitted.
Listed leftover
that official
GitHub opens
for mux3
OrderBook /
Delegator /
CollateralPool /
position
account is
exhausted at
the
opened-file
level.
Remaining
listed MUX
trees:
mux-protocol
core /
orderbook /
components,
mux-aggregator-protocol
proxyFactory /
gmxV2,
mux-degen-protocol,
and
mux-staking.
2026-09-03: MUX leftover mux-protocol core + orderbook leftover (0f70a70)
Immunefi program
mux
($100,000, kyc: false).
Listed leftover
after mux3.
Official clone
/tmp/mux-protocol
0f70a70.
Opened
contracts/orderbook/OrderBook.sol,
Admin.sol,
libraries/LibOrderBook.sol,
LibOrder.sol,
LibSubAccount.sol,
core/Account.sol,
Liquidity.sol,
Storage.sol,
components/NativeUnwrapper.sol,
governance/Vault.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a stranger place/fill that spends another subAccountId; cancel that refunds to the caller; add/remove liquidity that pays a non-LP; core deposit/withdraw callable outside the OrderBook; NativeUnwrapper unwrap to an arbitrary recipient.
Result: no user-exploitable finding. Not submitted.
subAccountId.getSubAccountOwner()placePositionOrder3,placeWithdrawalOrder, anddepositCollateralrequire `msg.senderunlessaggregators[msg.sender](maintainer-set).placeLiquidityOrderrecords_msgSender()as the LP account and_transferInpulls ERC20 from that trader (or wrapsmsg.valueWETH).withdrawAllCollateral` is owner-only and requires position size- Fills
(
fillPositionOrder,fillLiquidityOrder/fillLiquidityOrder2,fillWithdrawalOrder,fillRebalanceOrder,liquidate, funding updates) areonlyBroker. CoredepositCollateral,withdrawCollateral,withdrawAllCollateral,addLiquidity,removeLiquidity, andredeemMuxTokenareonlyOrderBook. Withdraw and remove-liquiditytransferOutto the decoded trader /order.account. Add liquiditytransfers MLP totrader. - Cancel:
owner
(or
broker
after
expiry,
or
aggregator)
for
position /
withdrawal.
Open-position
collateral
refunds
to
getOrderOwner()(account in the packed subAccountId). Liquidity cancel is owner-only and returns collateral or MLP toorder.account. NativeUnwrapper.unwraprequires owner whitelist of callers and sends ETH (or re-wrapped WETH on failed call) to the suppliedto.VaultETH / ERC20 sweeps areonlyOwner.POLis a protocol-owned liquidity helper with owner gates.
Do not file broker-only fills, maintainer aggregator / broker lists, owner-only Vault / unwrapper whitelist, or a trader paying their own tokens into a priced order as stranger theft.
Not submitted.
Listed leftover
that official
GitHub opens
for
mux-protocol
core /
orderbook /
components /
Vault is
exhausted at
the
opened-file
level.
Remaining
listed MUX
trees:
mux-aggregator-protocol
proxyFactory /
gmxV2,
mux-degen-protocol,
and
mux-staking.
2026-09-03: Linea leftover TokenBridge + rollup + yield leftover (a83412e / a9a43aa / main)
Immunefi program
linea
($100,000, kyc: true).
Unique unused
standing program.
Not previously
logged. Official
GitHub
Consensys/linea-monorepo
listed SHAs
a83412e
(TokenBridge /
LineaRollup /
ZkEvmV2 /
L2MessageService /
L1MessageService)
and
a9a43aa
(L1 / L2 Linea
token), plus
main yield
files. Extract
/tmp/linea-src.
No mainnet
writes.
No exploit
PoCs.
Opened
contracts/contracts/tokenBridge/TokenBridge.sol,
BridgedToken.sol,
contracts/contracts/LineaRollup.sol,
ZkEvmV2.sol,
messageService/l2/L2MessageService.sol,
l2/v1/L2MessageServiceV1.sol,
l2/L2MessageManager.sol,
l1/L1MessageService.sol,
MessageServiceBase.sol,
contracts-tge/src/L1/LineaToken.sol,
L2/L2LineaToken.sol,
contracts/src/yield/YieldManager.sol,
LidoStVaultYieldProvider.sol,
LidoStVaultYieldProviderFactory.sol.
Checked for: a
stranger
completeBridging
that mints or
pays without
the message
service;
claimMessage
that pays the
caller instead
of _to;
finalizeBlocks
by a
non-operator
that anchors
forged L2
roots;
L2 LINEA
mint without
the canonical
bridge;
permissionless
fundYieldProvider
that moves
reserve ETH.
Result: no user-exploitable finding. Not submitted.
bridgeTokenburns bridged tokens frommsg.senderorsafeTransferFromthe caller and uses the received balance as the remote amount.completeBridgingisonlyMessagingServiceonlyAuthorizedRemoteSenderand either transfers native tokens to_recipientor mints the bridged token to that recipient. BridgedTokenmint/burnareonlyBridge.- L2
claimMessagemarks a previously anchored inbox hash claimed andcalls_towith_value. The fee goes to_feeRecipientor the postman (msg.senderwhen that field is zero), not as a substitute for the intended_to. L1claimMessageWithProofrequires a finalized L2 Merkle root and the same hashed leaf.sendMessageonly spendsmsg.value. finalizeBlocksisOPERATOR_ROLEand_verifyProofagainst the registered verifier. L2anchorL1L2MessageHashesisL1_L2_MESSAGE_SETTER_ROLE.- L1 LINEA
mintisMINTER_ROLE. L2 LINEAmint/burnare the stored canonical token bridge.syncTotalSupplyFromL1is message-service- remote L1 token.
- YieldManager
fundYieldProvider/unstake/safeWithdrawFromYieldProvider/reportYieldare role gated.unstakePermissionlessonly runs while the reserve is in deficit and caps the amount to the remaining target gap. Lido provider money paths areonlyDelegateCall. The factory only deploys an uninitialized provider (YieldManageraddYieldProvideris permissioned).
Do not file operator finalization, postman fee on a valid claim, permissionless L1 supply sync, or deficit-capped permissionless unstake as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for Linea TokenBridge / rollup / message service / TGE tokens / yield is exhausted at the opened-file level. Remaining listed: the immunefi.com scope placeholder.
2026-09-03: MUX leftover mux-degen orderbook + pool leftover (c5bfe81)
Immunefi program
mux
($100,000, kyc: false).
Listed leftover
after mux3
and
mux-protocol.
Official clone
/tmp/mux-degen
c5bfe81.
Opened
contracts/orderbook/OrderBook.sol,
Admin.sol,
libraries/LibOrderBook.sol,
facets/Account.sol,
Liquidity.sol,
Trade.sol,
peripherals/DegenPOL.sol,
DegenFeeDistributor.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a stranger place/fill that spends another subAccountId; cancel that refunds to the caller; add/remove liquidity that pays a non-LP; core deposit/withdraw callable outside the OrderBook; POL sweeps by a non-owner.
Result: no user-exploitable finding. Not submitted.
subAccountId.owner()placePositionOrder,placeWithdrawalOrder,depositCollateral, andwithdrawAllCollateralrequire_verifyCaller(`msg.senderor admin-setdelegators).placeLiquidityOrderrecords_msgSender()as the LP account and_transferIn/transferFrom` pulls from that account.- Fills
(
fillPositionOrder,fillLiquidityOrder,fillWithdrawalOrder,liquidate,fillAdlOrder) areonlyRole(BROKER_ROLE). PooldepositCollateral,withdrawCollateral,withdrawAllCollateral,addLiquidity,removeLiquidity,donateLiquidity, and open/close / liquidate on Trade areonlyOrderBook. Withdraw and remove-liquiditytransferOutto the decoded trader /orderData.account. Add liquidity mints MLP totrader. - Cancel:
owner
(or
broker
after
expiry)
for
position /
withdrawal.
Open-position
collateral
refunds
to
orderData.account. Liquidity cancel is owner-only and returns collateral or MLP to that account. setDelegatorisDEFAULT_ADMIN_ROLE.DegenPOLETH / ERC20 sweeps and cancel are owner / maintainer. Fee distributor maintainers are owner-set.
Do not file broker-only fills, admin delegator lists, owner-only POL sweeps, or a trader paying their own tokens into a priced order as stranger theft.
Not submitted.
Listed leftover
that official
GitHub opens
for
mux-degen
OrderBook /
Account /
Liquidity /
Trade /
POL is
exhausted at
the
opened-file
level.
Remaining
listed MUX
trees:
mux-aggregator-protocol
proxyFactory /
gmxV2,
and
mux-staking.
2026-09-03: MUX leftover mux-aggregator proxyFactory + gmxV2 leftover (0f36131)
Immunefi program
mux
($100,000, kyc: false).
Last listed
MUX GitHub
tree after
mux3 /
mux-protocol /
mux-degen.
Official clone
/tmp/mux-agg
0f36131.
Opened
contracts/proxyFactory/ProxyFactory.sol,
aggregators/gmxV2/GmxV2Adapter.sol,
aggregators/gmx/GmxAdapter.sol,
lendingPool/LendingPool.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a stranger proxy call that spends another account's tokens; borrow/repay from a non-proxy; GmxV2 place/cancel by a non-owner; LendingPool withdraw by a non-owner.
Result: no user-exploitable finding. Not submitted.
proxyFunctionCall/proxyFunctionCall2,transferToken/transferToken2,wrapAndTransferNative/2,muxFunctionCall,mux3PositionCall, and cancels require_verifyCaller(msg.sender == accountor owner-set_delegators). ERC20 pulls usesafeTransferFrom(account, proxy). Proxies are created per(project, account, collateral, asset, isLong)and initialize with that owner.borrowAsset/repayAsseton the factory require_isCreatedProxy(msg.sender). LendingPoolborrowToken/repayTokenareonlyBorrower(owner-set).withdrawisonlyOwner.depositpulls frommsg.senderinto protocol supply (no depositor claim token).- GmxV2
placeOrder/updateOrderareonlyTrader(factory oraccount.owner). Cancel is trader or keeper. Liquidate isonlyKeeper. Gmx V1openPositionhard-revertsNotAllowed. - Keepers, delegators, and maintainers are owner-set.
Do not file owner-set keeper / delegator lists, owner-only LendingPool withdraw, protocol deposit-without-shares, or a trader paying their own tokens into their proxy as stranger theft.
Not submitted.
Listed leftover
that official
GitHub opens
for
mux-aggregator
proxyFactory /
gmxV2 is
exhausted at
the
opened-file
level.
mux-staking
clone is
private /
404.
MUX listed
GitHub
smart-contract
scope is
exhausted
at the
opened-file
level.
2026-09-03: Berachain leftover RewardVault + Honey + WBERA staker leftover (70e392f)
Immunefi program
berachain
($100,000, kyc: true).
Unique unused
standing program
with public
GitHub smart-contract
scope.
Official clone
/tmp/bera-contracts
70e392f.
Opened
src/pol/rewards/RewardVault.sol,
RewardVaultHelper.sol,
src/base/StakingRewards.sol,
src/honey/HoneyFactory.sol,
src/pol/WBERAStakerVault.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
withdraw that
spends another
user's
self-stake;
helper
claim/withdraw
that pays
the caller
instead of
msg.sender's
account;
Honey
redeem that
burns another
user's Honey;
WBERA
queue/complete
that steals
another
owner's
shares.
Result: no user-exploitable finding. Not submitted.
RewardVault.stakepullsstakeTokenfrommsg.senderinto the vault and credits that caller.withdrawrequirescheckSelfStakedBalanceand paysmsg.sender.delegateWithdrawonly reduces that delegate's recorded stake and pays the delegate.stakeOnBehalfis a donation of the caller's tokens.getRewardisonlyUserOrOperator(or the helper).withdrawAllForisonlyRewardVaultHelper.- Helper
claimAllRewards/withdrawAllFromVaultsalways act asmsg.senderand send rewards / stake tokens to the suppliedreceiver. Vault_withdrawpaysmsg.sender(the helper), which then forwards toreceiver. - Honey
mintpulls collateral frommsg.senderandhoney.mints toreceiver.redeemhoney.burns the caller and redeems vault assets toreceiver. - WBERA
staker is
ERC4626:
deposit /
mint
credit
receiver.queueRedeem/queueWithdrawspend allowance whencaller != ownerand mint a withdrawal NFT. Complete pays storedrequest.receiver. NFTburnis vault-only.
Do not file delegate withdraw of the delegate's own stake, owner-set operators, or a user minting Honey / staking their own tokens as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
GitHub opens
for
Berachain
RewardVault /
Honey /
WBERA
staker is
exhausted at
the
opened-file
level.
Remaining
listed:
airdrop-contracts,
beacon-kit /
bera-reth
DLT, and
POL
distributor /
LST vault /
BeaconDeposit
/ BGT
redeem.
2026-09-03: Exactly leftover Market + DebtManager leftover (Sourcify)
Immunefi program
exactly
($25,000, kyc: true).
Unique unused
standing program.
Optimism
Sourcify
match on
listed
addresses.
Market /
Auditor /
Rewards /
DebtManager /
MarketETHRouter
sources from
impl extracts
(RewardsController
0x0399…a95f7f,
Auditor
0x3f55…3c46,
DebtManager
0xa7bf…e16e2,
MarketETHRouter
0x8849…056C).
EscrowedEXA
0x2d55…1E280.
Refunder
0xd5f8…dd228.
Official clone
/tmp/exactly-protocol
4b5fec7
matches those
periphery
files.
No mainnet
writes.
No exploit
PoCs.
Opened
contracts/Market.sol,
Auditor.sol,
RewardsController.sol,
periphery/DebtManager.sol,
MarketETHRouter.sol,
periphery/EscrowedEXA.sol,
src/Refunder.sol.
Checked for: a
stranger
borrow /
withdrawAtMaturity
that spends
another
account
without
allowance;
seize that
pays a
non-liquidator;
DebtManager
leverage that
deposits to
the caller;
ETH router
withdraw that
unwraps
another
account's
WETH;
rewards
claim of
another
account
without a
keeper.
Result: no user-exploitable finding. Not submitted.
- Market
borrow/borrowAtMaturity/withdrawAtMaturitycallspendAllowancewhenmsg.sender != owner. Floatingwithdraw/redeemare ERC-4626 with shortfall checks.depositAtMaturitypullsmsg.senderand creditsreceiver.repay/refundpull the caller. liquidaterequires auditor shortfall, pulls the liquidator, andseizeonly from a listed market (checkSeize).clearBadDebtis auditor-only.- DebtManager
leverage/deleveragearemsgSenderand operate_msgSenderpositions. Flash-loan receive is the Balancer vault. - MarketETHRouter
wraps
msg.valueand deposits / borrows / withdraws formsg.sender.receiveis WETH only. - Rewards
claim/claimAlluseclaimSender(msg.senderor permit).claimOnBehalfOfis keeper-only. Refunderrefundis keeper + issuer signature and deposits to the named account.
Do not file allowance-gated borrow / withdraw, liquidator seize after repay, or keeper / issuer card refunds as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that Sourcify
opens for
Exactly Market /
Auditor /
DebtManager /
ETH router /
rewards /
Refunder is
exhausted at
the
opened-file
level.
Remaining
listed:
Sourcify-404
proxy impls
(0x6E1B…3Cff,
0xCEed…52b
and unnamed
impls),
ExaPlugin /
ProposalManager /
WebauthnOwnerPlugin /
IssuerChecker,
and the
immunefi.com
placeholder.
2026-09-03: Exactly leftover remaining ExaPlugin leftover (Sourcify)
Immunefi program
exactly
($25,000, kyc: true).
Listed remaining after
Market + DebtManager leftover
(58d5e53). Optimism
Sourcify
match:
ExaPlugin
0x3d73…473e,
ProposalManager
0x6817…c838,
IssuerChecker
0x59a6…eb3a,
WebauthnOwnerPlugin
0x8f49…4ca0.
Extract
/tmp/exactly-src.
No mainnet
writes.
No exploit
PoCs.
Opened
src/ExaPlugin.sol,
src/ProposalManager.sol,
src/IssuerChecker.sol,
src/WebauthnOwnerPlugin.sol.
Checked for: a
stranger
collectCredit
that borrows
another
account to
the
collector;
executeProposal
that spends
another
account's
queued
proposal;
propose
that queues
for a
victim;
IssuerChecker
replay;
Webauthn
updateOwners
of another
account.
Result: no user-exploitable finding. Not submitted.
- Collect
paths
(
collectCredit/collectDebit/collectCollateral/collectInstallments) are keeper-only in the plugin manifest and require an IssuerChecker EIP-712 collection signature formsg.sender. Credit borrows EXA_USDC to the stored collector for that sender. Debit withdraws the sender's EXA_USDC to the collector. proposeis self-only and queuesmsg.sendervia ProposalManagerPROPOSER_ROLE.executeProposalis keeper or self, waitsdelay, and executesnextProposal(msg.sender). Market withdraw / borrow hooks consume that account's queued proposal or a collector role.- IssuerChecker binds account + amount + timestamp, rejects replay / expiry / future drift, and recovers the stored issuer.
- Flash-loan receive requires the stored flashLoaner and the hashed callback payload.
- Webauthn
updateOwnersisisInitialized(msg.sender)and only mutates that account's owner set.
Do not file issuer-signed card collects, delay-gated self proposals, or keeper execute of the account's own queue as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that Sourcify
opens for
Exactly
ExaPlugin /
ProposalManager /
IssuerChecker /
Webauthn is
exhausted at
the
opened-file
level.
Remaining
listed:
Sourcify-404
proxy impls
(0x6E1B…3Cff,
0xCEed…52b
and unnamed
impls) and
the
immunefi.com
placeholder.
2026-09-03: Berachain leftover BGT + LST + BeaconDeposit leftover (70e392f + airdrop dda56c5)
Immunefi program
berachain
($100,000, kyc: true).
Follow-on leftover
after RewardVault /
Honey / WBERA
(9c982dd).
Official clones
/tmp/bera-contracts
70e392f and
/tmp/bera-airdrop
dda56c5.
Opened
src/pol/BGT.sol
(redeem),
BeaconDeposit.sol,
lst/LSTStakerVault.sol,
LSTStakerVaultWithdrawalRequest.sol,
InfraredBeraAdapter.sol,
rewards/Distributor.sol,
BGTIncentiveDistributor.sol,
BeraChef.sol,
BGTStaker.sol,
FeeCollector.sol,
IncentivesCollector.sol,
plus airdrop
Distributor1.sol,
StreamingNFT.sol,
ClaimBatchProcessor.sol,
PayMaster.sol,
Transferable.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger redeem
of another user's
BGT; BeaconDeposit
operator overwrite
or ETH withdraw;
LST queue/complete
that pays the
caller instead of
the stored
receiver; merkle
incentive claim
that pays
msg.sender;
Distributor mint
to an arbitrary
vault; BeraChef
reward-weight
queue by a
non-operator;
FeeCollector /
IncentivesCollector
drain without
paying the
auction; airdrop
claim that
redirects the
recipient's
tokens.
Result: no user-exploitable finding. Not submitted.
BGT.redeemburnsmsg.sender's unboosted balance and sends native BERA 1:1 to the chosenreceiver._checkUnboostedBalancesubtracts active plus queued boost.invariantCheckrequires contract ETH>= totalSupply(). Transfers / approvals areonlyApprovedSender.mintisonlyBlockRewardController.burnExceedingReservessends only ETH abovetotalSupply + HISTORY_BUFFER * maxBGTPerBlocktoaddress(0).BeaconDeposit.depositburnsmsg.valuetoaddress(0)after Gwei / minimum checks. Operator is set only on the first deposit for a pubkey; later deposits must passoperator == 0so a front-run cannot overwrite. Operator change is current-operator queue, 1-day delay, then the queued new operator accepts.LSTStakerVaultERC4626_withdrawalways reverts (MethodNotAllowed).queueRedeem/queueWithdrawspend allowance whencaller != owner, burn the owner's shares, reserve assets, and mint a non-transferable NFT tocaller.completeWithdrawalburns via vault-onlyLSTStakerVaultWithdrawalRequest(7-day cooldown) and paysrequest.receiver. Cancel is NFT-owner only and remints shares to that owner from the reserved assets.receiveRewardspulls LST from the caller into the vault (donation).InfraredBeraAdapter.stakepulls the caller's WBERA, unwraps, and mints iBera tomsg.sender. IfpreviewMintis 0 the unwrap still happens and ETH sits in the adapter (self-grief / broken Infrared, not stranger theft).Distributor.distributeForwith proofs is closed afterPECTRA11(1756915200). Live path isonlySystemCall(0xffff…FfE). Rewards go to BeraChef weights / default allocation vianotifyRewardAmountplus allowance. No user withdraw.BeraChef.queueNewRewardAllocationis the stored reward allocator, else the BeaconDeposit operator.setValRewardAllocatorand commission queue areonlyOperator. Activation of a ready allocation isonlyDistributor. Vault whitelist and default weights are owner-only.BGTIncentiveDistributor.claimpays the merkelized_account, notmsg.sender. Lifetime amount is in the leaf. Manager sets roots after a claim-delay.receiveIncentiveonly increases the validator token bucket.BGTStaker.stake/withdrawareonlyBGT(no token transfer; BGT stays in the holder).getRewardpaysmsg.sender.notifyRewardAmountisonlyFeeCollector.FeeCollector.claimFeesandIncentivesCollector.claimare permissionless auctions: the caller payspayoutAmountof the payout token (WBERA / configured) then takes the listed fee tokens. Incentive WBERA is split to WBERA / LST vaults viareceiveRewards. Admin recover is role-gated.Airdrop
Distributor1.claimrequires merkle leaf(_onBehalfOf, amount)plus an owner signer ECDSA over account / amount / contract / chainid. Tokens go to_onBehalfOf. Iftx.origin != _onBehalfOfa configured fee is paid totx.origin(intended paymaster).withdrawis owner-only.StreamingNFT.createStreampays the current NFT owner; non-ownertx.originreverts unless registered paymaster.claimRewardsrequires `tx.originownerOf
.ClaimBatchProcessorforwards the same_onBehalfOf/tx.origin` checks.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for Berachain BGT redeem / BeaconDeposit / LST vault / distributor / BeraChef / FeeCollector / IncentivesCollector / airdrop-contracts is exhausted at the opened-file level. Remaining listed: beacon-kit / bera-reth DLT (skip unless a small money path is isolated).
2026-09-03: Integral leftover TwapDelay + Pair + Relayer leftover (Sourcify)
Immunefi program integral ($25,000, kyc: true). Unique unused standing
program (updated 2024-11-18). 24 listed addresses (20 Ethereum + 4 Arbitrum).
Official integralhq/integral-core clone is private / 404 from this VM.
Ethereum Sourcify match extracts in /tmp/integral-src and
/tmp/integral-impl. No mainnet writes. No exploit PoCs.
Opened Ethereum listed sources: TwapDelay
0x35cb375799b28c8d6b7c5c8d494ed180ae2e60cb, TwapPair
0x2fe16Dd18bba26e457B7dD2080d5674312b026a2 (plus listed WETH-USDT /
WETH-WBTC / USDC-USDT pairs of the same type), TwapFactory
0xC480b33eE5229DE3FbDFAD1D2DCD3F3BAD0C56c6, TwapFactoryGovernor impl
0x2B93b9abFA3c3377330Fd45F9525D01DD9b8C020 behind listed Fee governor
proxy 0xF4418d9fe76A788F2868a558dD216549aD2d869B, TwapRelayer impl
0xAf780dE01DC9C6FF4c29c6556b4666e852951584 behind listed Relayer proxy
0xd17b3c9784510E33cD5B87b490E79253BcD81e2E, IntegralStaking
0x36bD665392236b20bd42e161f02Bf0ae1d9441Ff /
0xFFc0EAC1a1aE79C697607229Aca43Ef422625A40, IntegralTimeRelease
0xc8805cebd927941a3b26e2edced20d666fb118ba, IntegralMerkleTimeRelease
(eight listed addrs, same type), IntegralToken
0xD502F487e1841Fdc805130e13eae80c61186Bc98.
Checked for: stranger execute that refunds to the caller; Delay deposit /
sell / buy that spends another user's tokens; Pair mint that credits the
caller from another user's transfer; Relayer sell that pulls a victim;
Staking withdraw of another user's stake; Merkle / TimeRelease claim of
another wallet's allocation; FactoryGovernor admin from a stranger.
Result: no user-exploitable finding. Not submitted.
- TwapDelay
deposit/sell/buyenqueue viaOrders;TokenShares.amountToSharesdoessafeTransferFrom(msg.sender, address(this), amount). Withdraw LP doespair.safeTransferFrom(msg.sender, address(this), liquidity).relayerSellrequiresmsg.sender == RELAYER_ADDRESS. executeis bot-gated untilvalidAfterTimestamp + BOT_EXECUTION_TIME(20 minutes), then permissionless. Failed execute andcancelOrder/retryRefundpayorder.to(owner only after 365 days). Executor gas refund ismsg.sender's prepaid leftover, not user tokens.- TwapPair
mint/burn/swap/syncrequirecanTrade(msg.sender)(user == trader || user == factory). Liquidity is minted toto; burn paystofrom LP sitting on the pair. Factory setters are factory-only; TwapFactorycreatePairand fee / oracle / trader setters are owner-only. - TwapRelayer
sell/buypullmsg.senderviatransferIninto Delay; output issellParams.to. Owner-onlywithdraw/approve/ wrap; rebalance isrebalancer. - IntegralStaking
depositpullsmsg.sender;withdraw/claim/withdrawAll/claimAllpay_tofrom that sender's stakes only. - MerkleTimeRelease
initializeAllocationsbindskeccak256(wallet, amount1, amount2)to the merkle root.claim(to)andinitializeAndClaimcreditmsg.sender's released allocation. TimeReleaseclaim(to)is the same self-only path without a merkle init. - TwapFactoryGovernor mutators and
withdrawToken/withdrawLiquidity/collectFeesare owner-only.distributeFees(..., pair)is Delay-only. - IntegralToken
mintis minter-whitelist;burnburnsmsg.sender.
Do not file permissionless execute after the bot window, owner-after-1y
abandoned-order refund, merkle init of a victim's own allocation, or
Relayer output to a caller-chosen to as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that Ethereum
Sourcify opens is exhausted at the opened-file level. Remaining listed:
Arbitrum Fee governor / Delay / Pair / Relayer
(0x0800…8d91, 0xa400…d2a, 0x4bca…913b, 0x3c69…5f42). Sourcify
42161 opens those as the same types already reviewed (TwapFactoryGovernor
impl, TwapDelay, TwapPair, TwapRelayer impl). Official GitHub still
private / 404.
2026-09-03: Enzyme Onyx leftover ValuationHandler + trackers leftover (7b48d24)
Immunefi program
enzyme-onyx
($200,000, kyc: false).
Follow-on leftover
after ACE issuance
(Shares /
deposit-redeem
queues /
FeeHandler)
and
CreWorkflowConsumer.
Official clone
/tmp/enzyme-onyx
7b48d24.
Opened
src/components/value/ValuationHandler.sol,
position-trackers/LinearCreditDebtTracker.sol,
AccountERC20Tracker.sol,
fees/management-fee-trackers/ContinuousFlatRateManagementFeeTracker.sol,
fees/performance-fee-trackers/ContinuousFlatRatePerformanceFeeTracker.sol,
roles/OpenAccessLimitedCallForwarder.sol,
LimitedAccessLimitedCallForwarder.sol,
lists/SharesOwnedAddressList.sol,
infra/lists/address-list/OwnableAddressList.sol,
AddressListBase.sol,
shares-transfer-validators/AddressListsSharesTransferValidator.sol,
infra/oracles/OneToOneAggregator.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
updateShareValue
or
setAssetRate;
credit/debt
item add that
inflates NAV
without admin;
ERC20 tracker
that reads a
victim wallet
into live
valuation;
fee settle
that a
non-handler
can call;
forwarder
executeCalls
that runs an
unlisted
selector;
address-list
add by a
non-auth
account.
Result: no user-exploitable finding. Not submitted.
ValuationHandler.setAssetRate/updateShareValue/addPositionTrackerareonlyAdminOrOwner. Tracked value is the sum ofgetPositionValue()on the admin-set tracker set. Untracked value is an adminint256. Net share value is(tracked + untracked - feesOwed) / supply. Rates expire and must be non-zero before convert. Admin- reported NAV is the documented model (already noted on the ACE leftover).LinearCreditDebtTrackeradd / remove /updateSettledValueareonlyAdminOrOwner.getPositionValueis view and sums settled plus pro-ratedtotalValueafterstart. Duration0is a discrete step after start. No permissionless write.AccountERC20Tracker.initis a one-shot set of the tracked account (same clone front-run DoS asCreWorkflowConsumer). It cannot attach itself to a live valuation:addPositionTrackeris admin.addAsset/removeAssetare admin. Value isbalanceOf(account)converted by the Shares valuation handler rates.Management and performance fee trackers settle
onlyFeeHandler. Rate / HWM / hurdle /resetLastSettledare admin. Management fee isnetValue * rate * elapsed / year. Performance fee charges only above hurdle- adjusted HWM and then writes HWM to post-fee share value. Rate< 100%.OpenAccessLimitedCallForwarder.executeCallsis permissionless but each call must match an admin- listed(target, selector).LimitedAccessadditionally requiresisUser(addUseradmin).msg.valueis not summed against per-call value (caller overpay stays on the forwarder; not stranger theft).Address list add/remove is
onlyAuth. Shares- owned list auth is admin/ owner. Ownable listinitis OZ initializer (owner set once). Transfer validator list config is admin;validateSharesTransferis view and checks sender / recipient allow or deny lists.OneToOneAggregatoralways returns1e18atblock.timestamp. No storage, no withdraw.
Do not file
admin NAV /
rate /
untracked
value,
admin
tracker
attachment,
clone
init
front-run
of an
unbound
instance,
or an
admin-
listed
forwarder
selector
as
stranger
theft.
Not submitted.
Listed leftover
that official
GitHub opens
for Enzyme
Onyx
ValuationHandler /
position
trackers /
continuous
fee
trackers /
call
forwarders /
address
lists is
exhausted at
the
opened-file
level.
Remaining
listed:
Global.sol,
ComponentBeaconProxy.sol,
StorageHelpersLib.sol,
and the
immunefi.com
placeholder.
2026-09-03: Immunefi leftover ETH Splitter leftover (Sourcify)
Immunefi program immunefi ($50,000, kyc: true). Unique unused standing
program (updated 2026-08-28). Two listed Ethereum contracts plus websites.
Sourcify extracts /tmp/integral-src/0x03fd3d61423e6d46dcc3917862fbc57653dc3eb0
(listed as Vault) and
/tmp/integral-src/0x323498d3fb02594ac3e0a11b2dea337893ecabbe (Splitter).
No mainnet writes. No exploit PoCs.
Opened src__Splitter.sol on both addrs and src__Withdrawable.sol on the
first.
Checked for: stranger payWhitehat that spends another payer's tokens;
native underpay that drains a victim; owner-bypass withdraw; fee-on-top
that steals the whitehat slice.
Result: no user-exploitable finding. Not submitted.
- Both
payWhitehatpaths pull ERC20 withsafeTransferFrom(msg.sender, …). A stranger cannot spend another wallet's tokens without that wallet's allowance to the splitter, and the spender is always the caller. - Native payouts send
feeAmountthennativeTokenAmtfrom the contract balance and refund onlymsg.valueexcess. There is nomsg.value >= native + feecheck. Donated leftover ETH could be forwarded to a caller-chosenwh. The first contract'swithdrawERC20ETHisonlyOwneroverWithdrawable. The second has no withdraw. Users do not deposit into these splitters; leftover ETH is accidental / owner-sweepable, not in-scope user funds. - Stored
fee(first) or caller-suppliedfeecapped bymaxFee(second) is paid on top ofpayout[i].amount/nativeTokenAmt. The whitehat receives the full amount.changeFeeRecipient/setFeeare owner-only. nonReentrantwraps the payment. The whitehatcallis gas-capped.
Do not file permissionless payWhitehat of the caller's own tokens, a
caller-chosen fee within maxFee, or draining donated ETH as stranger
theft of user funds.
Not submitted. Payment requires user KYC. Listed leftover that Sourcify opens for Immunefi smart contracts is exhausted at the opened-file level. Remaining listed: immunefi.com / bugs.immunefi.com / shieldmybags.immunefi.com websites and Primacy of Impact placeholders (out of this SC track).
2026-09-03: Lombard leftover BARD token + TokenDistributor leftover (f79d6f6)
Immunefi program
lombard-finance
($250,000, kyc: true).
Listed remaining
GitHub asset
Liquid-Bitcoin/BARD
contracts/BARD/BARD.sol
after SVM + EVM
strategy shard
leftovers.
Official clone
/tmp/lombard-bard
f79d6f6.
Opened
contracts/BARD/BARD.sol,
TokenDistributor.sol,
IBARD.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
mint of
BARD;
distributor
claim that
pays
msg.sender
instead of
the
merkelized
account;
claimWithProof
that
redirects
without the
approver
signature;
claimAndStake
that deposits
shares to the
caller;
owner
withdraw
before
CLAIM_END.
Result: no user-exploitable finding. Not submitted.
BARD.mintisonlyOwner, once per365 days, and capped at10%oftotalSupply. Constructor mints1e9 * 1e18to the treasury and starts the mint clock.renounceOwnershipreverts. Transfers go through standardERC20Votes_update.TokenDistributor.claimverifies merkle leafkeccak(account, amount, type=1)andsafeTransfers to_account, notmsg.sender. One claim per address. A stranger can force-claim to the merkelized account (blocks laterclaimAndStakefor that leaf). That is destination griefing, not theft.claimWithProofuses leafkeccak(bytes32 account, amount, type=2)plus an ECDSA overkeccak(account, amount, dstAddress)that must recover the owner-setapprover. Tokens go to_dstAddress.claimAndStakerequires `msg.sender_account
. Remainder is paid to that account;vault.depositmints 4626 shares to_account. Proof variant requiresmsg.sender_dstAddress` and deposits to that destination.
withdrawisonlyOwnerafterCLAIM_END. Vault / approver / pauser writes are owner (or pauser forpause).
Do not file owner mint within the annual cap, approver- signed redirects, permissionless claim-to-self of a valid leaf, or owner withdraw after the claim window as stranger theft.
Not submitted.
Payment requires
user KYC.
Listed leftover
that official
GitHub opens
for Lombard
BARD.sol +
same-repo
TokenDistributor
is exhausted
at the
opened-file
level.
Remaining
listed:
Lombard EVM
StakeAndBake /
LBTC /
Bridge /
Bascule /
Mailbox (if
not already
opened),
Sui move
packages,
and Starknet
cairo
packages.
2026-09-03: ZKsync OS leftover bootloader + system hooks leftover (9efc8bf)
Immunefi program zksync-os ($100,000, kyc: true). Unique unused standing
DLT program (updated 2026-09-02). Official clone /tmp/zksync-os at listed
commit 9efc8bf70ae77d1d4df67eff5c60c8a8cfc21268. No mainnet writes. No
exploit PoCs.
Opened basic_bootloader transaction flow (L2 EOA validation / fee
precharge / refund, L1 priority mint from treasury, Ethereum withdrawals
list) and system_hooks (mint_base_token, l1_messenger,
set_bytecode_on_address) plus runner.rs CALL-value transfer.
Checked for: a user L2 tx that mints another account's ETH; mint-hook call from a stranger; fee refund to the executor; CALL value that debits a victim; L1-messenger / set-bytecode privilege bypass.
Result: no user-exploitable finding. Not submitted.
- L2 mint hook
0x7100returns as an empty account unlesscaller == L2_BASE_TOKEN_ADDRESS(0x800a). Successful mint credits that caller, not an arbitraryto. Delegate / callcode / value / static fail. - L2 EOA path recovers secp256k1, rejects code-bearing senders
(EIP-3607), requires
required_balance, thenupdate_account_nominal_token_balance(..., from, fee, subtract). Unused gas refundstransaction.from(). Operator payment creditscoinbase, not the executor. - L1 priority / upgrade txs mint from treasury (
0x10011) totx.from(deposit minus max fee, inside a revert frame), then to coinbase (used fee) andreserved[1](refund). Those txs are L1-enqueued, not user L2 forgery. - CALL value uses
transfer_nominal_token_value(caller, target, value). Insufficient balance is a failing call (EVM) or top-level error, not a debit of a third party. - Consensus withdrawals credit listed
addressfrom the block withdrawals list, not from an L2 caller. - L1 messenger hook and set-bytecode hook pretend empty unless called
by
0x8008/ (0x8006or0x800f).
Do not file stranger calls to 0x7100 / 0x7001 / 0x7002 looking
like empty accounts, L1-queue mints, Cancun BLOBHASH/PREVRANDAO
behavior listed in docs/not-a-bug.md, or fee refund to the signer as
stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: evm_interpreter, zk_ee, zksync_os program, storage_models, crypto, oracles, proof_running_system, airbender CS / prover / verifier, and zkos-wrapper circuits.
2026-09-03: Lombard leftover StakeAndBake + NativeLBTC + AssetRouter leftover (7fe83e5)
Immunefi program
lombard-finance
($250,000, kyc: true).
Follow-on leftover
after BARD
(a23f3e9)
and EVM
strategy shard
(7fe83e5).
Official clone
/tmp/lombard-evm
7fe83e5.
Opened
contracts/stakeAndBake/StakeAndBake.sol,
depositor/erc4626/ERC4626Depositor.sol,
LBTC/NativeLBTC.sol,
StakedLBTC.sol,
AssetRouter.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
StakeAndBake
that stakes
another
user's mint
without
permit;
NativeLBTC
mintV1
that mints
to the
caller;
AssetRouter
deposit /
redeem
that burns
a victim;
redeemForBtc
that spends
another
holder;
minter-less
burn(from).
Result: no user-exploitable finding. Not submitted.
StakeAndBake.stakeAndBakeisCLAIMER_ROLE. It mints vialbtc.mint(payload, proof)(recipient from the consortium payload), thenpermit+transferFromthat owner fordata.amount, takes a fee to treasury (fee <= 100000units), anddepositor.deposit(owner, …).ERC4626DepositorisonlyStakeAndBakeandvault.depositmints shares toowner. Batch path is self-call with a gas cap.NativeLBTC.mint(to,amount)isMINTER_ROLE.mintV1is permissionless but requires a consortiumcheckProofoversha256(payload), one-shotusedPayloads, optional BasculevalidateWithdrawal, and mints to the payloadrecipient.mintV1WithFeeisCLAIMER_ROLEand needs the recipient's EIP-712 fee approval.burn(amount)burnsmsg.sender.burn(from,amount)isMINTER_ROLE.redeemForBtcforwards_msgSender()to the router.StakedLBTCproof mint / redeem / deposit go throughAssetRouterwith_msgSender()as the account. Role mint / burn match NativeLBTC.AssetRouter.deposit/_redeemrequire `msg.senderfromAddress
ormsg.sendertoken
. They burnfromAddressvia the token's minter burn (router holdsMINTER_ROLE). Proof mint ismailbox.deliverAndHandle` and pays the decoded recipient. Fee mint burns from that recipient after their EIP-712 approval.
Do not file consortium- signed mints to the payload recipient, claimer paths that need a user permit or fee signature, minter-role burn, or router self-or-token caller checks as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for Lombard StakeAndBake / NativeLBTC / StakedLBTC / AssetRouter is exhausted at the opened-file level. Remaining listed: BridgeV2 / token pools, Bascule V1/V2
- GMP, Mailbox, Sui move packages, and Starknet cairo packages.
2026-09-03: Lombard leftover BridgeV2 + Mailbox + Bascule leftover (7fe83e5)
Immunefi program
lombard-finance
($250,000, kyc: true).
Follow-on leftover
after StakeAndBake /
NativeLBTC /
AssetRouter
(0a1bec3).
Official clone
/tmp/lombard-evm
7fe83e5.
Opened
contracts/bridge/BridgeV2.sol,
providers/LombardTokenPoolV2.sol,
providers/BridgeTokenPool.sol,
gmp/Mailbox.sol,
bascule/BasculeV2.sol.
No mainnet writes.
No exploit PoCs.
Checked for: a
stranger
deposit
that burns
another
user's
tokens;
handlePayload
that mints
to the
caller;
Mailbox
deliverAndHandle
without a
consortium
proof;
Bascule
validateWithdrawal
replay;
CCIP
releaseOrMint
that pays
offchainTokenData
instead of
the GMP
recipient.
Result: no user-exploitable finding. Not submitted.
BridgeV2.depositrequiressenderConfig[msg.sender].whitelisted._burnTokentransferFroms and burnsmsg.sender(the whitelist sender / pool), not the recordedsenderfield. The GMP body carries that recorded sender plus the chosenrecipient. Destination token and path must be registered.handlePayloadis mailbox- only, one-shotpayloadSpent, requirespayload.msgSenderto be the registered source bridge, then_withdrawmints to the decoded body recipient under a rate limit.Mailbox.sendencodesmsg.senderas the GMP sender and requires an enabled outbound path plus fee / size limits.deliverAndHandlechecks inbound path, consortiumcheckProofon first delivery, optionaldestinationCaller, thenIHandler.handlePayload.withdrawFee/rescueERC20areTREASURER_ROLE.LombardTokenPoolV2.lockOrBurnis CCIP_validateLockOrBurnthenbridge.depositwithoriginalSenderand the decoded 32-byte receiver.releaseOrMintis CCIP_validateReleaseOrMint, thenmailbox.deliverAndHandlewith consortium proof; the returned hash must matchsourcePoolData. Tokens mint inside Bridge to the GMP recipient.BridgeTokenPoolis the same path with a token adapter address.BasculeV2.reportDepositsisDEPOSIT_REPORTER_ROLE.validateWithdrawalisWITHDRAWAL_VALIDATOR_ROLE(NativeLBTC holds it). AREPORTEDid becomesWITHDRAWNonce. Below- threshold unreported ids are allowed and then marked withdrawn (documented drawbridge policy, not stranger mint).
Do not file whitelist sender burns of the caller's own tokens, consortium- gated mint to the payload recipient, treasurer fee withdraw, or below- threshold Bascule skips as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for Lombard BridgeV2 / CCIP token pools / Mailbox / BasculeV2 is exhausted at the opened-file level. Remaining listed: Sui move packages and Starknet cairo packages.
2026-09-03: Sei leftover evm + bank + tokenfactory leftover (2e256b5)
Immunefi program sei ($500,000, kyc: true). Unique unused standing DLT
program (updated 2026-08-31). Official sparse clone /tmp/sei-chain at
2e256b5 (main). Opened x/evm (msg server / ante sender recover /
state transfer), precompiles/bank, precompiles/staking delegate,
x/tokenfactory, and x/mint. No mainnet writes. No exploit PoCs.
Checked for: stranger MsgSend / MsgEVMTransaction that spends another
account; bank precompile send / sendNative that pulls a victim;
tokenfactory mint/burn without admin; staking delegate of another
delegator without authz.
Result: no user-exploitable finding. Not submitted.
MsgEVMTransactionusesDerived.SenderEVMAddrrecovered in ante (RecoverSenderFromEthTx, unprotected txs rejected). Fees are charged from that sender beforeStateTransition.MsgSendsigners areFromAddress; bankSendthen pays that signer to the mapped Sei recipient.- Bank
sendNativerejects staticcall / delegatecall, requiresvalue, andSendCoinsAndWeifrom the associated Sei address ofcaller. - Bank
sendis pointer-only (GetERC20NativePointermust equalcaller). It then callsbankMsgServer.Sendfor the named from/to. A stranger EOA cannot hit this path. - Tokenfactory
Mint/Burnrequiremsg.Sender == adminand mint/burn that sender.x/mintMintCoinsis BeginBlocker / module. - Staking
delegatemapscallerto the associated Sei delegator and pullsvaluefrom that address.delegateWithAuthorizationuses the authz executor for a named delegator.
Do not file pointer-gated native send, admin tokenfactory mint, or
authz staking as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: sei-js,
go-ethereum, other sei-chain modules / precompiles (oracle,
epoch, IBC / gov / wasm), sei-cosmos / sei-wasmd / tendermint,
and Primacy of Impact.
2026-09-03: Lombard leftover Sui LBTC + bridge_vault leftover (d78ebef)
Immunefi program lombard-finance ($250,000, kyc: true). Follow-on leftover after BridgeV2 / Mailbox / BasculeV2 (936b35b). Official clone /tmp/lombard-sui d78ebef. Opened move/lbtc/sources/{lbtc,treasury,consortium,bascule}.move, move/consortium/sources/{consortium,payload_decoder}.move, move/bascule/sources/bascule.move, move/bridge_vault/sources/bridge_vault.move, move/timelock_policy/sources/timelock_upgrade.move. No mainnet writes. No exploit PoCs.
Checked for: a stranger mint_v2 / mint_with_fee_v2 that mints to the caller; reused consortium payloads; Bascule validate_withdrawal that skips reported deposits; claim_native that mints without locking wrapped; return_native that drains another user's vault balance; burn / redeem that spend a victim's coin; deprecated in-package consortium/bascule still callable.
Result: no user-exploitable finding. Not submitted.
lbtc::lbtcinit creates a regulated coin, freezes metadata, and sharesControlledTreasuryowned by the publisher (documented as a multisig).mint_and_transferrequires sender to be a configured multisig and holdMinterCap. Epoch mint limit is checked and decremented. Coins transfer to the suppliedto.mint_with_witnessrequires the witness type to already hold aMinterCapinroles. Amount is epoch-capped. Coins transfer toto. Intended forBridgeWitness/TypedLBTCWitnessgranted by admin.mint_v2hashes the payload (sha2_256), rejects used hashes, thenconsortium::validate_payload. Decode must match treasurymint_action+chain_id, nonzero amount, nonzero recipient. Optional Basculevalidate_withdrawal(TypedLBTCWitness<T>, to, amount, tx_id, index)when enabled. Mint transfers to the decodedto, then the hash is recorded inused_payloads.mint/mint_with_fee(in-package consortium/bascule) deprecated abort.mint_with_fee_v2isClaimerCap. Same unused-payload + consortium +assert_decoded_payloadasmint_v2. User ECDSA overfee_payload;to.to_bytes() == blake2b256(user_pk). Fee payload must match treasury chain id, package id, fee action,fee < amount, and expiry. Fee (capped by treasury mint fee) goes to the treasury address; remainder toto.burnburns the passedCoin<T>(caller must own it).redeemburns the caller's coin after a burn-commission split to the treasury address; emitsUnstakeRequestwithscript_pubkey. Requires withdrawal enabled, supported output type,amount > commission, and dust checks.- Standalone
consortium::validate_payloadchecks current-epoch weighted secp256k1 signatures (secp256k1_verifyhash type 1) over the raw payload. Comment mentions unused payloads; consumption is in treasury, not here.set_next_validator_setrequires signatures over the new-valset payload andepoch == current + 1. Initial valset is admin-only at epoch 0. Admins cannot remove the last admin. - In-package
lbtc::consortium/lbtc::basculeevery entry aborts deprecated. - Standalone
bascule::validate_withdrawalrequires a drop witness whose type string is on the owner-managed validator allowlist. AReportedid becomesWithdrawnonce. Already-withdrawn aborts. Unreported ids belowmValidateThresholdare allowed and then marked withdrawn (same documented drawbridge policy as EVM BasculeV2).report_depositisBasculeReporterCap. bridge_vault::claim_nativelocks the caller's wrappedCoin<WT>into the vault, thenmint_with_witness(BridgeWitness)toctx.sender().return_nativeburns the caller's nativeCoin<T>, splits the same amount of wrapped from the vault, andbridge::send_tokento the caller-suppliedtarget_address. Requires vault balance ≥ amount and vault unpaused.timelock_upgradewrapsUpgradeCap.authorize_upgraderequires 24h or 48h since last authorization (first call unrestricted). Owner ofTimelockCapis trusted;make_immutableis irreversible.
Do not file payload-recipient mints, claimer-gated fee claims, caller-owned burns, below-threshold Bascule skips, or admin/multisig mint limits as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for Lombard Sui move packages is exhausted at the opened-file level. Remaining listed: Starknet cairo packages.
2026-09-03: Lombard leftover Starknet cairo packages leftover (0358a40)
Immunefi program lombard-finance ($250,000, kyc: true). Follow-on leftover after Sui move packages (68ea553). Official clone /tmp/lombard-starknet 0358a40. Opened packages/token/src/lbtc/token.cairo, packages/asset_router/src/asset_router.cairo, packages/consortium/src/consortium.cairo, packages/bascule/src/bascule.cairo, packages/stake_and_bake/src/stake_and_bake.cairo. No mainnet writes. No exploit PoCs.
Checked for: a stranger permissioned_mint / mint that credits the caller; reused deposit payloads; redeem that burns a victim; stake_and_bake that stakes another user's mint without permit; Bascule validate_withdrawal that skips reported deposits; consortium check_proof that accepts duplicate signer weight.
Result: no user-exploitable finding. Not submitted.
lbtc::permissioned_mint/permissioned_burnareonly_token_admin. ERC20 hooks pause transfers. No public mint.AssetRouter.mintrequiresto_chain == tx.chain_id + LOMBARD_STARKNET_IDENTIFIER, nonzero recipient and amount._validate_and_mintSHA-256s the selector-prefixed deposit payload, rejects used hashes, records the hash, thenconsortium.check_proof. Optional Basculevalidate_withdrawalwhen the bascule address is set.permissioned_mintcredits the suppliedrecipient(bound into the signed payload).btc_locked_amountincreases byamount.redeemis public but burnsget_caller_address()viapermissioned_burnfor the fullamount, mints the burn commission to treasury, and decrementsbtc_locked_amountbyamount_after_fee. Requires withdrawals enabled,amount > fee, dust check, and locked BTC ≥ after-fee.consortium.check_proofrecovers secp256k1 signers to Eth addresses, looks up current-epoch weights, and deduplicates recovered addresses (insert_if_unique) before summing. Zero signatures are skipped. Threshold must be met.set_initial_validator_setis app-governor, once, epoch ≠ 0.set_next_validator_setrequiresepoch == current + 1plus a proof over the new-valset payload hash.bascule.validate_withdrawalisWITHDRAWAL_VALIDATOR. AReportedid becomesWithdrawnonce. Already-withdrawn aborts. Unreported ids belowvalidate_thresholdare allowed and then marked withdrawn (documented drawbridge policy).report_depositsisDEPOSIT_REPORTER; already-reported ids warn instead of revert.stake_and_bakeisonly_token_admin. It callsasset_router.mint(recipient from the consortium-signed args), thenpermit+transferFromthat recipient foramountif allowance is short, takesfee(cappedMAX_FEE100000) to treasury, andvault.deposit(remaining, receiver: recipient).min_mintis a slippage check.
Do not file payload-recipient mints, caller-owned redeem burns, claimer/token-admin stake-and-bake, or below-threshold Bascule skips as stranger theft.
Not submitted. Payment requires user KYC. Listed leftover that official GitHub opens for Lombard Sui move packages and Starknet cairo packages is exhausted at the opened-file level. Remaining listed: none from this Lombard GitHub slice.
2026-09-03: Hedera leftover json-rpc-relay leftover (2b51a98)
Immunefi program hedera ($30,000, kyc: true). Unique unused standing DLT
program (updated 2026-08-31). Official clone /tmp/hiero-json-rpc-relay at
2b51a98 (main). Opened src/relay/lib/eth.ts (send / sign / accounts),
src/relay/lib/services/ethService/transactionService/TransactionService.ts,
src/relay/lib/precheck.ts, src/relay/lib/clients/sdkClient.ts
(submitEthereumTransaction / createFile), and
src/relay/lib/services/ethService/ethCommonService/CommonService.ts
paymaster gate. No mainnet writes. No exploit PoCs.
Checked for: stranger eth_sendRawTransaction that spends another account;
eth_sendTransaction / eth_sign / eth_signTransaction that signs as a
victim; paymaster / operator wrap that pulls user funds; eth_call that
submits a value transfer.
Result: no user-exploitable finding. Not submitted.
eth_sendTransaction,eth_sign, andeth_signTransactionreturnUNSUPPORTED_METHOD.eth_accountsis always[].sendRawTransactionparses withethers.Transaction.from.fromis the recovered signer. Stateless precheck then per-sender locks. Consensus submission isEthereumTransactionwrapping that signed payload. The operator is the HAPI payer, not the Ethereum sender.createFile(HFS sidecar for large callData) is operator-keyed. It does not move user HBAR / HTS.- Paymaster (
setMaxGasAllowanceHbar) is operator / configured paymaster HBAR. DefaultPAYMASTER_ENABLEDisfalse; dedicated maps are whitelist-only. That is operator budget, not user funds. receiverAccountrejectsreceiver_sig_required.eth_callis a query (callimmediately, no consensus transfer).
Do not file operator-paid EthereumTransaction wraps, default-off paymaster
gas allowance, HFS callData files, or unsupported eth_sendTransaction as
stranger theft.
Not submitted. Payment requires user KYC. Remaining listed:
hiero-consensus-node, hiero-mirror-node, hiero-cryptography,
hiero-sdk-go / hiero-sdk-js / hiero-sdk-java, and the hashed
transaction-tool website leftover.
2026-09-03: ZKsync OS leftover evm_interpreter leftover (9efc8bf)
Immunefi program zksync-os ($100,000, kyc: true). Follow-on leftover after
bootloader + system hooks leftover (30d118a). Official clone /tmp/zksync-os
at listed 9efc8bf70ae77d1d4df67eff5c60c8a8cfc21268. Opened
evm_interpreter/src/instructions/host.rs (CALL / CREATE / SELFDESTRUCT),
evm_interpreter/src/interpreter.rs (EVMCallRequest → ExternalCallRequest),
and evm_interpreter/src/ee_trait_impl.rs frame start. No mainnet writes.
No exploit PoCs.
Checked for: CALL / CALLCODE that debit a third-party address; CREATE that pulls another account's ETH; SELFDESTRUCT that drains a victim; static CALL with value.
Result: no user-exploitable finding. Not submitted.
- CALL / CALLCODE take
valuefrom the current frame's stack. STATICCALL forcesvalue = 0. DELEGATECALL reusesself.call_value. Static CALL with nonzero value errorsCallNotAllowedInsideStatic. - The interpreter yields
ExternalCallRequestwithcaller: self.address(the executing contract) andnominal_token_value: call_value. It does not pick an arbitrary from-address. - CREATE / CREATE2 pass stack
valueto the constructor request with the samecaller: self.address. Static CREATE is rejected. - SELFDESTRUCT calls
mark_for_deconstruction(..., &self.address, &beneficiary). Only the executing contract is marked. Static frames reject state change.
Do not file interpreter CALL value from the executing contract, constructor
value from the deployer frame, or SELFDESTRUCT of self.address as
stranger theft. OS transfer of that caller→callee value was leftover-logged
with the bootloader / system hooks leftover.
Not submitted. Payment requires user KYC. Remaining listed: zk_ee,
zksync_os program, storage_models, crypto, oracles,
proof_running_system, airbender CS / prover / verifier, and
zkos-wrapper circuits.
2026-09-03: Sei leftover sei-js leftover (66deb15)
Immunefi program sei ($500,000, kyc: true). Follow-on leftover after sei-chain evm/bank/tokenfactory (156664f). Official clone /tmp/sei-js 66deb15. Opened packages/precompiles/src/precompiles/{bank,staking}.ts, packages/precompiles/src/ethers/bankPrecompile.ts, packages/sei-global-wallet/src/lib/wallet.ts, packages/mcp-server/src/core/wallet/providers/private-key.ts, packages/mcp-server/src/core/services/transfer.ts. No mainnet writes. No exploit PoCs.
Checked for: a Bank send helper that silently substitutes a victim fromAddress; a staking wrapper that delegates another account; MCP transfer that spends a key it does not hold; wallet glue that signs without the connected signer.
Result: no user-exploitable finding. Not submitted.
- Bank / staking packages export frozen v6.6.1 precompile ABIs and the documented addresses (
0x…1001,0x…1005).getBankPrecompileEthersV6Contractis a factory over the caller-suppliedContractRunner. It does not rewritefrom/to. On-chainsendremains pointer-gated (already logged onsei-chain). sei-global-walletis a Dynamic-hosted client (createGlobalWalletClient). No local spend path.- MCP
PrivateKeyWalletProvider.signTransactionthrowsNOT_IMPLEMENTED.getWalletClientbuilds a viem client fromPRIVATE_KEY(operator env).transfer.tssendTransaction/ ERC20 / ERC721 / ERC1155 writes usewalletClient.account.addressasfrom. A stranger cannot redirect that key without the env secret.
Do not file ABI constants, operator-held MCP keys, or pointer-gated Bank send as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: go-ethereum, other sei-chain modules / precompiles (oracle, epoch, IBC / gov / wasm), sei-cosmos / sei-wasmd / tendermint, and Primacy of Impact.
2026-09-03: Sei leftover remaining precompiles leftover (2e256b5)
Immunefi program sei ($500,000, kyc: true). Follow-on leftover after sei-chain evm/bank/tokenfactory (156664f) and sei-js (e69fd78). Official sparse clone /tmp/sei-chain 2e256b5. Opened precompiles/distribution/distribution.go, precompiles/pointer/pointer.go, precompiles/ibc/ibc.go, precompiles/oracle/oracle.go, precompiles/gov/gov.go, x/oracle/keeper/keeper.go, x/epoch/keeper/*.go. No mainnet writes. No exploit PoCs.
Checked for: a stranger distribution withdraw that pays the caller; setWithdrawAddress that retargets another delegator; pointer addNative that mints a victim denom; IBC transfer still live; gov deposit that spends another associated account.
Result: no user-exploitable finding. Not submitted.
- Distribution rejects
delegatecalland staticcall on writes.withdrawDelegationRewards/withdrawMultiple/setWithdrawAddress/withdrawValidatorCommissionmapcallerto the associated Sei address (GetSeiAddress). Rewards go to that delegator's CosmWasm withdraw address.*WithAuthorization/grantWithdrawAuthorizationrequire a live authz grant from the named granter. - Views that would otherwise increment validator periods run on
CacheContextand discard writes. - Pointer
addNative/addCW*are nonpayable, reject delegatecall, and onlyUpsertERC*Pointermetadata wrappers. Native pointers require stored denom metadata (else gov). No token mint/burn. - IBC precompile (
0x…1009) is a tombstone: every method returnsibc precompile is retired; IBC transfers are disabled. - Oracle precompile (
0x…1008)getExchangeRates/getOracleTwapsrevertoracle precompile is retired.x/oraclekeeper is validator-feeder vote storage;ValidateFeedergates vote submission.x/epochis BeginBlocker clock only. - Gov
deposit/submitProposal/voterequire an associated Sei address forcaller.depositrequires nonzerovalueandHandlePaymentUseifrom that depositor. Authz submit/vote paths useExecuteAuthorization.
Do not file caller-associated reward withdraws, authz-gated withdraws, retired IBC/oracle precompiles, or pointer metadata upserts as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: go-ethereum, sei-cosmos / sei-wasmd / tendermint, other sei-chain modules (wasm / IBC host), and Primacy of Impact.
2026-09-03: Sei leftover go-ethereum leftover (bb451e2)
Immunefi program sei ($500,000, kyc: true). Follow-on leftover after remaining sei-chain precompiles (05c2abd). Official clone /tmp/sei-geth bb451e2. Opened core/state_transition.go, core/types/transaction_signing.go. No mainnet writes. No exploit PoCs.
Checked for: a TransactionToMessage that accepts a caller-supplied From; BuyGas / value transfer that debit another account; feeCharged skipping both gas and value; EIP-7702 auth that sets code for a stranger without a matching signature.
Result: no user-exploitable finding. Not submitted.
TransactionToMessagesetsmsg.Fromonly viatypes.Sender(signer, tx)(ecrecover + signer cache). It does not take an unauthenticated from.BuyGasrequiresmsg.Frombalance ≥ gas (or fee-cap) plusValue(plus blob fee post-Cancun) andSubBalances that sender.ApplyMessageconstructsNewStateTransition(..., feeCharged=false, shouldIncrementNonce=true).feeChargedskipsStatelessChecks+BuyGasonly for the sei-chain integration that already charged CosmWasm-side;CanTransfer(msg.From, value)still runs beforeCreate/Call.- Value moves with
evm.Create(msg.From, …, value)/evm.Call(msg.From, to, …, value). Nonce increments the sameFromwhenshouldIncrementNonce. - Coinbase is funded with
gasUsed * (baseFee + tip)— comment: Sei does not burn base fee. Not stranger mint. - EIP-7702
validateAuthorizationrecoversauth.Authority(), requires chain id match or zero, nonce match, and empty-or-delegation code beforeSetCode.
Do not file recovered-sender gas debit, sei-chain pre-charged feeCharged, or coinbase base-fee credit as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: sei-cosmos / sei-wasmd / tendermint, other sei-chain modules (wasm / IBC host), and Primacy of Impact.
2026-09-03: Filecoin leftover evm leftover (d894a1a)
Immunefi program filecoin ($50,000, kyc: true). Follow-on leftover after
market + paych (29eac26) and miner + account (9f807b3). Official clone
/tmp/filecoin-actors at d894a1a. Opened actors/evm/src/lib.rs
(invoke_contract / constructor / delegate),
actors/evm/src/interpreter/instructions/call.rs,
actors/evm/src/interpreter/instructions/lifecycle.rs SELFDESTRUCT,
actors/evm/src/interpreter/system.rs transfer, and
actors/evm/src/interpreter/precompiles/fvm.rs call_actor. No mainnet
writes. No exploit PoCs. Do not rematch market / paych / miner leftovers.
Checked for: CALL / transfer that spends another actor; SELFDESTRUCT
that drains a victim; invoke_contract_delegate from a stranger;
call_actor that spoofs a different sender.
Result: no user-exploitable finding. Not submitted.
- Constructor is Init-only. Resurrect is EAM-only. Delegate invoke is
receiver-only (the contract itself).invoke_contractis public and runs this actor's bytecode withvalue_receivedfrom the incoming message. - CALL / STATICCALL
system.send_rawto the destination asInvokeContractwithvaluefrom this actor. Read-only + nonzero value errors.System::transferisMETHOD_SENDfromrt(this EVM actor). - SELFDESTRUCT sends
current_balance()to the beneficiary, then marks this actor deleted. Read-only frames abort. call_actor/call_actor_idrequireDelegateCallinto this contract. The send is still from the executing EVM actor.
Do not file this-actor CALL value, constructor Init/EAM gates, or SELFDESTRUCT of the executing contract as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus,
proofs / boost / graphsync / FVM / go-f3, other builtin-actors
(reward, datacap, verifreg, power), and filecoin.io.
2026-09-03: Sei leftover wasmd + sei-wasmd leftover (2e256b5 / 8dd2534)
Immunefi program sei ($500,000, kyc: true). Follow-on leftover after go-ethereum (ed6f3e9). Official clones /tmp/sei-chain 2e256b5 (precompiles/wasmd/wasmd.go) and /tmp/sei-wasmd 8dd2534 (x/wasm/keeper/{keeper,msg_server}.go, x/wasm/types/tx.go). No mainnet writes. No exploit PoCs.
Checked for: a wasmd precompile execute / instantiate that spends another associated account; execute_batch still live; CosmWasm Execute that TransferCoins from a victim; MsgExecuteContract with a forged signer.
Result: no user-exploitable finding. Not submitted.
- Precompile
0x…1002instantiate/executereject staticcall.instantiaterejectsdelegatecall. Sender isGetSeiAddress(caller)(association required). Attacheduseimust equalmsg.value;HandlePaymentUseipulls that associated address. Keeper thenInstantiate/Executewith that creator/sender.execute_batchis disabled (ErrExecuteBatchDisabled). CW→EVM→CW is rejected (!ctx.IsEVM()except query). - Delegatecall
executeis allowed only whencallingContractis the ERC20/721/1155 pointer for the named CW contract. MsgExecuteContract/MsgInstantiateContractGetSigners()isSender. Keeperexecute/instantiateTransferCoins(ctx, caller|creator, contract, coins)— the same address the message signer mapped to.Migrate/ admin updates go throughAuthorizationPolicy(CanMigrate/ admin).- Query is nonpayable.
Do not file associated-caller funds attach, pointer-gated delegatecall execute, or signer-bound CosmWasm execute as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: sei-cosmos / tendermint, other sei-chain modules (IBC host), and Primacy of Impact.
2026-09-03: Filecoin leftover reward + power leftover (d894a1a)
Immunefi program filecoin ($50,000, kyc: true). Follow-on leftover after
market + paych, miner + account, and evm leftovers. Official clone
/tmp/filecoin-actors at d894a1a. Opened actors/reward/src/lib.rs
(award_block_reward / update_network_kpi) and
actors/power/src/lib.rs (create_miner / update_claimed_power /
update_pledge_total). No mainnet writes. No exploit PoCs. Do not rematch
market / paych / miner / evm leftovers.
Checked for: stranger award_block_reward that mints FIL to the caller;
create_miner that spends another account's value; update_pledge_total
that steals collateral accounting.
Result: no user-exploitable finding. Not submitted.
- Reward constructor is System-only.
award_block_rewardis System-only. It paysApplyRewards+ value to the resolved miner id, burns the 3x penalty via miner params, and burns leftover reward if the miner apply fails.this_epoch_rewardis a view.update_network_kpiis Power-only. - Power
create_mineris public but forwardsvalue_received(the caller's attached FIL) to InitExecfor a new miner. It does not pull a third party.update_claimed_power,enroll_cron_event, andupdate_pledge_totalrequire caller type Miner. Epoch tick is Cron. KPI update is a zero-value send to Reward.
Do not file System-gated block rewards or caller-funded miner create as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus,
proofs / boost / graphsync / FVM / go-f3, other builtin-actors
(datacap, verifreg), and filecoin.io.
2026-09-03: Sei leftover sei-cosmos bank leftover (62bafe8)
Immunefi program sei ($500,000, kyc: true). Follow-on leftover after wasmd (16cdda6). Official clone /tmp/sei-cosmos 62bafe8. Opened x/bank/keeper/{msg_server,send}.go, x/bank/types/msgs.go. No mainnet writes. No exploit PoCs.
Checked for: a MsgSend that spends another FromAddress; MsgMultiSend that omits an input signer; SendCoinsAndWei that subtracts wei from a stranger.
Result: no user-exploitable finding. Not submitted.
MsgSend.GetSigners()isFromAddress.msgServer.Sendrequires send-enabled denoms and denom allowlists for both from and to, thenSendCoins(from, to, amount).SendCoins→SubUnlockedCoins(from)thenAddCoins(to). Spendable is balance minus locked coins.MsgMultiSend.GetSigners()is every input address.InputOutputCoinsis only reached after those signatures (Cosmos ante).SendCoinsAndWeisubtracts wei from the suppliedfromand adds toto, then optionallySendCoinsWithoutAccCreationfor usei. Callers are keepers/precompiles that already mappedfromto the associated sender.- Module send helpers (
SendCoinsFromModuleToAccount/ToModule/FromAccountToModule) are module-account paths.
Do not file signer-bound MsgSend, multi-input MultiSend, or keeper-internal SendCoinsAndWei as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: tendermint, IBC host (not in sei-cosmos; IBC precompile already retired), and Primacy of Impact.
2026-09-03: Filecoin leftover datacap + verifreg leftover (d894a1a)
Immunefi program filecoin ($50,000, kyc: true). Follow-on leftover after
market / paych / miner / evm / reward+power leftovers. Official clone
/tmp/filecoin-actors at d894a1a. Opened actors/datacap/src/lib.rs
(mint / destroy / transfer / burn) and actors/verifreg/src/lib.rs
(add_verifier / add_verified_client / claim_allocations). No mainnet
writes. No exploit PoCs. Do not rematch earlier Filecoin actor leftovers.
Checked for: stranger DataCap mint / destroy; transfer that moves
another client's cap; add_verified_client that mints without verifier
allowance; miner claim_allocations that steals another provider's
allocation.
Result: no user-exploitable finding. Not submitted.
- Datacap
mint/destroyare governor-only.transfersetsfrom = callerand allows only governor asfromorto.transfer_fromallows onlyto == governorplus token allowance.burnburns the caller.burn_fromuses operator allowance. - Verifreg
add_verifier/remove_verifierare root-key-only.add_verified_clientrequires the caller to already be a verifier with remaining cap, decrements that cap, then mints DataCap to the named client (market as operator).claim_allocationsis Miner-only and claims the calling provider's matching allocations.
Do not file governor-gated mint, verifier-capped client add, or miner-only claims as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus, proofs / boost / graphsync / FVM / go-f3, and filecoin.io.
2026-09-03: Hedera leftover TokenBurn + CryptoApproveAllowance leftover (0d3d9a2)
Immunefi program hedera ($30,000, kyc: true). Follow-on leftover after CryptoTransfer / TokenMint (0d3d9a2) and json-rpc-relay (2b51a98). Official clone /tmp/hiero-consensus 0d3d9a2. Opened TokenBurnHandler.java, CryptoApproveAllowanceHandler.java, ContractCallHandler.java. No mainnet writes. No exploit PoCs.
Checked for: a TokenBurn that burns a stranger's tokens; CryptoApproveAllowance that grants spend rights without the owner; ContractCall that spends another payer.
Result: no user-exploitable finding. Not submitted.
TokenBurnpreHandlerequires the token supply key.handleburns fungible from the treasury relation and NFTs only iftreasuryOwnsNft. Missing supply key fails in handle (TOKEN_HAS_NO_SUPPLY_KEY).CryptoApproveAllowancepreHandle: ifowneris set and ≠ payer,requireKeyOrThrow(owner). Empty owner means payer. NFTapprovedForAllrequires the owner; otherwise adelegatingSpender(or owner) must sign.handlewrites allowances ongetEffectiveOwnerAccount(payer if owner omitted). Delegating spender cannot change approveForAll.ContractCallpreHandleverifies no extra keys. The HAPI payer is the EVM sender for the in-scope call. Zero EVM address is rejected.
Do not file supply-key treasury burns, owner-signed allowances, or payer-scoped contract calls as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-consensus-node other handlers, hiero-mirror-node, hiero-cryptography, SDKs, and the hashed transaction-tool website leftover.
2026-09-03: Hedera leftover TokenWipe + TokenDelete leftover (0d3d9a2)
Immunefi program hedera ($30,000, kyc: true). Follow-on leftover after TokenBurn / CryptoApproveAllowance (7ce8625) and TokenUpdate (30e1ebf). Official clone /tmp/hiero-consensus 0d3d9a2. Opened TokenAccountWipeHandler.java, TokenDeleteHandler.java, CryptoDeleteHandler.java. No mainnet writes. No exploit PoCs.
Checked for: a TokenWipe that burns a stranger without the wipe key; TokenDelete that deletes without admin; CryptoDelete that redirects another account's balance without its key.
Result: no user-exploitable finding. Not submitted.
TokenAccountWipepreHandlerequires the token wipe key when present.handlevalidateSemanticsrejects empty wipe key (TOKEN_HAS_NO_WIPE_KEY), rejects wiping the treasury relation, and requires NFT serials to be owned by the named account (ACCOUNT_DOES_NOT_OWN_WIPED_NFT). Fungible/NFT balances cannot go negative.TokenDeletepreHandlerequires the admin key.handlerejects HIP-540 empty admin (TOKEN_IS_IMMUTABLE) and only marks the tokendeletedwhile decrementing the treasury's title count.CryptoDeletepreHandlerequireKeyOrThrow(deleteAccountId)andrequireKeyIfReceiverSigRequired(transferAccountID).handledeleteAndTransfers the deleted account's balance to the transfer account.
Do not file wipe-key treasury-excluded wipes, admin-gated token delete, or key-gated account delete-and-transfer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-consensus-node other handlers (freeze/pause/unfreeze), hiero-mirror-node, hiero-cryptography, SDKs, and the hashed transaction-tool website leftover.
2026-09-03: Hedera leftover TokenFreeze + TokenPause leftover (0d3d9a2)
Immunefi program hedera ($30,000, kyc: true). Follow-on leftover after TokenWipe / TokenDelete (32d0f0e). Official clone /tmp/hiero-consensus 0d3d9a2. Opened TokenFreezeAccountHandler.java, TokenUnfreezeAccountHandler.java, TokenPauseHandler.java, TokenUnpauseHandler.java. No mainnet writes. No exploit PoCs.
Checked for: a freeze/unfreeze that toggles another account without the freeze key; a pause/unpause that flips a token without the pause key.
Result: no user-exploitable finding. Not submitted.
- Freeze / unfreeze
preHandlerequires the token freeze key (TOKEN_HAS_NO_FREEZE_KEYif missing).handleonly setstokenRel.frozenon the named account's associated relation aftergetIfUsable. Empty HIP-540 freeze key is rejected in handle. - Pause / unpause
preHandlerequires the pause key when present.handlerejects empty pause key (TOKEN_HAS_NO_PAUSE_KEY) and deleted tokens, then setstoken.paused. No balances move.
Do not file freeze-key account freezes or pause-key token pauses as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-consensus-node other handlers, hiero-mirror-node, hiero-cryptography, SDKs, and the hashed transaction-tool website leftover.
2026-09-03: Hedera leftover remaining cryptography leftover (39f28f3)
Immunefi program hedera ($30,000, kyc: true). Listed remaining after File / Schedule / Contract leftovers. Official clone /tmp/hiero-cryptography at 39f28f3 (chore(release): 3.15.2). Opened TSS.java, WRAPSLibraryBridge.java, HintsLibraryBridge.java, ContextualLibsecp256k1.java, Libsecp256k1.java. Consensus-node handler leftover that official trees open is already leftover-logged. No mainnet writes. No exploit PoCs.
Checked for: TSS.verifyTSS accepting a composite signature without a WRAPS proof or hinTS aggregate; JNI verify wrappers returning true on malformed keys; libsecp256k1 recover/verify skipping parse or normalize.
Result: no user-exploitable finding. Not submitted.
TSS.verifyTSSrequires a 32-byteledgerId, rejects short/long composites, then eitherWRAPS.verifyCompressedProof(704-byte proof + hardcoded current WRAPS verification key) or genesisWRAPS.verifySignatureoverledgerId || hash(hintsVerificationKey)using the caller-set AddressBook. Only thenHINTS.verifyAggregate(default threshold strictly greater than 1/2).WRAPS.verifySignature/verifyCompressedProofandHINTS.verifyAggregatefail closed on null, length, weight-sum, or empty-message inputs.isProofSupportedrejects relative paths and...ContextualLibsecp256k1verify/recover wrap bitcoin-core libsecp256k1;*NoChecksvariants are documented unsafe and still return the native 0/1 result.
Do not file library-only JNI wrappers or threshold-gated TSS verify as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-mirror-node (sparse only), hiero-sdk-js / hiero-sdk-java / hiero-sdk-go, and the transaction-tool website leftover.
2026-09-03: Hedera leftover TokenAssociate + TokenKYC leftover (0d3d9a2)
Immunefi program hedera ($30,000, kyc: true). Follow-on leftover after TokenFreeze / TokenPause (ea25157). Official clone /tmp/hiero-consensus 0d3d9a2. Opened TokenAssociateToAccountHandler.java, TokenDissociateFromAccountHandler.java, TokenGrantKycToAccountHandler.java, TokenRevokeKycFromAccountHandler.java. No mainnet writes. No exploit PoCs.
Checked for: associate/dissociate that mutates another account without its key; KYC grant/revoke that flips a stranger without the KYC key; dissociate that drops a nonzero balance.
Result: no user-exploitable finding. Not submitted.
- Associate / dissociate
preHandlerequireKeyOrThrowthe target account. Associatehandlecreates token relations (zero balance) after association-limit checks. Dissociate rejects treasury, frozen, paused, nonzero fungible balances (TRANSACTION_REQUIRES_ZERO_TOKEN_BALANCES), and NFT ownership (ACCOUNT_STILL_OWNS_NFTS). - Grant KYC
preHandlerequires a non-empty KYC key. Revoke KYC requires the KYC key when present.handleonly toggleskycGrantedon the named account's token relation. No balances move.
Do not file target-signed associate/dissociate or KYC-key grant/revoke as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-consensus-node other handlers, hiero-mirror-node, hiero-cryptography, SDKs, and the hashed transaction-tool website leftover.
2026-09-03: Hedera leftover remaining SDK-js leftover (5b785ed)
Immunefi program hedera ($30,000, kyc: true). Listed remaining after cryptography leftover. Official sparse clone /tmp/hiero-sdk-js at 5b785ed. Opened transaction/Transaction.js, PrivateKey.js, PublicKey.js, account/TransferTransaction.js, EthereumTransaction.js. Consensus-node and cryptography leftovers already logged. No mainnet writes. No exploit PoCs.
Checked for: sign / signWithOperator attaching another account's spend authority; addSignature that would make a transfer valid without the sender key; EthereumTransaction wrapping a stranger's payload as the HAPI payer.
Result: no user-exploitable finding. Not submitted.
Transaction.signissignWith(privateKey.publicKey, privateKey.sign).signWithOperatorrequiresclient._operatorand signs only with that operator.executeauto-signs only the same operator.addSignatureattaches caller-supplied bytes; the node still verifies keys.PrivateKey.signTransactionsigns eachbodyByteswith_key.signand records that public key.PublicKey.verifyTransactionmatchespubKeyPrefixthenverify(bodyBytes, signature).TransferTransaction/EthereumTransactiononly build HAPI bodies. A wrap still spends the recovered Ethereum sender plus the HAPI relayer gas allowance, as already leftover-logged on consensus-node.
Do not file client-side builders or operator-only signing as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-mirror-node (sparse only), hiero-sdk-java / hiero-sdk-go, and the transaction-tool website leftover.
2026-09-03: Hedera leftover hiero-mirror-node importer leftover (abfc59f)
Immunefi program hedera ($30,000, kyc: true). Official remaining listed after cryptography leftover (ec74c65). Official clone /tmp/hiero-mirror abfc59f (sparse importer). Opened NodeSignatureVerifier.java, ConsensusValidatorImpl.java, Downloader.java, AccountBalancesDownloader.java, BlockStreamVerifier.java, TssVerifierImpl.java, CsvBalanceFileReader.java. No mainnet writes. No exploit PoCs.
Checked for: a stranger-signed account-balance or record file that overwrites mirrored balances; TSS / node-signature skip that accepts an unsigned block; hash-chain skip that splices a later file.
Result: no user-exploitable finding. Not submitted.
- Record and account-balance downloaders share
Downloader: each signature isSignature.initVerifyagainst that node's public key over the file hash (and metadata hash when present).ConsensusValidatorImplthen requires stake-weightedconsensusRatio(default 1/3,RoundingMode.CEILING) of VERIFIED signatures that agree on the same file hash;totalStake == 0fails closed. Duplicate node IDs are not double-counted.consensusRatio == 0is operator config (skip consensus after any verified signature). - After consensus, the data file's SHA-384 file/metadata hashes must match the signed hashes, and chained streams must match the previous verified running hash. CSV balance files are hashed with
DigestInputStreamwhile parsed. - Block streams: sequential block numbers + previous-hash chain; native blocks call
TSS.verifyTSSon the root hash; wrapped record blocks reuseNodeSignatureVerifieron the record-file signatures. Amendments / initial-state / pre-v6 wrapped records are rejected.
Do not file stake-weighted signed stream import or TSS-gated blocks as stranger theft. Mirror-node does not hold user funds.
Not submitted. Payment requires user KYC. Remaining listed: hiero-sdk-java / hiero-sdk-go, and the hashed transaction-tool website leftover.
2026-09-03: Hedera leftover remaining SDK-java leftover (eedd4b3)
Immunefi program hedera ($30,000, kyc: true). Official remaining listed after SDK-js leftover (b7e4fc1) and mirror-node importer leftover (59e539b). Official sparse clone /tmp/hiero-sdk-java eedd4b3. Opened Transaction.java, PrivateKey.java, PublicKey.java, TransferTransaction.java, EthereumTransaction.java. Consensus-node, cryptography, and JS SDK leftovers already logged. No mainnet writes. No exploit PoCs.
Checked for: sign / signWithOperator attaching another account's spend authority; addSignature that would make a transfer valid without the sender key; EthereumTransaction wrapping a stranger's unsigned payload as the HAPI payer.
Result: no user-exploitable finding. Not submitted.
Transaction.signissignWith(privateKey.getPublicKey(), privateKey::sign).signWithOperatorrequiresclient.getOperator()and signs only with that operator.onExecuteauto-signs only when the operator account equals the transaction-ID payer.addSignatureattaches caller-supplied bytes; the node still verifies keys.PrivateKey.signTransactionsignsbodyByteswithsignand records that public key.PublicKey.verifyTransactionmatchespubKeyPrefixthenverify(bodyBytes, signature).TransferTransactiononly buildsCryptoTransferbodies.EthereumTransaction.setEthereumDataFromBodyrejects an unsigned ethereum body. A wrap still spends the recovered Ethereum sender plus the HAPI relayer gas allowance, as already leftover-logged on consensus-node.
Do not file client-side builders or operator-only signing as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: hiero-sdk-go, and the hashed transaction-tool website leftover.
2026-09-03: Hedera leftover remaining SDK-go leftover (029d087)
Immunefi program hedera ($30,000, kyc: true). Official remaining listed after SDK-js (b7e4fc1) / SDK-java (4f0c3c1) leftovers. Official sparse clone /tmp/hiero-sdk-go 029d087. Opened transaction.go, crypto.go, ecdsa_private_key.go, transfer_transaction.go, ethereum_transaction.go. Consensus-node, cryptography, mirror-node, and other SDK leftovers already logged. No mainnet writes. No exploit PoCs.
Checked for: Sign / SignWithOperator attaching another account's spend authority; AddSignature that would make a transfer valid without the sender key; EthereumTransaction wrapping a stranger's unsigned payload as the HAPI payer.
Result: no user-exploitable finding. Not submitted.
Transaction.SignisSignWith(privateKey.PublicKey(), privateKey.Sign).SignWithOperatorrequiresclient.operatorand signs only with that operator.Executeauto-signs only when the operator account equals the transaction-ID payer.AddSignatureattaches caller-supplied bytes; the node still verifies keys.PrivateKey.SignTransactionsignsBodyByteswith the ED25519 or ECDSA key and records that public key.PublicKey.VerifyTransactiondispatches to the matching key type.TransferTransactiononly buildsCryptoTransferbodies.EthereumTransaction.SetEthereumDataFromBodyrejects an unsigned ethereum body. A wrap still spends the recovered Ethereum sender plus the HAPI relayer gas allowance, as already leftover-logged on consensus-node.
Do not file client-side builders or operator-only signing as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: the hashed transaction-tool website leftover.
2026-09-03: Filecoin leftover remaining go-f3 leftover (5f2c984)
Immunefi program filecoin ($50,000, kyc: true). Listed remaining after builtin-actors and boost leftovers. Official clone /tmp/filecoin-gof3 at 5f2c984 (chore: bump go-f3 version to v0.8.14). Opened gpbft/validator.go, blssig/verifier.go, blssig/aggregation.go, certs/certs.go. Do not rematch market / paych / miner / evm / reward / power / datacap / verifreg / boost leftovers. No mainnet writes. No exploit PoCs.
Checked for: ValidateMessage accepting an unsigned GPBFT vote; a justification with below-quorum power; ValidateFinalityCertificates accepting an aggregate that does not match the power table.
Result: no user-exploitable finding. Not submitted.
cachingValidator.ValidateMessageverifies the sender BLS signature viaverifier.Verify(senderPubKey, sigPayload, msg.Signature)and requires justification phase/round/value consistency. Justification signers must reachIsStrongQuorumof scaled power, thenAggregateVerifier.VerifyAggregate.blssig.Verifier.Verifyrejects a non-48-byte / null G1 public key and delegates to kyber BDNscheme.Verify. Aggregate verify uses the same scheme over the signer mask.ValidateFinalityCertificatesrequires strong-quorum signer power andaggregate.VerifyAggregateover the certificate payload.
Do not file BLS-verified GPBFT votes or quorum-gated finality certs as stranger theft. go-f3 does not move FIL by itself.
Not submitted. Payment requires user KYC. Remaining listed: lotus / proofs / FVM / filecoin.io.
2026-09-03: ZKsync OS leftover storage_models + crypto + oracles leftover (9efc8bf)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after bootloader / system hooks leftover. Official clone /tmp/zksync-os at listed commit 9efc8bf70ae77d1d4df67eff5c60c8a8cfc21268. Sparse storage_models, crypto, oracle_provider, callable_oracles. Do not rematch evm_interpreter or bootloader leftovers. No mainnet writes. No exploit PoCs.
Checked for: recover returning a stranger pubkey on a bad signature; secp256r1::verify accepting identity / infinity; StorageModel remapping a write onto another address; host oracle injecting a duplicate query processor.
Result: no user-exploitable finding. Not submitted.
secp256k1::recoverfails closed on field overflow, failed decompress, and recovered infinity. The L2 EOA path that consumes it (recover → EIP-3607 → debitfrom) is already leftover-logged on the bootloader.secp256r1::verifyrejects identity points, invertss, and requires recoveredxto equalr.StorageModelis a trait:storage_write/transfer_nominal_token_value/increment_noncetake the caller-supplied address. No implementation in this crate remapsfrom/to.ZkEENonDeterminismSourcepanics on a second processor for the same query id. A disconnected oracle returns 0.verify_hash_to_primerejects oversizedfirst_step_n, even candidates, and failed Miller-Rabin / Pocklington steps.
Do not file library-only recover/verify, address-parameter storage traits, or host-registered oracles as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: zk_ee implementations, zksync_os program, proof_running_system, airbender CS / prover / verifier, and zkos-wrapper circuits.
2026-09-03: ZKsync OS leftover proof_running_system leftover (9efc8bf)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after storage_models / crypto / oracles leftover. Official clone /tmp/zksync-os at listed commit 9efc8bf70ae77d1d4df67eff5c60c8a8cfc21268. Sparse proof_running_system. Do not rematch evm_interpreter, bootloader, or storage/crypto leftovers. No mainnet writes. No exploit PoCs.
Checked for: run_proving minting or transferring without the bootloader debit path; CSR oracle rewriting query results as a stranger; DummyCSRImpl supplying attacker balances.
Result: no user-exploitable finding. Not submitted.
run_provingonly inits the heap allocator andCsrBasedIOOracle, thenProvingBootloader::run_prepared. L2 EOA recover / fee debit / L1 treasury mint stay in the already leftover-logged bootloader. Failures abort (Tried to prove a failing batch).CsrBasedIOOracle::raw_querywrites the query id + payload to the host CSR and reads a length-prefixed reply.DummyCSRImplreturns 0. After the batch it disconnects (DISCONNECT_ORACLE_QUERY_ID) before arbitrary CSR access.- Result keeper / tracer / validator are nops. This crate does not hold user funds.
Do not file the proving harness wrapper or CSR proxy as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: zk_ee implementations, airbender CS / prover / verifier, and zkos-wrapper circuits.
2026-09-03: Filecoin leftover remaining FVM leftover (d4efdd4)
Immunefi program filecoin ($50,000, kyc: true). Listed remaining after go-f3 and lotus miner leftovers. Official sparse clone /tmp/filecoin-fvm at d4efdd4. Opened fvm/src/syscalls/send.rs, fvm/src/kernel/default.rs, fvm/src/call_manager/default.rs, fvm/src/executor/default.rs. Do not rematch builtin-actors, boost, go-f3, or lotus miner leftovers. No mainnet writes. No exploit PoCs.
Checked for: a send syscall that transfers another actor's FIL; transfer that skips a balance check or accepts a negative value; gas refunds credited to a stranger.
Result: no user-exploitable finding. Not submitted.
- Kernel
sendsetsfrom = self.actor_id(the calling actor) and rejects a non-zero value in read-only mode.call_actor/call_actor_resolvedthentransfer(from, to, value)only when value is non-zero. transferrejects a negative amount, requires the sender to exist withbalance >= value, no-ops a self-transfer, anddeduct_funds/deposit_fundsonly those two actors.- Executor gas prevalidation looks up
msg.from, requires an account / ethaccount / EAM-namespace placeholder, matching nonce, thendeduct_funds(gas_cost)from that sender. After apply, refunds go to the samesender_id.
Do not file caller-scoped FVM send or msg.from gas debit as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: proofs / filecoin.io.
2026-09-03: ZKsync OS leftover zk_ee + basic_system IO leftover (9efc8bf)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after proof_running_system leftover. Official clone /tmp/zksync-os at listed commit 9efc8bf70ae77d1d4df67eff5c60c8a8cfc21268. Sparse zk_ee + basic_system. Do not rematch evm_interpreter, bootloader, storage_models, crypto, or proof_running leftovers. No mainnet writes. No exploit PoCs.
Checked for: transfer_nominal_token_value debiting a stranger; update_account_nominal_token_balance unchecked wrap; storage_write remapping onto another address.
Result: no user-exploitable finding. Not submitted.
zk_eeIOSubsystemis a trait: transfer / update / deploy take the caller-supplied address.System::deploy_bytecodeonly remaps the returned slice.basic_systemio_subsystemforwards those addresses to the storage model. Persistentstorage_writeusesWarmStorageKey { address, key }unchanged.update_account_nominal_token_balanceuseschecked_sub/checked_add.- Ethereum and flat
account_cachetransfersoverflowing_subthe namedfromthenoverflowing_addthe namedto, failing closed on insufficient balance or overflow. L2 EOA / CALL-value callers are already leftover-logged on the bootloader.
Do not file address-parameter IO traits or checked debit/credit caches as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: airbender CS / prover / verifier, and zkos-wrapper circuits.
2026-09-03: Filecoin leftover remaining proofs-api leftover (7637843)
Immunefi program filecoin ($50,000, kyc: true). Listed remaining after FVM leftover. Official clone /tmp/filecoin-proofs-api at 7637843. Opened src/seal.rs, src/post.rs, src/update.rs, src/lib.rs. Thin wrapper over filecoin_proofs_v1. Do not rematch builtin-actors, boost, go-f3, lotus miner, or FVM leftovers. No mainnet writes. No exploit PoCs.
Checked for: verify_seal / verify_winning_post / verify_window_post accepting a proof without the named prover_id; PoSt type mix-up; aggregate seal verify skipping comm_rs / seeds.
Result: no user-exploitable finding. Not submitted.
verify_seal/verify_batch_sealpasscomm_r,comm_d,prover_id,sector_id,ticket,seed, and the proof bytes intofilecoin_proofs_v1.verify_winning_postrequiresPoStType::Winningand the same registered proof on every replica, then verifies with thatprover_id.verify_window_postrequiresPoStType::Window, v1, and a single proof.verify_aggregate_seal_commit_proofsrequires SnarkPack V1/V2 and forwardscomm_rs,seeds, andcommit_inputs. Sector-update verify forwards old/newcomm_randcomm_d.
Do not file a wrapper that forwards prover_id and commitments as stranger theft. This crate does not move FIL.
Not submitted. Payment requires user KYC. Remaining listed: rust-fil-proofs / rust-fil-proofs-ffi / filecoin.io.
2026-09-03: Wormhole leftover remaining Solana token-bridge leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after ETH core / TokenBridge Sourcify, NTT, circle-integration, and Solana+Sui NTT leftovers. Official clone /tmp/wormhole c58827e (sparse solana/modules/token_bridge + solana/bridge claim). Opened token_bridge/program/src/api/transfer.rs, complete_transfer.rs, complete_transfer_payload.rs, bridge/program/src/accounts/claim.rs. No mainnet writes. No exploit PoCs.
Checked for: transfer_native locking another wallet's SPL; complete_native / complete_wrapped paying a stranger; payload redeem without the VAA recipient.
Result: no user-exploitable finding. Not submitted.
transfer_nativeverifies custody PDA + mint, rejects wrapped mint-authority, truncates to 8 decimals without burning the remainder, thenspl_token::transferfrom the caller-approvedfromviaauthority_signer.transfer_wrappedrequiresfrom.owner == from_owner(signer) and burns that account.complete_native/complete_wrappedrequire a registered emitter endpoint, matching mint/meta,vaa.to == totoken account, andclaim::consume(uninitialized claim PDA = replay protection). Native un-truncates then custody-transfersamount - feetoto; wrapped mints the same split.- Payload complete requires the redeemer to be
vaa.toor a"redeemer"PDA of that program, and the token account owner to be that recipient or redeemer.
Do not file approved lock/burn of the signer's tokens or claim-gated release to the VAA recipient as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole node / wormchain / cosmwasm / algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: Filecoin leftover remaining proofs-ffi leftover (59f46f4)
Immunefi program filecoin ($50,000, kyc: true). Listed remaining after proofs-api leftover. Official clone /tmp/filecoin-proofs-ffi at 59f46f4 (deprecate project (#43)). README marks the crate deprecated and points to filecoin-project/filecoin-ffi. Opened src/api.rs, src/helpers.rs, src/types.rs, src/lib.rs. Thin C FFI over filecoin_proofs / storage_proofs. Do not rematch builtin-actors, boost, go-f3, lotus miner, FVM, or proofs-api leftovers. No mainnet writes. No exploit PoCs.
Checked for: verify_seal / verify_post accepting a proof without the named prover_id; replica-map length mismatch; is_valid defaulting true on error.
Result: no user-exploitable finding. Not submitted.
verify_sealcopies proof bytes, derivesPoRepProofPartitionsfromSINGLE_PARTITION_PROOF_LEN, then forwardscomm_r,comm_d,prover_id,sector_id,ticket,seed, and the proof intofilecoin_proofs::verify_seal.Ok(true)setsis_valid;Ok(false)and decode errors leave it false.verify_postrequires equalsector_idsand flattenedcomm_rslengths, splits proofs onSINGLE_PARTITION_PROOF_LEN, converts winners viabytes_into_fr, then forwards sector size, randomness, challenge count, proofs, the public-replica map, winners, andprover_idintofilecoin_proofs::verify_post.VerifySealResponse/VerifyPoStResponsedefaultis_valid = false.catch_panic_responsewraps every export. This crate does not move FIL.
Do not file a deprecated FFI that forwards prover_id and commitments as stranger theft. Successor leftover (if unique) is filecoin-ffi, not another pass on this tree.
Not submitted. Payment requires user KYC. Remaining listed: rust-fil-proofs / filecoin-ffi / filecoin.io.
2026-09-03: Wormhole leftover remaining CosmWasm token-bridge leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after ETH core / TokenBridge / NFTBridge Sourcify, NTT, circle-integration, Solana+Sui NTT, and Solana token-bridge leftovers. Official clone /tmp/wormhole c58827e (sparse cosmwasm/contracts/token-bridge). Opened src/contract.rs (deposit_tokens, withdraw_tokens, handle_initiate_transfer*, handle_complete_transfer*, parse_and_archive_vaa, reply) and src/state.rs (send_native / receive_native). No mainnet writes. No exploit PoCs.
Checked for: stranger withdrawal of another wallet's bank deposit; initiate transfer locking someone else's CW20/native; complete_* paying a stranger or minting without a registered emitter; payload redeem by a non-recipient; outstanding-native underflow / replay.
Result: no user-exploitable finding. Not submitted.
deposit_tokenscreditsbridge_depositas"{info.sender}:{denom}"frominfo.fundsonly.withdraw_tokenszeros that same sender+denom key andBankMsg::Sends only toinfo.sender.- Native
InitiateTransfersubtracts the sender's deposit ledger (fails if missing), rejects same-chain / zero /fee > amount, chops dust to 8 decimals, thensend_nativeandPostMessage. Wrapped CW20 burnsinfo.sender; native CW20TransferFroms the signer into the contract, thenreplymeasures the actual balance delta (fee-token safe), rejectsfee > real_amount, and posts the corrected amount.wrapped_transfer_tmpis asserted empty then cleared inreply(reentrancy). parse_and_archive_vaaverifies via the wormhole contract and archives the VAA hash before handle (same-tx revert on laterErr). Completes require a registered emitter,recipient_chain == cfg.chain_id, and pay the VAA recipient.TRANSFER_WITH_PAYLOADadditionally requiresrecipient == info.sender. Relayer fee goes toinfo.senderonSubmitVaaTRANSFER, or the recipient-chosenrelayeron payload complete.- Foreign wrapped completes mint to recipient (+ fee to relayer). Native CW20 / bank completes
receive_native(outstanding counter must cover amount+fee) then un-truncate and transfer/send.
Do not file signer-keyed deposit/withdraw, signer-approved lock/burn, or claim-gated release to the VAA recipient as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole node / wormchain / other cosmwasm contracts / algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: Wormhole leftover remaining CosmWasm core leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after Solana token-bridge and CosmWasm token-bridge leftovers. Official clone /tmp/wormhole c58827e (sparse cosmwasm/contracts/wormhole). Opened src/contract.rs (handle_post_message, handle_submit_vaa, parse_and_verify_vaa, governance handlers) and src/state.rs (ParsedVAA::deserialize, GuardianSetInfo::quorum, VAA archive). No mainnet writes. No exploit PoCs.
Checked for: forged VAA acceptance without quorum; replay; guardian-set skip; PostMessage moving another wallet's coins; TransferFee paying a stranger without a governance VAA.
Result: no user-exploitable finding. Not submitted.
ParsedVAA::deserializedouble-keccak256s the body.parse_and_verify_vaarequires version 1, a non-expired guardian set, strictly increasing signer indexes, andlen_signers >= quorum(((n*10/3)*2)/10 + 1). Each recoverable secp256k1 signature must recover to the guardian address at that index (keys_equal= keccak256 of uncompressed pubkey[1:] last 20 bytes). Already-archived hashes are rejected.SubmitVAAarchives after verify, then only handles governance (emitter == gov_chain/gov_address, current guardian set). Module must beCoreandchain0 or this chain. Guardian-set upgrade requiresnew_index == current + 1. Contract upgrade isWasmMsg::Migrateto the VAA code id.SetFee/TransferFeeare governance-only.PostMessagerequires the configured fee (if any), attributes the emitter asinfo.sender, and increments that emitter's sequence. It does not transfer third-party bank balances.
Do not file a quorum-checked governance VAA or a fee-gated self-attributed post as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole node / wormchain / other cosmwasm contracts / algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: ZKsync OS leftover zkos-wrapper leftover (8b679aa)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after zk_ee leftover. Official clone /tmp/zkos-wrapper at 8b679aa (Merge pull request #68 from matter-labs/oh_v31_zkos_patch). Opened wrapper/src/lib.rs, wrapper/src/circuits/risc_wrapper.rs, wrapper/src/circuits/compression.rs, wrapper/src/circuits/snark_wrapper.rs, wrapper/src/wrapper_inner_verifier/mod.rs. Recursion wrapper: RISC proof → RISC-wrapper STARK → compression STARK → SNARK. Do not rematch bootloader, evm_interpreter, storage_models, proof_running_system, or zk_ee leftovers. No mainnet writes. No exploit PoCs.
Checked for: wrapper accepting a RISC proof whose end_params / aux_params do not match the committed binary; compression/SNARK verify treating a failed check as valid; public inputs not bound to the inner proof.
Result: no user-exploitable finding. Not submitted.
RiscWrapperWitness::from_full_proofrequires a single base proof, matchingend_params, Blake2s(recursion_chain_preimage) ==recursion_chain_hash==binary_commitment.aux_params.check_proof_stateenforces zero start PC, memory grand-product = 1, delegation accumulator = 0, hashed(end_pc || setup_caps)==binary_commitment.end_params, and registers 18–25 ==aux_params. Innerwrapper_inner_verifier::verifydrives the transcript and leaf-inclusion queries.verify_risc_wrapper_proof/verify_compression_proof/verify_snark_wrapper_proofreturn the verifier bool. Prove paths fail closed if any layer is invalid.CompressionCircuitenforce_equalsis_validto true and carries public inputs. This crate does not move ETH.
Do not file a recursion wrapper that binds the binary commitment and fails closed on invalid proofs as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: airbender CS / prover / verifier.
2026-09-03: Wormhole leftover remaining CosmWasm IBC leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after CosmWasm token-bridge and core leftovers. Official clone /tmp/wormhole c58827e (sparse cosmwasm/contracts/{wormhole-ibc,ibc-translator,wormchain-ibc-receiver}). Opened wormhole-ibc execute/IBC, ibc-translator execute/reply, wormchain-ibc-receiver execute/IBC. No mainnet writes. No exploit PoCs.
Checked for: IBC packet stealing bank tokens; CompleteTransferAndConvert paying a stranger; GatewayConvertAndTransfer burning another wallet's factory denom; channel-map updates without a governance VAA.
Result: no user-exploitable finding. Not submitted.
wormhole-ibcSubmitVAA/PostMessagewrap core (already leftover-logged).PostMessageonly sends attributes on the gov-whitelistedWORMCHAIN_CHANNEL_ID.SubmitUpdateChannelChainrequires a verified Solana governance emitter VAA for this chain, archives the hash, and only stores a Wormchain channel.ibc_packet_receiveis rejected; channel-open requiresibc-wormhole-v1.ibc-translatorCompleteTransferAndConvertcalls token-bridgeCompleteTransferWithPayload(relayer = caller) and additionally requires the VAA recipient to be this contract. Reply deletesCURRENT_TRANSFER, mints the tokenfactory denom to the contract, andMsgTransfers to the payload recipient on a gov-mapped channel.GatewayConvertAndTransfer*burns onlyinfo.funds[0]when the denom isfactory/<this-contract>/<cw20>and matchesCW_DENOMS. Channel-map updates requireVerifyVaa+ governance emitter + Wormchain/Any dest + archive.wormchain-ibc-receiveronly applies governanceUpdateChannelChainafterVerifyVaa+ archive. Packet receive re-emits the six Wormhole publish attributes and does not move tokens.
Do not file a payload3 complete that IBC-sends to the VAA recipient, or a self-funded factory burn into InitiateTransfer, as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole node / wormchain / remaining CosmWasm (accountant / cw20-wrapped) / algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: ZKsync OS leftover airbender verifier leftover (6ec4ea7)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after zkos-wrapper leftover. Official clone /tmp/zksync-airbender at 6ec4ea7 (fix(gpu_prover): update era_cudart to 0.156.0 and fix CUB size-query callsites). Opened verifier/src/lib.rs and full_statement_verifier/src/lib.rs. Do not rematch zkos-wrapper, bootloader, evm_interpreter, storage_models, proof_running_system, or zk_ee leftovers. No mainnet writes. No exploit PoCs.
Checked for: verify accepting a STARK whose FRI/quotient checks fail; verify_full_statement chaining circuits without matching setup caps or memory challenges; base-layer chain hash skipping end_params.
Result: no user-exploitable finding. Not submitted.
verify_with_configurationloads the skeleton and merkle-authenticated queries, drives the Blake2s transcript (lookup / quotient / DEEP / FRI challenges + PoW), then checks quotient-at-z, DEEP consistency, and FRI folding. Query indexes must match the transcript draw; the last foldassert_eqs the monomial-form evaluation.verify_full_statementrequiresx0 == 0, a bounded circuit count, continuous sequence + PC, equal setup caps and memory/delegation challenges, registered delegation setup caps, memory grand-product × register contribution == 1, and delegation accumulator == 0.end_paramsis Blake2s(end_pc || setup_caps).- Base layer requires registers 18–25 zero and hashes
[0u32; 8] || end_params. Recursion requires a Blake2s preimage of the aux registers and either terminates on matchingend_paramsor hashesaux || end_params. This crate does not move ETH.
Do not file a STARK verifier that asserts FRI/quotient equality and binds setup caps as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: airbender CS / prover / verifier_generator / field.
2026-09-03: Wormhole leftover remaining CosmWasm accountant leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after CosmWasm IBC leftover. Official clone /tmp/wormhole c58827e (sparse cosmwasm/contracts/{global-accountant,ntt-global-accountant,cw20-wrapped}). Opened accountant execute / handle_observation / handle_vaa, NTT accountant execute, and cw20-wrapped mint/burn. No mainnet writes. No exploit PoCs.
Checked for: a single guardian observation committing a fake transfer; ModifyBalance without a governance VAA; cw20-wrapped mint/burn by a non-bridge caller.
Result: no user-exploitable finding. Not submitted.
global-accountantSubmitObservationsverifies a guardian signature (VerifyMessageSignature+ accountant prefix) and onlycommit_transfers afternum_signatures >= quorum, a registered emitter, and a matching digest. Duplicate keys with a different digest fail. The ledger is accounting state only — no bank or CW20 sends.SubmitVaasrequiresVerifyVaa. Governance (Solana +GOVERNANCE_EMITTER) canRegisterChain(Wormchain/Any) orModifyBalance(Wormchain only). Other VAAs must come from a registered token-bridge emitter, thencommit_transferand drop pending. Digest replay is rejected.ntt-global-accountantuses the same observation-quorum andVerifyVaagates;ModifyBalanceis still accountant governance only.cw20-wrappedsets the instantiator (token-bridge) as minter andbridge.Mint/UpdateMetadatarequireinfo.sender == bridge.Burn/BurnFromare cw20-base allowance burns.
Do not file a quorum-gated accountant ledger update or a bridge-gated wrapped mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole node / wormchain / algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: Filecoin leftover remaining paired leftover (80b765c)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after filecoin-ffi / go-graphsync leftovers. Official clone /tmp/filecoin-paired at 80b765c (chore(paired): release 0.22.0). Fork of zkcrypto pairing; BLS12-381 only. Opened src/lib.rs, src/bls12_381/mod.rs, src/bls12_381/ec/g1.rs, src/bls12_381/ec/g2.rs. Do not rematch proofs / proofs-api / proofs-ffi / filecoin-ffi leftovers. No mainnet writes. No exploit PoCs.
Checked for: compressed G1/G2 decode skipping the subgroup check; pairing returning identity without a miller loop / final exponentiation.
Result: no user-exploitable finding. Not submitted.
- Checked
into_affine(compressed and uncompressed) requires on-curve thenis_in_correct_subgroup_assuming_on_curve.into_affine_uncheckedis the explicit skip path. Engine::pairingprepares both points, runsmiller_loop, thenfinal_exponentiation. Miller skips only zero points. This crate does not move FIL.
Do not file a pairing library that subgroup-checks affine decode as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner / go-data-transfer.
2026-09-03: Wormhole leftover remaining wormchain leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after CosmWasm leftovers. Official clone /tmp/wormhole c58827e (sparse wormchain). Opened x/tokenfactory msg_server / bankactions / wasm bindings, x/wormhole VerifyGovernanceVAA / ExecuteGovernanceVAA, x/ibc-hooks OnRecvPacketOverride, and x/ibc-composability-mw OnRecvPacket. No mainnet writes. No exploit PoCs.
Checked for: non-admin tokenfactory mint/burn/force-transfer; wasm bindings minting as a stranger; governance VAA without quorum; IBC memo hijack paying an attacker.
Result: no user-exploitable finding. Not submitted.
- Tokenfactory
Mint/Burn/ChangeAdminrequiremsg.Sender == denom admin.CreateDenomsets the creator as admin.ForceTransfer/BurnFrom/SetDenomMetadataare capability-gated;app.gopassestokenFactoryCapabilities = []string{}soIsCapabilityEnabledis false. Wasm bindings dispatch ascontractAddrthrough the same msg server, thenSendCoinsfrom the contract to the mint recipient. ExecuteGovernanceVAAcallsVerifyGovernanceVAA(quorum signatures, replay index, governance emitter/chain, Core module, target chain 0 or this chain) and only appliesActionGuardianSetUpdate.- IBC hooks wasm memo overrides the ICS20 receiver to a channel+sender derived intermediate, then executes the memo contract as that sender with those funds. Composability MW only rewrites gateway memos to PFM or ibc-hooks targeting the stored translator contract.
Do not file admin-gated factory mint or a derived-sender IBC hook as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole node / algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: Filecoin leftover remaining go-data-transfer leftover (8a94d94)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after paired leftover. Official clone /tmp/filecoin-gdt at 8a94d94 (chore(deps): bump github.com/quic-go/quic-go from 0.54.0 to 0.54.1 (#391)). Opened impl/receiving_requests.go, impl/events.go, impl/receiver.go, impl/impl.go, channels/channels_fsm.go, manager.go. Graphsync transport for deal/retrieval bits. Does not move FIL. Do not rematch graphsync / proofs / boost leftovers. No mainnet writes. No exploit PoCs.
Checked for: a new request opening a push/pull without a registered validator; an intermediate voucher resuming transfer without Accepted; DataLimit not pausing queued/sent bytes.
Result: no user-exploitable finding. Not submitted.
acceptRequestlooks up the voucher type, thenValidatePull/ValidatePush. Unknown type, validator error, or!Acceptedreturns beforeCreateNew/Accept.requestErrormaps that toErrRejected.receiveRestartRequestrejects initiator-as-manager,validateRestartRequestparam match, thenValidateRestart.!Acceptederrors the channel.- Intermediate
IsVoucheronlyNewVouchers (FSMToNoChange). Resume / higherDataLimitrequires the host to callUpdateValidationStatus(!Acceptedcloses the transport).DataQueued/DataReceivedreturnErrPausepastDataLimit.
Do not file a transport that defers payment semantics to a registered validator as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Wormhole leftover remaining node leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after wormchain leftover. Official clone /tmp/wormhole c58827e (sparse node). Opened pkg/processor (handleMessage, handleMessagePublication, handleSingleObservation, checkForQuorum) and pkg/txverifier/evm.go TransferIsValid. No mainnet writes. No exploit PoCs.
Checked for: a gossip observation becoming a signed VAA without a local watcher event; a forged guardian signature aggregating; TransferIsValid treating an insolvent receipt as safe.
Result: no user-exploitable finding. Not submitted.
handleMessagePublicationruns notary then governor then accountant; onlyshouldPubreacheshandleMessage, which signs the watcher-built digest.checkForQuorumassembles a VAA only whenourObservation != nil(this guardian independently saw the message) andlen(sigs for the active set) >= gs.Quorum().handleSingleObservationtreats p2p fields as untrusted: signer must be in the guardian set,Ecrecover(hash, sig)must match the claimed address. Unknown hashes may store signatures but do not emit a VAA until this node observes the same digest.TransferIsValidparses the receipt, requires at least one token-bridgeLogMessagePublished, thenvalidateReceipt(inbound deposits/transfers vs outbound amounts). Parse errors fail closed and are not cached. Insolvent receipts are not marked safe.
This node signs observations; it does not hold or pay user tokens. Do not file quorum-gated signing of a locally observed digest as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: wormhole algorand / aptos / near, and Relayer Sourcify 404.
2026-09-03: Filecoin leftover remaining go-crypto leftover (91b77aa)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-data-transfer leftover. Official clone /tmp/filecoin-gocrypto at 91b77aa (Fix go ethereum incompatibility (#5)). Opened crypto.go. secp256k1 helpers only. Does not move FIL. Do not rematch go-f3 / proofs leftovers. No mainnet writes. No exploit PoCs.
Checked for: Verify accepting a signature that recovers a different pubkey; EcRecover hashing a non-32-byte message.
Result: no user-exploitable finding. Not submitted.
Verifyrecovers the pubkey viaEcRecoverand requires it equal the suppliedpk. False on recover error.EcRecoverrejectslen(msg) != 32, parses a 65-byte compact recoverable signature, andRecoverPublicKeys.SignusesEncodingCompactRecoverableandRejectMalleable.
Do not file a secp256k1 recover-and-compare helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Wormhole leftover remaining Algorand Aptos Near leftover (c58827e)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after node leftover. Official clone /tmp/wormhole c58827e (sparse algorand, aptos/token_bridge, near/contracts/token-bridge). Opened Algorand token_bridge.py sendTransfer / completeTransfer / checkForDuplicate, Aptos transfer_tokens.move / complete_transfer.move / complete_transfer_with_payload.move / vaa.move, Near lib.rs send_transfer_near / submit_vaa / vaa_transfer / ft_on_transfer. No mainnet writes. No exploit PoCs.
Checked for: complete paying a stranger; initiate locking another wallet's coins; payload redeem by a non-recipient; replay.
Result: no user-exploitable finding. Not submitted.
- Algorand
sendTransferrequires the prior group Payment/AssetTransfer fromTxn.senderinto the custody account,fee <= amount.completeTransferrequires the previous group txn to be coreverifyVAAby the same sender, a registered emitter (or self on chain 8), dest chain 8, andcheckForDuplicate(version 1 + emitter/sequence bit). Amount (minus fee) is inner-sent to the VAA destination; fee toTxn.sender. Payload3 requires the next group app call to be the destination app. - Aptos
transfer_tokens_entrycoin::withdraws the signer. Wrapped burns; native deposits to@token_bridge.complete_transferparse_verify_and_replay_protects (known emitter + consumed hash), requiresto_chainthis chain and matchingCoinTypeorigin, then mints/withdraws to the VAAtoand fee tofee_recipient. Payload complete additionally requiresrecipient == emitter_capaddress. - Near
send_transfer_nearlocksattached_deposit - message_feefrom the predecessor.submit_vaacalls coreverify_vaathen archivesdups[hash].vaa_transferrequires a registered emitter,recipient_chain == NEAR, a registered recipient hash, payload3predecessor == recipient, and pays that account (namount - nfee).
Do not file signer-approved lock/burn or claim-gated release to the VAA recipient as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: Relayer Sourcify 404.
2026-09-03: Filecoin leftover remaining go-address leftover (73c8a46)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-crypto leftover. Official clone /tmp/filecoin-goaddr at 73c8a46 (chore: set CODEOWNERS (#62)). Opened address.go, constants.go. Encoding only; does not move FIL. Do not rematch builtin-actors / go-crypto leftovers. No mainnet writes. No exploit PoCs.
Checked for: decode accepting a checksum mismatch; ID / f4 namespace overflowing 2^63; secp/actor payload not 20 bytes; delegated subaddress over MaxSubaddressLen.
Result: no user-exploitable finding. Not submitted.
NewSecp256k1Address/NewActorAddressblake2b-20 the ingest.NewBLSAddressrequires 48-byte payload.NewIDAddress/ delegated namespace reject> 2^63-1.decoderequiresf/tprefix, known protocol, exact payload lengths, and blake2b-4 checksum over{protocol || payload}.base32decodere-encodes and requires a canonical string.NewFromBytesrejects length 1; empty isUndef.UnmarshalCBORrejects extra > 64 andUndef.IDFromAddresserrors on non-ID.
Do not file an address codec that checksums and length-checks as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: Filecoin leftover remaining go-fil-commcid leftover (62ce856)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-address leftover. Official clone /tmp/filecoin-commcid at 62ce856. Opened commcid.go. Commitment↔CID helpers only. Does not move FIL. Do not rematch proofs leftovers. No mainnet writes. No exploit PoCs.
Checked for: CIDToDataCommitmentV1 accepting a sealed codec; CIDToReplicaCommitmentV1 accepting unsealed; piece v2 decode ignoring hash code or digest length.
Result: no user-exploitable finding. Not submitted.
validateFilecoinCidSegmentsrequires unsealed↔Sha2_256Trunc254Padded, sealed↔Poseidon, and 32-byte digest.CIDToDataCommitmentV1/CIDToReplicaCommitmentV1additionally check the matching codec.DataCommitmentToPieceCidv2requires 32-byte commD and payload ≥ 127.PieceCidV2ToDataCommitmentrequiresFr32Sha256Trunc254Padbintree, exact digest length, and padding< halfthe padded tree.
Do not file a commitment CID codec as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining go-* / lotus non-miner.
2026-09-03: ZKsync OS leftover remaining airbender CS leftover (6ec4ea7)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after airbender verifier leftover. Official clone /tmp/zksync-airbender 6ec4ea7 (sparse cs). Opened cs/src/cs/circuit.rs, cs/src/constraint.rs, and machine/machine_configurations/full_isa_no_exceptions/basic_state_transition.rs. Do not rematch verifier, zkos-wrapper, bootloader, evm_interpreter, storage_models, proof_running_system, or zk_ee leftovers. No mainnet writes. No exploit PoCs.
Checked for: a constraint API that drops degree so an invalid opcode becomes satisfiable; shuffle-RAM write/read collapsing to a no-op; invalid_opcode not constrained.
Result: no user-exploitable finding. Not submitted.
Constraint/Termkeep a normalized polynomial of degree ≤ 2 (TERM_INNER_CAPACITY4 for intermediate products).normalizesorts monomials so like terms merge.Circuit::add_constraint*is the only path that records a constraint.base_isa_state_transition(trusted-code / no-exceptions configs) decodes the ROM opcode, thenadd_constraint_allow_explicit_linear_prevent_optimizations(invalid_opcode)so an invalid opcode is unsatisfiable.ASSUME_TRUSTED_CODE == falseisunimplemented!(). Shuffle-RAM queries carry distinct read/write variables and a local timestamp.- This crate describes the RISC-V AIR. It does not move ETH.
Do not file a degree-capped constraint algebra or an unsatisfiable invalid-opcode flag as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: airbender prover / verifier_generator / field, and zksync_os program (thin run_proving wrapper).
2026-09-03: ZKsync OS leftover remaining airbender prover leftover (6ec4ea7)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after airbender CS leftover. Official clone /tmp/zksync-airbender 6ec4ea7 (sparse prover / verifier_generator / field) plus /tmp/zksync-os 9efc8bf zksync_os. Opened prover/src/prover_stages/mod.rs prove_configured, stage3.rs term counts, quotient_evaluator.rs divisors, verifier_generator generate_from_parts / generate_inlined, field base.rs / ops.rs, and zksync_os/src/main.rs. Do not rematch CS, verifier, zkos-wrapper, bootloader, evm_interpreter, storage_models, proof_running_system, or zk_ee leftovers. No mainnet writes. No exploit PoCs.
Checked for: prover omitting constraints so a false RISC-V execution still produces a verifier-accepted STARK; generated inlined quotient dropping a constraint class; M31 add/mul/inv that would make a failed FRI/quotient check compare equal.
Result: no user-exploitable finding. Not submitted.
prove_configuredcommits sequence / public inputs / setup caps, then stages 1–5. Stage 3 counts quotient terms fromas_verifier_compiled_artifactandassert_eqs them againstnum_stage_3_quotient_terms. Divisors are inverses of(x^n-1)(everywhere except last / last two) and1/(x-ω^k)(first / last / last-and-zero). A prover bug that fails to prove is DoS, not theft. The verifier leftover independently re-evaluates quotient-at-z + FRI.generate_from_partsembeds the compiled layout + degree-1/2 constraints asVERIFIER_COMPILED_LAYOUT.generate_inlinedwalks boolean columns, remaining degree-2, degree-1, range-check pairs, timestamps, first/last-row, and memory accumulators.remainder_for_range_check_16istodo!()— compile-fail, not a missing runtime check.- M31
add_mod/mul_modfold2^31;is_zerotreats0andpas zero;PartialEq/Hashuseto_reduced_u32. Inverse isa^{p-2}and returnsNoneat 0. This crate does not move ETH. zksync_osprogram loads.data/.rodata, inits the allocator, and calls already-loggedproof_running_system::run_proving.
Do not file an honest STARK prover, codegen that copies the compiled circuit, or M31 reduction as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: airbender verifier_common (fri_folding / proof_flattener).
2026-09-03: ZKsync OS leftover remaining airbender verifier_common leftover (6ec4ea7)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after airbender prover leftover. Official clone /tmp/zksync-airbender 6ec4ea7 (sparse verifier_common). Opened fri_folding.rs, proof_flattener.rs, structs.rs, and lib.rs. Do not rematch verifier, prover, CS, or field leftovers. No mainnet writes. No exploit PoCs.
Checked for: FRI fold accepting a leaf that does not contain the expected evaluation; flatten/parse dropping a cap or query so a fake STARK still verifies; query-index assembly ignoring transcript bits.
Result: no user-exploitable finding. Not submitted.
fri_fold_by_log_nassert_eqs the running expected value against the leaf attree_index & ((1<<k)-1), then folds pairs as(a-b)*root*challenge + (a+b)(FMA variant pre-multiplies the challenge into the roots). Domain log, tree index, and evaluation point shrink byFOLDING_DEGREE_LOG2. The verifier leftover still checks the final monomial.flatten_proof_for_skeleton/flatten_queryencode reduced u32 limbs in a fixed order (caps, challenges, accumulators, DEEP/FRI, PoW, then leaves + Merkle paths). Feature-gatedproof_utilsonly. A flatten/parse mismatch fails verification; it does not accept a stranger proof.BitSource/assemble_query_indexread transcript bits little-endian.parse_field_els_as_u32_from_u16_limbs_checkedrequires both limbs< 2^16. This crate does not move ETH.
Do not file a FRI fold that binds the expected leaf or a proof u32 encoder as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: zksync-os supporting_crates (delegated_u256 / modexp / u256).
2026-09-03: ZKsync OS leftover remaining supporting_crates leftover (9efc8bf)
Immunefi program zksync-os ($100,000, kyc: true). Official remaining listed after airbender verifier_common leftover. Official clone /tmp/zksync-os 9efc8bf (sparse supporting_crates/{u256,delegated_u256,modexp}). Opened u256 naive/riscv wrappers, delegated_u256 arithmetic + CSR delegation, and modexp modexp / modpow. Do not rematch evm_interpreter, crypto, zk_ee, or airbender leftovers. No mainnet writes. No exploit PoCs.
Checked for: add/mul/mod that wrap without a flag so a proven EVM result is wrong; modexp returning a non-zero residue for modulus 0; delegated bigint CSR skipping a carry.
Result: no user-exploitable finding. Not submitted.
u256is anruintwrapper (host) or delegated RISC-V type.div_rem/div_ceilpanic on 0.mul_modreturns early if the modulus is 0. Tests compare naive vs delegated limbs for add/sub/mul/div/mod/shifts.delegated_u256dispatches ADD/SUB/MUL/EQ through CSR0x7caon RISC-V; the host path usesruintoverflowing add/sub. Alignment is required. This is a precompile helper, not a token transfer.modexpreturns empty bytes when the modulus is 0.base^0is 0 mod 1 and 1 otherwise. Montgomery path requires an odd modulus; even non-power-of-two splits out the 2-adic factor. Aurora-engine port. These crates do not move ETH.
Do not file a wrapping U256 helper or a modulus-0 empty modexp as stranger theft.
Not submitted. Payment requires user KYC. Official zksync-os GitHub assets are leftover-logged. Remaining listed: Wormhole Relayer Sourcify 404; Filecoin remaining go-* / lotus (avoid collision).
2026-09-03: Filecoin leftover remaining bellperson leftover (a215065)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after cbor-gen leftover. Official clone /tmp/filecoin-bellperson at a215065 (chore(deps): bump dtolnay/rust-toolchain). Opened src/groth16/verifier.rs, proof.rs, and aggregate/{verify.rs,proof.rs}. Groth16 / inner-pairing-product helpers only. Does not move FIL. Do not rematch rust-fil-proofs leftover. No mainnet writes. No exploit PoCs.
Checked for: verify_proof accepting a proof whose public-input MSM length does not match the VK; Proof::read accepting the identity or a non-curve point; aggregate verify skipping parsing_check or a mismatched nproofs.
Result: no user-exploitable finding. Not submitted.
verify_proofrequirespublic_inputs.len()+1 == pvk.ic.len(), then checkse(A,B) · e(IC(inputs), -γ) · e(C, -δ) = e(α,β)after one final exponentiation. Batch verify uses random 128-bit coefficients (Zcash App. B.2).Proof::read_manydecompresses A/B/C viaGroupEncoding::from_bytes(curve check) and rejects the identity. Size is exact (num_proofs * Proof::size()).verify_aggregate_proofcallsparsing_check(nproofsin[2, MAX_SRS_SIZE], power of two, TIPP vector lengths), requirespublic_inputs.len() == nproofs, bindstranscript_includeintor, then TIPP/MIPP + the aggregated Groth16 pairing product.
Do not file a pairing-equation Groth16 verifier as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: lotus non-miner / merkletree / neptune.
2026-09-03: Wormhole leftover remaining Relayer leftover (Sourcify)
Immunefi program wormhole ($1,000,000, kyc: true). Official remaining listed after Algorand/Aptos/Near leftover. Prior Relayer Sourcify 404 retried with Ethereum Standard Relayer proxy 0x27428DD2d3DD32A4D7f7C497eAaa23130d894911 — exact match. Implementation 0x90995DBd1aae85872451b50A569dE947D34ac4ee (WormholeRelayer). Opened Sourcify WormholeRelayerDelivery / Send / Governance / Base. Do not rematch ETH core + TokenBridge Sourcify leftover. No mainnet writes. No exploit PoCs.
Checked for: deliver accepting an unverified VAA and paying a stranger refund; send keeping leftover msg.value; governance upgrade without a consumed guardian VAA.
Result: no user-exploitable finding. Not submitted.
deliverrequiresparseAndVerifyVM, emitter == registered relayer on the source chain,msg.valuecovering gas-limit refund + receiver value, andtargetChain == this. Extra message keys areparseVMidentity checks only; the delivery instruction itself is guardian-signed. Replay of a success hash skips the target call and refunds from the newmsg.value(relayer-funded), not vault balance.sendcheckMsgValuerequires exactdeliveryPrice + extra + wormholeFee.publishAndPaypublishes the instruction and pays the provider that quote.- Governance
verifyAndConsumeGovernanceVMrequires a valid VAA from the coregovernanceChainId/governanceContract, then consumesvm.hash. Module must beWormholeRelayer. This contract does not custody user tokens.
Do not file a guardian-gated delivery or an exact-value send as stranger theft.
Not submitted. Payment requires user KYC. Official Wormhole GitHub + Relayer assets are leftover-logged. Remaining listed: Filecoin remaining go-* / lotus (avoid collision).
2026-09-03: Filecoin leftover remaining lotus paych leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after neptune-triton leftover. Official sparse clone /tmp/filecoin-lotus at 7740217 (chore: update nv29 codename (#13748)), paychmgr. Opened manager.go and paych.go. Local payment-channel manager. Does not move FIL without a wallet-signed mpool message. Do not rematch lotus miner leftover. No mainnet writes. No exploit PoCs.
Checked for: createVoucher signing with a stranger Control key; checkVoucherValid accepting a voucher for a different channel or a lower nonce/amount; SubmitVoucher / Settle / Collect pushing from an address this wallet does not control.
Result: no user-exploitable finding. Not submitted.
createVoucherloads the tracked channel, assignsnextNonceForLane, andWalletSigns withci.Control.checkVoucherValidUnlockedrequiresChannelAddr == ch, no Extra/TimeLock/SecretHash,sigs.Verifyagainst the on-chain From, nonce>lane nonce, amount>redeemed, andtotalRedeemed <= actor balance.- Inbound
AddVoucherrequiresWalletHasthe To/Control key.SubmitVoucherrejects aproofpayload and already-submitted vouchers;Update/Settle/CollectareMpoolPushMessaged fromci.Control. - This manager is a wallet-local helper. On-chain paych Update/Settle/Collect remain in already-logged builtin-actors.
Do not file a Control-signed voucher helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining StableDebtToken leftover (782f519)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after v3 Pool leftover. Official aave/aave-v3-core 782f519 (chore: deprecate for 3.1 origin). Opened listed StableDebtToken.sol plus DebtTokenBase / IncentivizedERC20 onlyPool. Do not rematch Pool / Supply / Borrow / VariableDebt leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger mint of stable debt onto another user; burn of someone else's debt without Pool; ERC-20 transfer of debt tokens.
Result: no user-exploitable finding. Not submitted.
mint/burnareonlyPool(msg.sender == POOL). Ifuser != onBehalfOf,mint_decreaseBorrowAllowance(underflow-reverts without delegation).- Accrued interest is compounded into principal on mint/burn. Last-repayer supply underflow zeros
_avgStableRate/_totalSupplyrather than minting a stranger credit. transfer/approve/transferFrom/ allowance mutators revertOPERATION_NOT_SUPPORTED. This token does not move underlying.
Do not file a Pool-gated non-transferable debt token as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PoolConfigurator / ACL / oracles / periphery / rewards / GHO instances.
2026-09-03: Filecoin leftover remaining lotus wallet leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus mpool leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/wallet. Opened wallet.go, key/key.go, multi.go, and remotewallet/remote.go. Local / multi-backend keystore only. Does not move FIL. Do not rematch lotus miner / paych / mpool leftovers. No mainnet writes. No exploit PoCs.
Checked for: WalletSign signing for an address not in the keystore; NewKey binding a secp/BLS/delegated address to a different pubkey; MultiWallet routing a sign to a backend that does not WalletHas the signer.
Result: no user-exploitable finding. Not submitted.
LocalWallet.WalletSignfindKeyswallet-{addr}(then the testnet-prefix alias) andsigs.Signs only that key. Missing key isErrKeyInfoNotFound.NewKeyderives the address fromsigs.ToPublic(secp / BLS / delegated FIP-0055).MultiWallet.WalletSign/WalletExportpick the first backend thatWalletHasthe address. Remote is a JSON-RPC wrapper with the configured auth header. Ledger keys are not exported.- This crate does not broadcast messages. Mpool leftover already requires
VerifyMsgSig.
Do not file a keystore that signs only keys it holds as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining GHO token leftover (23859bb)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after StableDebtToken leftover. Official aave-dao/gho-origin 23859bb. Opened listed GhoToken.sol and UpgradeableGhoToken.sol. Official GhoOracle.so URL 404 (truncated). Do not rematch Pool / StableDebt leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger mint of GHO without a facilitator bucket; addFacilitator without the manager role; burn that credits a stranger bucket.
Result: no user-exploitable finding. Not submitted.
mintreads_facilitators[msg.sender]. Capacity 0 (unregistered) failsFACILITATOR_BUCKET_CAPACITY_EXCEEDED. Amount must be > 0. Level isuint128.burnsubtractsmsg.sender's bucket level (underflow-reverts) and_burns the caller.addFacilitator/removeFacilitatorareonlyRole(FACILITATOR_MANAGER_ROLE). Remove requiresbucketLevel == 0.setFacilitatorBucketCapacityisonlyRole(BUCKET_MANAGER_ROLE).
Do not file a bucket-capped facilitator mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PoolConfigurator / ACL / oracles / periphery / rewards / GSM.
2026-09-03: Filecoin leftover remaining lotus sync leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus wallet leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain sync + chain/consensus. Opened sync.go ValidateMsgMeta / ValidateBlock and consensus/filcns/filecoin.go ValidateBlock plus consensus/signatures.go. Do not rematch lotus miner / paych / mpool / wallet leftovers. No mainnet writes. No exploit PoCs.
Checked for: a full block whose message CIDs do not match the header Messages root still validating; a block from a non-winner or slashed miner accepted; AuthenticateMessage verifying a delegated signature against a reconstructed message that does not equal the signed FIL message.
Result: no user-exploitable finding. Not submitted.
ValidateMsgMetarebuilds the BLS/secp message AMT in a temp store and requires the CID equalHeader.Messages.ValidateBlockdelegates toFilecoinEC.ValidateBlock.ValidateBlocksanity-checks election proof / ticket / block sig / BLS aggregate / ID miner, parent height+timestamp, parent weight,minerIsValid, worker-signed election VRF + ticket VRF,WinCount, slashed-miner reject, WinningPoSt, beacon, andverifyBlockSignatureof the worker. Bad blocks are denylisted.AuthenticateMessagefor delegated txs reconstructs the ETH tx, requires a Filecoin-message roundtripEquals, thensigs.Verifys the RLP digest. Default path verifiesMessage.Cid()against the signer.
Do not file a worker-VRF + message-root + signature-bound block validator as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining GHO GSM leftover (23859bb)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after GHO token leftover. Official aave-dao/gho-origin 23859bb. Opened listed Gsm.sol, GhoReserve.sol, and FixedPriceStrategy.sol. Do not rematch GhoToken leftover. No mainnet writes. No exploit PoCs.
Checked for: buyAsset paying less GHO than the fixed ratio; sellAsset drawing GHO without a reserve limit; GhoReserve.use by a non-entity.
Result: no user-exploitable finding. Not submitted.
buyAsset/sellAssetarenotFrozen/notSeized. BuytransferFroms the originator's GHO,restores gross to the reserve, and sends underlying only if_currentExposurecovers it. Sell pulls underlying,uses gross GHO, and respects_exposureCap.- Quotes use
FixedPriceStrategyWAD ratio. Buy rounds GHO cost up, then asset down; sell rounds GHO down, then asset up. Fees accrue separately and are not rescuable as GHO inventory. GhoReserve.userequireslimit >= used + amountformsg.sender(unregistered limit is 0).addEntity/setLimit/transferare role-gated.rescueTokens/seize/ freeze / fee updates are role-gated.
Do not file a capped fixed-ratio GSM swap as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PoolConfigurator / ACL / oracles / periphery / rewards.
2026-09-03: Aave leftover remaining AaveOracle leftover (cff15de)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after GHO GSM leftover. Official aave-dao/aave-v3-origin cff15de. Opened listed AaveOracle.sol. Official PriceOracleSentinel.sol 404 on this pin. Do not rematch Pool / GHO leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger setAssetSources pointing an asset at a fake aggregator; getAssetPrice returning 0 so a healthy position liquidates.
Result: no user-exploitable finding. Not submitted.
setAssetSources/setFallbackOracleareonlyAssetListingOrPoolAdminsviaACLManager.isAssetListingAdmin/isPoolAdmin.getAssetPricereturnsBASE_CURRENCY_UNITfor the base asset. A configured Chainlink source is used only iflatestAnswer() > 0; otherwise (or if the source isaddress(0)) it forwards to the fallback oracle. This contract does not move tokens.
Do not file an ACL-gated source update as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PoolConfigurator / ACL / periphery / rewards. Official PriceOracleSentinel 404 on cff15de.
2026-09-03: Filecoin leftover remaining lotus stmgr leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus sync leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/stmgr. Opened call.go, execute.go, stmgr.go, and actors.go. State-manager simulation / tipset execution. Does not persist a stranger Call. Do not rematch FVM / lotus miner / sync leftovers. No mainnet writes. No exploit PoCs.
Checked for: Call / CallWithGas writing a simulated send onto the chain blockstore; skipSenderValidation minting a real account; ValidateChain accepting a tipset whose computed state does not match ParentState.
Result: no user-exploitable finding. Not submitted.
callInternalruns on aTieredBstoreover a memory overlay. Missing-sender placeholder is an implicit System→From send of 0; the comment states it is never persisted. Gas estimation uses dummy 65-byte secp/delegated signatures.CallwithoutcheckGasisApplyImplicitMessage.TipSetStatereturns cached / looked-up parent state+receipts when the next tipset is on the same fork and both roots exist; otherwiseExecuteTipSet.ValidateChainwalks to genesis and requires each tipset'sParentStateequal the previously computed root.actors.goloaders (GetMinerWorkerRaw,GetPaychState,MarketBalance) read actor state only.
Do not file an in-memory eth_call / gas-estimate helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining ACL + PoolConfigurator leftover (cff15de)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after AaveOracle leftover. Official aave-dao/aave-v3-origin cff15de. Opened listed ACLManager.sol and PoolConfigurator.sol. Do not rematch Pool / Oracle leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger addPoolAdmin / grantRole without DEFAULT_ADMIN; initReserves or configureReserveAsCollateral without ACL.
Result: no user-exploitable finding. Not submitted.
ACLManagerconstructor_setupRole(DEFAULT_ADMIN_ROLE, provider.getACLAdmin())(non-zero).addPoolAdmin/addRiskAdmin/addAssetListingAdmincall OZgrantRole, which isonlyRole(getRoleAdmin(role))(defaultDEFAULT_ADMIN_ROLE).setRoleAdminisonlyRole(DEFAULT_ADMIN_ROLE).PoolConfiguratorinitReservesisonlyAssetListingOrPoolAdmins. Collateral / caps / eMode / IR data areonlyRiskOrPoolAdmins. Pause / freeze mix emergency. aToken / vDebt upgrades areonlyPoolAdmin. LTV must be<=threshold; bonus checks prevent instant under-collateralized listing. This contract does not move user tokens itself.
Do not file an ACL-gated configurator as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: periphery / rewards.
2026-09-03: Aave leftover remaining RewardsController leftover (cff15de)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after ACL + PoolConfigurator leftover. Official aave-dao/aave-v3-origin cff15de. Opened listed RewardsController.sol and EmissionManager.sol. Do not rematch Pool / ACL leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger claimRewardsOnBehalf without an authorized claimer; configureAssets without an emission admin; handleAction rewriting another asset's accrued rewards.
Result: no user-exploitable finding. Not submitted.
claimRewards/claimAllRewardscreditmsg.sender. On-behalf variants areonlyAuthorizedClaimers. Accrual usesgetScaledUserBalanceAndSupplyon each asset, not caller-supplied balances.configureAssets/ transfer-strategy / oracle updates on the controller areonlyEmissionManager.EmissionManager.configureAssets/setEmissionPerSecondrequire_emissionAdmins[reward] == msg.sender.setClaimer/setEmissionAdminareonlyOwner.handleActionkeys updates bymsg.sender(the aToken). A stranger call cannot rewrite a real aToken's reward index.
Do not file an emission-admin-gated rewards claim as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: periphery.
2026-09-03: Aave leftover remaining Collector leftover (308489d)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after RewardsController leftover. Official bgd-labs/aave-collector-unification 308489d (Collector.sol REVISION 5). Opened listed src/contracts/Collector.sol plus VersionedInitializable / ReentrancyGuard / ICollector. Do not rematch Pool / Oracle / ACL / GHO / rewards leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger approve / transfer / createStream without funds admin; withdrawFromStream paying a caller more than vested; initialize rewriting _fundsAdmin on a live revision.
Result: no user-exploitable finding. Not submitted.
approve/transfer/createStream/setFundsAdminareonlyFundsAdmin. ETHtransferusesETH_MOCK_ADDRESS+sendValue; ERC20 usessafeTransfer.receive()only accepts ETH.createStreamdoes not pull tokens (inventory is already in the collector). It requiresdeposit % duration == 0,deposit >= duration, future start, and a recipient that is not 0 / this / caller. Sender isaddress(this). Over-allocation versus token cash is an admin misconfiguration; latersafeTransferreverts.withdrawFromStreamisnonReentrant+onlyAdminOrRecipient. Amount is capped bybalanceOfrecipient (streameddelta * rateminus prior withdrawals). Tokens always go tostream.recipient, notmsg.sender. Zero remaining deletes the stream.cancelStreamis the same gate. Recipient is paid vested only; unvestedsenderBalancestays in the collector.balanceOfsender isremainingBalance - recipientBalance;deltasaturates at the stream window so recipient cannot exceed deposit.initializeisVersionedInitializable(revision > lastInitializedRevision).REVISION = 5. After first init, re-init fails until a higher-revision implementation is upgraded._initGuardsets the proxy reentrancy status.
Do not file an admin-gated treasury stream as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: L2Encoder / PriceOracleSentinel / stk / StakeToken / GHO remaining (FixedFee / flash minter / Gsm4626) / governance.
2026-09-03: Aave leftover remaining L2Encoder leftover (cff15de)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after Collector leftover. Official aave-dao/aave-v3-origin cff15de. Opened listed src/contracts/helpers/L2Encoder.sol. Do not rematch Pool / Oracle / ACL / rewards / Collector leftovers. Other-agent view helpers / WrappedTokenGateway leftovers are separate files. No mainnet writes. No exploit PoCs.
Checked for: encoder writing Pool state or moving tokens; compact type(uint256).max withdraw/repay packing a truncated amount that L2Pool would treat as a partial pull.
Result: no user-exploitable finding. Not submitted.
- Every
encode*function isview. The only stored value is immutablePOOL. Calls onlyPOOL.getReserveData(asset)to readid. - Amounts use OZ
SafeCasttouint128(revert on overflow).type(uint256).maxwithdraw / repay / liquidation debt maps totype(uint128).maxfor the L2Pool compact convention. Permitdeadlineisuint32;interestRateModeisuint8. - Supply / borrow / repay encodings omit
onBehalfOf/tobecause L2Pool usesmsg.sender. This helper does not call the Pool.
Do not file a calldata-packing view helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PriceOracleSentinel / stk / StakeToken / GHO remaining (FixedFee / flash minter / Gsm4626) / governance.
2026-09-03: Aave leftover remaining GHO FixedFeeStrategy leftover (23859bb)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after L2Encoder leftover. Official aave-dao/gho-origin 23859bb. Opened listed src/contracts/facilitators/gsm/feeStrategy/FixedFeeStrategy.sol. Do not rematch GSM buyAsset / sellAsset leftover or FixedPriceStrategy. No mainnet writes. No exploit PoCs.
Checked for: view fee math returning a negative fee or a gross that lets a GSM caller extract more GHO than the fixed price; constructor allowing a 100% fee that zeros the other side.
Result: no user-exploitable finding. Not submitted.
_buyFee/_sellFeeare immutable. Constructor requires each< 5000bps and at least one nonzero. This contract does not hold or move tokens.getBuyFee/getSellFeearemulDivceil ofgross * fee / 1e4.getGrossAmountFromTotalBoughtfloorstotal * 1e4 / (1e4 + buyFee)(zero fee returnstotal).getGrossAmountFromTotalSoldceilstotal * 1e4 / (1e4 - sellFee). Rounding favors the GSM inventory, not the caller.- Fee updates require a new strategy deployment plus the GSM admin setter (role-gated on the GSM leftover).
Do not file immutable bps fee quotes as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PriceOracleSentinel / stk / StakeToken / GHO remaining (flash minter / Gsm4626 / OwnableFacilitator) / governance.
2026-09-03: Aave leftover remaining GHO FlashMinter leftover (23859bb)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after FixedFee leftover. Official aave-dao/gho-origin 23859bb. Opened listed src/contracts/facilitators/flashMinter/GhoFlashMinter.sol. Do not rematch GhoToken facilitator-bucket leftover or GSM leftovers. No mainnet writes. No exploit PoCs.
Checked for: flashLoan leaving minted GHO with the receiver; a non-GHO token mint; updateFee / updateGhoTreasury without pool admin.
Result: no user-exploitable finding. Not submitted.
flashLoanrequirestoken == address(GHO_TOKEN). Itmintsamounttoreceiver, requiresonFlashLoanto returnCALLBACK_SUCCESS, thentransferFromsamount + feeandburnsamount. Fee GHO stays on the minter untildistributeFeesToTreasury. A failed repay reverts the mint.- Fee is
_feebps (percentMul) unlessACL_MANAGER.isFlashBorrower(msg.sender), then 0.maxFlashLoanis this facilitator’s remaining GHO bucket (capacity - level). updateFee/updateGhoTreasuryareonlyPoolAdmin(ACL_MANAGER.isPoolAdmin). Constructor and setter cap fee atMAX_FEE(10000 bps).distributeFeesToTreasuryis permissionless and only forwards the minter’s GHO balance to_ghoTreasury.
Do not file an EIP-3156 GHO flash mint that pulls amount + fee as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PriceOracleSentinel / stk / StakeToken / Gsm4626 / OwnableFacilitator / governance.
2026-09-03: Filecoin leftover remaining lotus store leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus stmgr leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/store. Opened store.go and messages.go. Local heaviest-tipset / checkpoint / message blockstore. Does not persist a stranger PutMessage onto consensus. Do not rematch FVM / lotus miner / sync / stmgr leftovers. No mainnet writes. No exploit PoCs.
Checked for: RefreshHeaviestTipSet adopting a fork past policy.ChainFinality; SetCheckpoint reverting more than finality; SetHead being stranger-callable; PutMessage rewriting a CID to a different message.
Result: no user-exploitable finding. Not submitted.
RefreshHeaviestTipSetonly callstakeHeaviestTipSetwhen the candidate is heavier (or a weight-tie broken bybreakWeightTie) andexceedsForkLengthis false.exceedsForkLengthwalks at mostpolicy.ChainFinalitytipsets on the synced side, rejects a walk past checkpoint or genesis without a common ancestor, and treats a missing common ancestor as exceeding.SetCheckpointrefuses a target that does not share an ancestor with the current head withinheaviest.Height() - policy.ChainFinality. The new checkpoint must already be synced. If the target is not an ancestor of the current head, it switches head to that already-synced tipset.SetHeadis a local admin repair: itremoveCheckpoints thentakeHeaviestTipSet. It is not a stranger RPC.ForceHeadSilentis documented test-only.PutMessageis CID content-addressedblockstore.PutofToStorageBlock().GetMessage/GetSignedMessagedecode the bytes at that CID. A different payload is a different CID.
Do not file a local heaviest-tipset / checkpoint helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining StakedAaveV3 leftover (0c4cb0b)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after Gsm4626 leftover. Official bgd-labs/aave-stk-gov-v3 0c4cb0b. Opened listed src/contracts/StakedAaveV3.sol (REVISION 6) plus parent StakedTokenV3._claimRewardsAndStakeOnBehalf for the claim-and-stake entry points. Do not rematch GHO / GSM leftovers. Full bgd-labs/stake-token StakeToken.sol is a separate listed asset. No mainnet writes. No exploit PoCs.
Checked for: stranger claimRewardsAndStakeOnBehalf without the claim helper; implementation initialize rewriting storage; GHO discount hook transferring stkAAVE.
Result: no user-exploitable finding. Not submitted.
- Constructor sets
lastInitializedRevision = REVISION()(6), brickinginitializeon the implementation. Proxyinitialize()is an emptyinitializer. claimRewardsAndStakestakesmsg.sender’s rewards toto.claimRewardsAndStakeOnBehalfisonlyClaimHelper. Parent requiresREWARD_TOKEN == STAKED_TOKEN, claims to the contract, then_stake(address(this), to, amount)._afterTokenTransfercallsghoDebtToken.updateDiscountDistributionwith a 220k gas cap. A failed hook is swallowed when the caller supplied enough gas; it does not move stk/AAVE.ghoDebtTokenis not set in this file (storage leftover from a prior initializer).
Do not file a self-stake rewards helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PriceOracleSentinel / StakeToken / OwnableFacilitator / governance.
2026-09-03: Aave leftover remaining StakeToken leftover (5346765)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after StakedAaveV3 leftover. Official bgd-labs/stake-token 5346765. Opened listed src/contracts/StakeToken.sol. Do not rematch aave-stk-gov-v3 StakedAaveV3 leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger redeemOnBehalf / claimRewardsOnBehalf without the claim helper; slash without slashing admin; returnFunds minting shares to the caller; redeem skipping cooldown outside a slashing window.
Result: no user-exploitable finding. Not submitted.
stake/redeem/claimRewards/claimRewardsAndRedeemact onmsg.sender.*OnBehalfvariants areonlyClaimHelper.stakeWithPermitstill pullsSTAKED_TOKENfrommsg.sender._stakemintspreviewStakeshares thentransferFroms assets._redeemrequires cooldown +UNSTAKE_WINDOW, except duringinPostSlashingPeriod(full balance). Assets out arepreviewRedeem.slashisonlySlashingAdmin, capped by_maxSlashablePercentage, leavesLOWER_BOUNDassets, and flipsinPostSlashingPeriod.settleSlashing/setMaxSlashablePercentageare the same admin.setCooldownSecondsis cooldown admin.returnFundsis permissionless donate (>= LOWER_BOUND): it updates the exchange rate thentransferFroms the caller._getExchangeRaterounds up (shares per asset) so redeem rounding favors the vault.initializeis OZinitializer(once). Rewards pull fromREWARDS_VAULTviasafeTransferFrom.
Do not file a cooldown-gated stake/redeem token as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PriceOracleSentinel / OwnableFacilitator / governance.
2026-09-03: Filecoin leftover remaining lotus node leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus store leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, node/impl. Opened full/multisig.go, full/wallet.go, full/gas.go, full/mpool.go, common/common.go, and backup.go. Node JSON-RPC wrappers. Do not rematch lotus market / eth / paych / wallet / mpool / store leftovers. No mainnet writes. No exploit PoCs.
Checked for: MsigPropose / MsigApprove spending a multisig without a local key; WalletSign signing an address this node does not hold; MpoolPushMessage sending a stranger From; backup writing outside LOTUS_BACKUP_BASE_PATH.
Result: no user-exploitable finding. Not submitted.
- Every
Msig*helper returns aMessagePrototype(From=src,ValidNonce=false). It does not sign orMpoolPush. On-chain approve still requires the leftover-logged builtin-actors threshold. WalletSign/WalletSignMessageresolve an ID to a deterministic key and call leftover-loggedWallet.WalletSign(keystore-only).MpoolPush/MpoolPushUntrustedrequire a signed message plussanityCheckOutgoingMessage.MpoolPushMessageestimates gas, requires nonce 0 and localFromfunds, thenMessageSigner.SignMessage(local key) before push.GasEstimateMessageGasonly fills gas fields andCapGasFee.backuprequiresLOTUS_BACKUP_BASE_PATHandHasPrefixof the dest path.AuthNewis JWT-signed withAPISecretand is admin-gated at the RPC layer.
Do not file an unsigned MessagePrototype helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining governance-v3 leftover (497226e)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after StakeToken leftover. Official bgd-labs/aave-governance-v3 497226e. Opened listed Governance.sol, Executor.sol, and PayloadsController.sol plus parents GovernanceCore / PayloadsControllerCore for queue/execute. Do not rematch GHO / stk leftovers. Official PriceOracleSentinel.sol and OwnableFacilitator.sol 404 on the listed pins. No mainnet writes. No exploit PoCs.
Checked for: stranger executeTransaction on Executor; receiveCrossChainMessage queuing from a fake origin; executeProposal forwarding before a passing vote.
Result: no user-exploitable finding. Not submitted.
Executor.executeTransactionisonlyOwner. Itcalls /delegatecalls the queued target.receive()only accepts ETH.PayloadsController.receiveCrossChainMessagerequiresmsg.sender == CROSS_CHAIN_CONTROLLER,originSender == MESSAGE_ORIGINATOR, andoriginChainId == ORIGIN_CHAIN_ID. Decode failure emits and does not queue._queuePayloadrequires Created,accessLevel >= maximumAccessLevelRequired, andproposalVoteActivationTimestamp > createdAt.createPayloadis permissionless registration only.executePayloadrequires Queued andtimestamp > queuedAt + delay, then each action runs through the access-level Executor.cancelPayload/updateExecutorsare guardian / owner.Governance.createProposalrequires an approved voting portal, cancellation-feemsg.value, and min proposition power.queueProposalis only the proposal’s approved portal after the vote window, and only Queued if yes-threshold + differential still pass.executeProposalis permissionless afterCOOLDOWN_PERIODand still-valid creator power; it only_forwardPayloadForExecutionvia immutableCROSS_CHAIN_CONTROLLER.updateGasLimitisonlyOwner.initializeis OZinitializer;initializeWithRevisionisreinitializer(3).
Do not file a vote-gated cross-chain payload execute as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: VotingMachine / DataWarehouse / GovernancePowerStrategy / CCIP GHO pools. Official PriceOracleSentinel + OwnableFacilitator 404.
2026-09-03: Aave leftover remaining governance voting leftover (497226e)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after governance-v3 leftover. Official bgd-labs/aave-governance-v3 497226e. Opened listed VotingMachine.sol, GovernancePowerStrategy.sol, and DataWarehouse.sol. Do not rematch Governance / Executor / PayloadsController leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger receiveCrossChainMessage starting a vote from a fake portal; processStorageRoot writing an unproven account root; getFullPropositionPower returning caller-supplied balances.
Result: no user-exploitable finding. Not submitted.
VotingMachine.receiveCrossChainMessagerequiresmsg.sender == CROSS_CHAIN_CONTROLLER,originSender == L1_VOTING_PORTAL, andoriginChainId == L1_VOTING_PORTAL_CHAIN_ID. OnlyMessageType.Proposalcalls_createBridgedProposalVote. Decode failures emit and do not create.updateGasLimitisonlyOwner. Results go back through the same CCC to the L1 portal.DataWarehouse.processStorageRoot/processStorageSlotrequire a block header whose hash matchesblockHashand an MPT proof of that account/slot. Non-existent roots/slots revert. This contract does not mint voting power.GovernancePowerStrategyis view-only: it sumsgetPowerCurrenton the configured voting assets. It does not move tokens.
Do not file an origin-checked vote bridge or proven storage root as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: VotingStrategy / CCIP GHO pools. Official PriceOracleSentinel + OwnableFacilitator 404.
2026-09-03: Filecoin leftover remaining lotus vm leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus node leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/vm. Opened vm.go, runtime.go, fvm.go, invoker.go, and execution.go. Message apply / transfer / invoke. Do not rematch FVM leftover or lotus stmgr leftover. No mainnet writes. No exploit PoCs.
Checked for: ApplyMessage debiting a non-account From; transfer of a negative amount; ApplyMessageSkipSenderValidation persisting a simulated send; Invoke of an unregistered code CID.
Result: no user-exploitable finding. Not submitted.
LegacyVM.ApplyMessagerequirescheckMessage, an account-actor sender, matching nonce, andBalance >= GasLimit * GasFeeCap. It pulls that gas into a holder, increments nonce, snapshots, thensend. On a non-zero exit itReverts the snapshot. Gas leftover is burned / tipped / refunded until the holder is 0.transferrejectsamt < 0andBalance < amt. Self-send after ID resolve is a noop.Runtime.Sendsnapshots and reverts a failed subcall;StateTransactionsetsallowInternal=falseso nestedSendaborts.ApplyMessageSkipSenderValidationis unsupported on LegacyVM. On FVM it isApplyImplicitMessagefor eth_call / estimate only (stmgr leftover already keeps that on a memory overlay). ConsensusApplyMessageserializes into leftover-logged FVM.ActorRegistry.Invokerequires a registered code CID and a version predicate.vmExecutoris a lane token around the same Interface.
Do not file an account-gated, snapshot-reverted apply as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Filecoin leftover remaining lotus events leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus vm leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/events. Opened events.go, observer.go, filter/event.go, and filter/mempool.go. Local tipset / actor-event observers. Do not rematch lotus eth leftover or lotus stmgr leftover. No mainnet writes. No exploit PoCs.
Checked for: EventFilterManager.Apply accepting a stranger-supplied event log; MemPoolFilter rewriting a signed message; observer moving FIL on a head change.
Result: no user-exploitable finding. Not submitted.
observer.listenHeadChangesOnceconsumes leftover-loggedChainNotify.Apply/Revertare local callbacks. GC confidence is2 * policy.ChainFinality.EventFilterManager.ApplybuildsTipSetEventsfrom the appliedfrom/totipsets andloadExecutedMessages. Filters onlyCollectEvents. Historic fill requires the chain indexer whenminHeight < currentHeight.MemPoolFilter.CollectMessagestores or fans out an already-signed message to a local subscriber channel. It does notMpoolPushor resign.
Do not file a local event observer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining CCIP GHO pools leftover (d5c6ced)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after VotingStrategy leftover. Official aave/ccip d5c6cedde6fbca9890a92a55f2db80e94793d0ec. Opened listed UpgradeableLockReleaseTokenPool.sol and UpgradeableBurnMintTokenPool.sol plus parents UpgradeableTokenPool / UpgradeableBurnMintTokenPoolAbstract for ramp checks. Do not rematch GHO token / FlashMinter leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger releaseOrMint / lockOrBurn without being a router ramp; directMint without owner; withdrawLiquidity without the rebalancer.
Result: no user-exploitable finding. Not submitted.
lockOrBurn/releaseOrMintcall_validateLockOrBurn/_validateReleaseOrMint: supported token, RMN not cursed, allowlist (if enabled),_onlyOnRamp/_onlyOffRamp(s_router.getOnRamp/isOffRamp), and inbound/outbound rate limits. Release also requires a configured remote source pool.- LockRelease increments
s_currentBridgedagainsts_bridgeLimiton lock and decrements on release (reverts ifamount > s_currentBridged). ItsafeTransfers the decimal-adjusted local amount toreceiver.provideLiquidity/withdrawLiquidityares_rebalanceronly.setBridgeLimitis owner ors_bridgeLimitAdmin.setCurrentBridgedAmount/setRebalancer/transferLiquidityareonlyOwner. - BurnMint
lockOrBurnburns after the same ramp check;releaseOrMintmints toreceiver.directMint/directBurnareonlyOwner(facilitator migration).initializeis OZinitializeron both pools.
Do not file a router-ramp-gated CCIP lock/mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: none on official Aave GitHub assets that still 200 (PriceOracleSentinel + OwnableFacilitator 404).
2026-09-03: Aave leftover remaining UpgradeableGhoToken leftover (23859bb)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after CCIP leftover. Official aave-dao/gho-origin 23859bb. Opened listed src/contracts/gho/UpgradeableGhoToken.sol. Do not rematch non-upgradeable GhoToken leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger mint without a facilitator bucket; initialize rewriting admin on a live proxy; addFacilitator without FACILITATOR_MANAGER_ROLE.
Result: no user-exploitable finding. Not submitted.
initializeisinitializerand grantsDEFAULT_ADMIN_ROLEonce. Constructor only sets 18 decimals.mintcreditsaccountonly ifmsg.sender’s facilitatorbucketCapacity >= bucketLevel + amount. An address never added has capacity 0.burnburnsmsg.sender’s GHO and decreases that facilitator’s level (underflow if level is 0).addFacilitator/removeFacilitatorareonlyRole(FACILITATOR_MANAGER_ROLE)(remove requires level 0).setFacilitatorBucketCapacityisonlyRole(BUCKET_MANAGER_ROLE).
Do not file a facilitator-bucket mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: protocol-v2 / upgradeability proxies. Official PriceOracleSentinel + OwnableFacilitator 404.
2026-09-03: Aave leftover remaining upgradeability leftover (cff15de / 7a7548c)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after UpgradeableGhoToken leftover. Official aave-dao/aave-v3-origin cff15de upgradeability helpers plus pinned bgd-labs/solidity-utils 7a7548c TransparentUpgradeableProxy.sol. Opened listed BaseImmutableAdminUpgradeabilityProxy.sol, InitializableImmutableAdminUpgradeabilityProxy.sol, VersionedInitializable.sol, and TransparentUpgradeableProxy.sol. Do not rematch Pool / L2Pool leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger upgradeTo / upgradeToAndCall without admin; admin-fallback executing implementation logic as the proxy admin; initializer re-running on a live revision.
Result: no user-exploitable finding. Not submitted.
BaseImmutableAdminUpgradeabilityProxystores_adminimmutably.upgradeTo/upgradeToAndCall/admin/implementationareifAdmin(non-admin_fallbacks)._willFallbackreverts ifmsg.sender == _admin.InitializableImmutableAdminUpgradeabilityProxyonly wires that fallback override onto the OZ initializable proxy.VersionedInitializableconstructor setslastInitializedRevision = getRevision(), bricking the implementation. Proxyinitializerrequiresrevision > lastInitializedRevision(or constructor / nested init).TransparentUpgradeableProxyis the OZ transparent pattern:changeAdmin/upgradeTo/upgradeToAndCallareifAdmin; admin cannot fallback.
Do not file an admin-gated proxy upgrade as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: protocol-v2 LendingPool / configurator / collateral manager / v2 tokens.
2026-09-03: Aave leftover remaining protocol-v2 AddressesProvider leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after upgradeability leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/configuration/LendingPoolAddressesProvider.sol. Do not rematch v3 PoolAddressesProvider / ACL leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger setLendingPoolImpl / setAddress without owner; _updateImpl letting a non-owner become proxy admin.
Result: no user-exploitable finding. Not submitted.
- Every setter (
setAddress,setAddressAsProxy,setLendingPoolImpl,setLendingPoolConfiguratorImpl,setLendingPoolCollateralManager,setPoolAdmin,setEmergencyAdmin,setPriceOracle,setLendingRateOracle,setMarketId) isonlyOwner. _updateImpldeploysInitializableImmutableAdminUpgradeabilityProxywithaddress(this)as immutable admin, orupgradeToAndCallsinitialize(address)on the existing proxy. Collateral manager is a hard address replace (not a proxy), stillonlyOwner.- This registry does not move user tokens.
Do not file an owner-gated address registry as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: protocol-v2 LendingPool / LendingPoolConfigurator / LendingPoolCollateralManager / v2 AToken / debt tokens / v2 AaveOracle.
2026-09-03: Aave leftover remaining protocol-v2 LendingPool leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after AddressesProvider leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/lendingpool/LendingPool.sol. Do not rematch v3 Pool / AddressesProvider leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger withdraw of another user’s aTokens; borrow opening debt on onBehalfOf without that user’s position checks; flashLoan keeping funds when mode is 0; finalizeTransfer / initReserve from a non-aToken / non-configurator.
Result: no user-exploitable finding. Not submitted.
depositsafeTransferFromsmsg.senderand mints aTokens toonBehalfOf.withdrawburnsmsg.sender’s aTokens aftervalidateWithdraw(HF) and sends underlying toto.borrow/ flash-loan debt open call_executeBorrow:validateBorrowagainstonBehalfOf’s config and the price oracle, then stable/variable debtmint(user=msg.sender, onBehalfOf). Underlying is released tovars.user(msg.sender). Credit delegation foruser != onBehalfOfis enforced on the leftover-listed debt tokens.repaypullspaybackAmountfrommsg.senderand burnsonBehalfOf’s debt (intended donate-repay).flashLoantransfers underlying to the receiver, requiresexecuteOperation, then eithersafeTransferFromsamount + 9 bpsback or_executeBorrows. Mode 0 cannot keep funds.liquidationCalldelegatecalls the AddressesProvider collateral manager.finalizeTransferrequiresmsg.sender == aToken.initReserve/setConfiguration/setPauseareonlyLendingPoolConfigurator.initializeisVersionedInitializable.
Do not file a validate-gated v2 pool action as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: LendingPoolConfigurator / LendingPoolCollateralManager / v2 AToken / debt tokens / v2 AaveOracle.
2026-09-03: Aave leftover remaining protocol-v2 CollateralManager leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after LendingPool leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/lendingpool/LendingPoolCollateralManager.sol. Do not rematch LendingPool leftover. No mainnet writes. No exploit PoCs.
Checked for: liquidation of a healthy HF>=1 position; collateral seized without the liquidator paying debt; close factor letting a caller take more than 50% of debt when HF is only slightly below 1.
Result: no user-exploitable finding. Not submitted.
- This contract is
delegatecalled from leftover-loggedLendingPool.liquidationCalland sharesLendingPoolStorage. Standalone calls would use empty storage. liquidationCallcomputes HF viaGenericLogic.calculateUserAccountDataandValidationLogic.validateLiquidationCall(HF < 1, collateral enabled, debt exists). Max debt is 50% close factor. Collateral out is oracle-priced with the reserve liquidation bonus and capped by the user’s aToken balance.- Variable debt is burned first, then stable. Liquidator
safeTransferFromsactualDebtToLiquidateof the debt asset to the debt aToken. Collateral is eithertransferOnLiquidationof aTokens orburnof aTokens sending underlying tomsg.sender. getRevisionis 0;initializeis never invoked on this implementation.
Do not file a HF-gated close-factor liquidation as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: LendingPoolConfigurator / v2 AToken / debt tokens / v2 AaveOracle.
2026-09-03: Filecoin leftover remaining lotus genesis leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus events leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/gen. Opened genesis/genesis.go, genesis/f02_reward.go, gen.go, and slashfilter/slashfilter.go. Bootstrap template / test chain-gen / local slash filter. Do not rematch lotus miner leftover or builtin-actors leftover. No mainnet writes. No exploit PoCs.
Checked for: MakeInitialStateTree minting accounts outside the template; SetupRewardActor setting a stranger-chosen reward balance; ChainGen fake verifier applying on a live node; SlashFilter.MinedBlock slashing a miner this node does not control.
Result: no user-exploitable finding. Not submitted.
MakeInitialStateTree/CreateAccountActortake balances fromgenesis.Template. Reward actor balance isbuildconstants.InitialRewardBalance. This is bootstrap construction, not a stranger RPC.MakeGenesisBlockpins the Filecoin genesis parent CID (bafyrei…honoi) viaexpectedCid()/getGenesisBlock(). A mismatched CID fails closed.ChainGenis a local test generator (genFakeVerifieralways returns true). It is not consensus validation.SlashFilter.MinedBlockis a local datastore of this node’s own mined headers. A fault CID is a witness for a later signed report, not an on-chain slash by itself.
Do not file a template-driven genesis builder as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining protocol-v2 Configurator leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after CollateralManager leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/lendingpool/LendingPoolConfigurator.sol. Do not rematch LendingPool / AddressesProvider leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger batchInitReserve / configureReserveAsCollateral without pool admin; LTV > threshold listing that instant-liquidates; setPoolPause without emergency admin.
Result: no user-exploitable finding. Not submitted.
onlyPoolAdminrequiresaddressesProvider.getPoolAdmin() == msg.sender. That gate covers init / token upgrades / borrow enable / collateral params / freeze / reserve factor / IR strategy.setPoolPauseisonlyEmergencyAdmin.configureReserveAsCollateralrequiresltv <= liquidationThreshold. If threshold != 0, bonus must be> 100%andthreshold * bonus <= 100%. Disabling collateral (threshold 0) ordeactivateReservecalls_checkNoLiquidity(aToken underlying balance 0 and liquidity rate 0).- Token proxies are
InitializableImmutableAdminUpgradeabilityProxywith this configurator as admin. This contract does not move user tokens.
Do not file an admin-gated v2 configurator as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 AToken / debt tokens / v2 AaveOracle.
2026-09-03: Aave leftover remaining protocol-v2 AToken leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after Configurator leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/tokenization/AToken.sol. Do not rematch LendingPool leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger mint / burn / transferUnderlyingTo without the LendingPool; ERC20 transfer skipping HF validation; permit accepting a non-owner signature.
Result: no user-exploitable finding. Not submitted.
mint,burn,mintToTreasury,transferOnLiquidation,transferUnderlyingTo, andhandleRepaymentareonlyLendingPool.burn/transferUnderlyingTosafeTransferthe underlying.initializeisVersionedInitializable.- User
transfer/transferFromcall_transfer(..., validate=true), which scales by the reserve liquidity index andfinalizeTransfers on the leftover-logged pool (HF check). Liquidation transfers skip that validate flag because the pool already validated the liquidation. permitis EIP-2612ecrecoverofowneroverDOMAIN_SEPARATOR+ nonce; deadline is checked.
Do not file a pool-gated aToken as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 VariableDebtToken / StableDebtToken / v2 AaveOracle.
2026-09-03: Aave leftover remaining protocol-v2 debt tokens leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after AToken leftover. Official aave/protocol-v2 ce53c4a. Opened listed VariableDebtToken.sol and StableDebtToken.sol plus DebtTokenBase.sol for credit delegation. Do not rematch v3 StableDebtToken leftover or v2 LendingPool leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger mint of debt onto onBehalfOf without borrow allowance; ERC20 transfer of debt; burn without the LendingPool.
Result: no user-exploitable finding. Not submitted.
- Both
mint/burnareonlyLendingPool. Ifuser != onBehalfOf,_decreaseBorrowAllowancesubtracts from_borrowAllowances[onBehalfOf][user]and reverts on underflow (BORROW_ALLOWANCE_NOT_ENOUGH).approveDelegationonly writesmsg.sender’s allowance. DebtTokenBasetransfer/transferFrom/approve/ allowances revert (TRANSFER_NOT_SUPPORTED/ALLOWANCE_NOT_SUPPORTED).- Variable mint scales by the reserve index. Stable mint compounds the user’s rate and average supply rate; burn is also pool-only.
Do not file a credit-delegation-gated debt mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 AaveOracle.
2026-09-03: Aave leftover remaining protocol-v2 AaveOracle leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after v2 debt-token leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/misc/AaveOracle.sol. Do not rematch v3 AaveOracle leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger setAssetSources pointing an asset at a fake aggregator; getAssetPrice returning 0 so a healthy position liquidates.
Result: no user-exploitable finding. Not submitted.
setAssetSources/setFallbackOracleareonlyOwner. Constructor sets immutableBASE_CURRENCY/BASE_CURRENCY_UNIT.getAssetPricereturnsBASE_CURRENCY_UNITfor the base asset. A configured Chainlink source is used only iflatestAnswer() > 0; otherwise (or if the source isaddress(0)) it forwards to the fallback oracle. This contract does not move tokens.
Do not file an owner-gated v2 source update as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 GenericLogic / ValidationLogic / ReserveLogic / IR strategy (if still unused). Official PriceOracleSentinel + OwnableFacilitator 404.
2026-09-03: Filecoin leftover remaining lotus beacon leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus genesis leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/beacon. Opened beacon.go, drand/drand.go, and mock.go. Drand schedule / block-beacon verify. Do not rematch lotus sync leftover or genesis leftover. No mainnet writes. No exploit PoCs.
Checked for: ValidateBlockValues accepting a beacon entry that fails VerifyEntry; VerifyEntry trusting an HTTP fetch without the configured pubkey; MockBeacon being used as a consensus beacon.
Result: no user-exploitable finding. Not submitted.
ValidateBlockValuesrequires the last entry’s round to equalMaxBeaconRoundForEpoch. A chained fork needs exactly two entries. Each entry isVerifyEntryd against the previous signature (unchained also checks per-epoch rounds).DrandBeacon.VerifyEntrycallsscheme.VerifyBeaconwith the pubkey frombuildconstants.DrandConfigs. A cache hit must match the already-verified bytes.Entryonly fetches; it does not skip verify.MockBeaconis a local test helper (blake2b of the round). It is not wired as the mainnet schedule.
Do not file a pubkey-verified drand entry as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Filecoin leftover remaining lotus net leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus beacon leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, node/impl/net. Opened net.go, conngater.go, protect.go, and rcmgr.go. Local libp2p admin RPC. Do not rematch lotus node leftover or lotus sync leftover. No mainnet writes. No exploit PoCs.
Checked for: NetConnect / NetBlockAdd moving FIL; NetSetLimit rewriting chain state; a stranger calling these without leftover-logged JWT admin.
Result: no user-exploitable finding. Not submitted.
NetConnect/NetDisconnect/NetFindPeeronly touchHost/ DHT.NetPeers/NetPeerInfo/ bandwidth / ping are reads of the swarm.NetBlockAdd/NetBlockRemoveupdateConnGaterand close matching conns.NetProtectAddtags the connmgr.NetSetLimitsets an rcmgrBaseLimiton a named scope. None of these sign messages or change actor balances.- Write methods are admin-gated at the leftover-logged JSON-RPC JWT layer (
AuthNew/APISecret).
Do not file a libp2p admin helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner.
2026-09-03: Aave leftover remaining protocol-v2 ValidationLogic + GenericLogic leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after AaveOracle leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/libraries/logic/ValidationLogic.sol and GenericLogic.sol. Do not rematch LendingPool / CollateralManager / AToken leftovers. No mainnet writes. No exploit PoCs.
Checked for: validateBorrow skipping HF / LTV so a zero-collateral borrow succeeds; validateWithdraw / validateTransfer allowing an HF < 1 exit; validateLiquidationCall liquidating a healthy position; calculateUserAccountData treating empty config as HF 0.
Result: no user-exploitable finding. Not submitted.
validateDepositrequires amount > 0, reserve active, not frozen.validateWithdrawcaps amount at user balance and callsGenericLogic.balanceDecreaseAllowed(HF after the decrease ≥ 1, or early-true if the user is not borrowing / not using the asset as collateral / threshold 0).validateBorrowrequires active + not frozen + borrowing enabled, HF > 1, collateral > 0, andcollateral >= (debt + newBorrow) / LTV. Stable-rate extra gates: stable enabled; not same-currency collateral abuse unless the borrow exceeds the user’s aToken balance; amount ≤ 25% of aToken underlying liquidity (maxStableLoanPercent).validateRepayrequires debt of the selected type;uint256(-1)repay-on-behalf is forbidden.validateSwapRateMode/validateRebalanceStableBorrowRatere-check stable-abuse and 95% usage + liquidity-rate vs max variable APR.validateLiquidationCallrequires both reserves active, HF < 1, collateral enabled by config + user flag, and stable or variable debt > 0.validateTransferrequires sender HF ≥ 1. Flashloan only checks array length.calculateUserAccountDataprices aToken collateral and stable+variable debt via the leftover-logged oracle. Empty user config returns HFuint256(-1).calculateHealthFactorFromBalancesis(collateral * liqThreshold) / debt. These libraries do not move tokens.
Do not file a view-only HF/LTV gate as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 ReserveLogic / DefaultReserveInterestRateStrategy / ReserveConfiguration / UserConfiguration (if still unused).
2026-09-03: Aave leftover remaining protocol-v2 ReserveLogic + IR strategy leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after ValidationLogic leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/libraries/logic/ReserveLogic.sol and contracts/protocol/lendingpool/DefaultReserveInterestRateStrategy.sol. Do not rematch v3 IR strategy leftover (cff15de) or v2 LendingPool leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger updateState / init rewriting another reserve’s indexes; _mintToTreasury paying a caller-chosen recipient; calculateInterestRates moving underlying.
Result: no user-exploitable finding. Not submitted.
initrequiresaTokenAddress == 0.getNormalizedIncome/getNormalizedDebtare views (same-block stored index, else linear / compounded interest).updateStateonly writes this reserve’s liquidity / variable-borrow indexes and last timestamp, then_mintToTreasury._mintToTreasurymintsreserveFactor * accruedDebtaTokens viaIAToken.mintToTreasury(pool-gated in the leftover-logged AToken).updateInterestRatesstores strategy quotes; it does nottransferunderlying.cumulateToLiquidityIndexscales the liquidity index byamount / totalLiquidity(flashloan fee share).DefaultReserveInterestRateStrategyis view-only. Utilization = debt / (available + debt). Below the immutable kink, variable = base + slope1 * util / optimal; above it, base + slope1 + slope2 * excess. Liquidity rate = overall borrow × util × (1 − reserveFactor). Slopes are constructor immutables.
Do not file an index/rate helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 ReserveConfiguration / UserConfiguration / math libs (if still unused).
2026-09-03: Aave leftover remaining protocol-v2 ReserveConfiguration + UserConfiguration leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after ReserveLogic leftover. Official aave/protocol-v2 ce53c4a. Opened listed contracts/protocol/libraries/configuration/ReserveConfiguration.sol and UserConfiguration.sol. Do not rematch Configurator leftover. No mainnet writes. No exploit PoCs.
Checked for: bitmap setter overlapping LTV into liquidation-threshold bits so a stranger listing liquidates healthy positions; setBorrowing flipping another reserve’s collateral bit.
Result: no user-exploitable finding. Not submitted.
ReserveConfigurationis a packeduint256. LTV 0–15, threshold 16–31, bonus 32–47, decimals 48–55, active 56, frozen 57, borrowing 58, stable-borrowing 59, reserve factor 64–79. Each setter masks its field and caps LTV / threshold / bonus / factor at 65535 and decimals at 255. Getters invert the same masks. These libraries do not move tokens; the leftover-logged Configurator is the only writer of reserve bits.UserConfigurationuses two bits per reserve (borrow even, collateral odd),reserveIndex < 128.isBorrowingAnymasks0x55…55.isEmptyisdata == 0. No ERC20 calls.
Do not file a bitmap packer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: v2 math libs (WadRayMath / PercentageMath / MathUtils) if still unused.
2026-09-03: Aave leftover remaining protocol-v2 math libs leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after configuration leftover. Official aave/protocol-v2 ce53c4a. Opened listed WadRayMath.sol, PercentageMath.sol, and MathUtils.sol. Do not rematch ReserveLogic leftover. No mainnet writes. No exploit PoCs.
Checked for: wadMul / rayMul wrapping so a tiny input becomes a huge index; calculateCompoundedInterest minting extra debt via a caller-chosen timestamp.
Result: no user-exploitable finding. Not submitted.
wadMul/rayMulreturn 0 if either side is 0 and requirea <= (max - half) / bbefore(a * b + half) / unit.wadDiv/rayDivrevert onb == 0and the same overflow check.wadToRayrequiresresult / 1e9 == a.percentMul/percentDivusePERCENTAGE_FACTOR = 1e4with the same overflow / zero-divisor gates.calculateLinearInterestis1 + rate * dt / 365 days. Compounded interest is a 3-term binomial inrate/year;exp == 0returns 1 ray. The view overload usesblock.timestamp. These libraries do not move tokens.
Do not file a rounding helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused official Aave v2 copies are exhausted on this pin (PriceOracleSentinel + OwnableFacilitator 404). Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Aave leftover remaining protocol-v2 upgradeability leftover (ce53c4a)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after math-libs leftover. Official aave/protocol-v2 ce53c4a. Opened listed BaseImmutableAdminUpgradeabilityProxy.sol, InitializableImmutableAdminUpgradeabilityProxy.sol, and VersionedInitializable.sol. Do not rematch v3 upgradeability leftover (cff15de / solidity-utils 7a7548c). No mainnet writes. No exploit PoCs.
Checked for: stranger upgradeTo / upgradeToAndCall replacing the pool implementation; initializer re-running on an already-initialized proxy.
Result: no user-exploitable finding. Not submitted.
ADMINis an immutable constructor arg.upgradeTo/upgradeToAndCall/admin/implementationareifAdmin(non-admin falls through to the implementation)._willFallbackreverts ifmsg.sender == ADMIN.InitializableImmutableAdminUpgradeabilityProxyonly overrides_willFallbackonto the immutable-admin path. The leftover-logged Configurator is this proxy’s admin for reserve tokens.VersionedInitializable.initializerrequiresrevision > lastInitializedRevision(or constructor / nested init). Direct implementation calls still hitextcodesize != 0after deploy, so a stranger cannot re-init a live impl. These contracts do not move user tokens.
Do not file an admin-gated v2 proxy as stranger theft.
Not submitted. Payment requires user KYC. Official Aave protocol-v2 listed copies on this pin are exhausted (PriceOracleSentinel + OwnableFacilitator 404). Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Filecoin leftover remaining lotus messagesigner leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus net leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/messagesigner. Opened messagesigner.go and messagesigner_test.go. Local nonce + wallet sign helper. Do not rematch lotus wallet leftover, lotus mpool leftover, or lotus node leftover. No mainnet writes. No exploit PoCs.
Checked for: SignMessage signing a stranger From without a local key; SaveNonce advancing after a failed callback so a later message reuses a spent nonce; GetSignedMessage / StoreSignedMessage exposing another node's signed messages; SigningBytes hashing a Delegated message as a Filecoin CID.
Result: no user-exploitable finding. Not submitted.
SignMessageholdslk, assignsNextNonce(msg.From), thenwallet.WalletSignonmsg.FromwithMTChainMsgand the serialized message bytes. The leftover-logged wallet only signs keys it holds.specis unused here; gas / UUID live in leftover-loggedMpoolPushMessage.- The callback must succeed before
SaveNonce.MpoolPushMessageuses that callback toMpoolPushthe signed message. A failed push leaves the datastore nonce unchanged (covered byrecover from callback error). NextNoncestarts frommpool.GetNonce(actor nonce by default). If the datastore has a CBOR unsigned-int nonce, it takesmax(mpool, ds). A higher mempool nonce is used and logged; it is not silently ignored.SaveNoncestoresnonce+1under/message-signer/ActorNextNonce/<addr>.GetSignedMessage/StoreSignedMessageare local UUID keys in the same namespaced datastore. They do not gossip or move FIL.SigningBytesforaddress.Delegatedrebuilds an EIP-1559 RLP viaEth1559TxArgsFromUnsignedFilecoinMessage. Other protocols signmsg.Cid().Bytes(). This package does not broadcast.
Do not file a local-wallet nonce helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner (exchange / actors wrappers / types / index / lib).
2026-09-03: Filecoin leftover remaining lotus exchange leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus messagesigner leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/exchange. Opened doc.go, interfaces.go, protocol.go, server.go, client.go, peer_tracker.go, and protocol_encoding.go. Libp2p ChainExchange (/fil/chain/xchg/0.0.1). Do not rematch lotus sync leftover or lotus store leftover. No mainnet writes. No exploit PoCs.
Checked for: HandleStream signing or moving FIL; collectChainSegment writing a peer-chosen tipset into the store; processResponse accepting a disconnected or over-long chain; CompactedMessages indexes overflowing into another tipset’s messages.
Result: no user-exploitable finding. Not submitted.
- The server reads one CBOR
Request,validateRequests it (options set;1 <= Length <= MaxRequestLength/policy.ChainFinality; at least one head CID), thencollectChainSegmentwalksLoadTipSet/ parent CIDs from the local leftover-loggedChainStore. It does not sign, does notSetHead, and does not change actor balances. gatherMessagescompact-dedupes BLS / SECPK CIDs already stored under each block’sMessagesmeta. A stranger can request public chain data; that is the protocol.- The client
doRequests peers from a local latency tracker.processResponserequires a success/partial status,1 <= len(chain) <= req.Length,NewTipSeton each header set, head CIDs equal to the request, parent linkage viaIsChildOf, andvalidateCompressedIndices(include-array length equals block count; each index<compacted list length). - Reads are capped at
maxExchangeMessageSize(120 MiB).CompactedMessagesCBORmaxlen=150000; per-block include arrays cap atBlockMessageLimit. Signature / message-root checks live in leftover-logged sync / stmgr, not here.
Do not file a header/message fetch RPC as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner (actors wrappers / types / index / lib).
2026-09-03: Jito leftover remaining mev-programs tip leftover (ce1dfb6)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after restaking leftover. Official jito-foundation/jito-programs ce1dfb6. Opened listed mev-programs/programs/tip-payment/src/lib.rs and tip-distribution/src/{lib,state,merkle_proof}.rs. Do not rematch stake-deposit-interceptor or restaking leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger change_tip_receiver draining tips to themselves; claim paying a proof that does not bind claimant + amount; close_tip_distribution_account sending unclaimed tips to the cranker.
Result: no user-exploitable finding. Not submitted.
- Tip-payment config / tip PDAs are singleton seeds.
change_tip_receiver/change_block_builderfirstdrain_accounts(leave rent) and pay the currentconfig.tip_receiver/config.block_builderat the stored commission (≤ 100). The new builder cannot change the cut until after that drain. Failed transfers credit the tip PDA. Program / sysvar / config owners are rejected as receivers. - Tip-distribution
initialize_tip_distribution_accountrequires the signer to be the vote account’s node pubkey.upload_merkle_rootismerkle_root_upload_authorityonly, one epoch after create, not after first claim, not after expiry. claimverifieshashv([0, hashv(claimant || amount)])against the uploaded root (sorted intermediatehashv([1, …])), inits a once-onlyCLAIM_STATUSPDA, and capsmax_total_claim/max_num_nodes. The upload authority must also sign.close_tip_distribution_accountafterexpires_atsends leftovers toconfig.expired_funds_accountand rent to the validator vote account.
Do not file a configured-receiver tip drain as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana / priority-fee-distribution (if still unused).
2026-09-03: Filecoin leftover remaining lotus index leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus exchange leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/index. Opened interface.go, indexer.go, api.go, reconcile.go, events.go, gc.go, and read.go. Local SQLite message/event index. Do not rematch lotus events leftover, lotus store leftover, or lotus eth leftover. No mainnet writes. No exploit PoCs.
Checked for: Apply / ReconcileWithChain writing a stranger tipset into consensus; IndexSignedMessage moving FIL; ChainValidateIndex treating a stale index as canonical; gc deleting chain store blocks.
Result: no user-exploitable finding. Not submitted.
SqliteIndexerwrites only its local SQLite.Apply/Revert/indexTipsetpull messages from leftover-loggedChainStore.MessagesForTipset/MessagesForBlock.IndexSignedMessagestores an ETH tx-hash → CID map forSigTypeDelegatedonly.ReconcileWithChainwalks the leftover-logged heaviest chain backwards, marks non-canonical DB rows reverted, then backfills from store tipsets. A gap larger thanmaxReconcileTipsetsreturnsErrBackfillRequiredinstead of inventing state.ChainValidateIndexcompares indexed counts and reconstructed events-AMT roots to store receipts. Mismatches error (or optional backfill).GetCidFromHash/GetMsgInfo/GetEventsForFilterare reads.gcdeletes old index rows / blooms / eth-hash mappings aftergcRetentionEpochs(minimum one day). It does notSetHeador change actor balances.
Do not file a local SQLite event index as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner (actors wrappers / types / lib).
2026-09-03: Jito leftover remaining priority-fee-distribution leftover (ce1dfb6)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after mev-programs tip leftover. Official jito-foundation/jito-programs ce1dfb6. Opened listed mev-programs/programs/priority-fee-distribution/src/{lib,state,merkle_proof}.rs. Do not rematch tip-payment / tip-distribution leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger transfer_priority_fee_tips pulling another wallet; claim paying a proof that does not bind claimant + amount; close_priority_fee_distribution_account sending leftovers to the cranker.
Result: no user-exploitable finding. Not submitted.
initialize_priority_fee_distribution_accountrequires the signer to be the vote account’s node pubkey. Config is a singleton;update_configis authority-only.go_live_epochstarts atu64::MAX.transfer_priority_fee_tipsis a signedsystem_instruction::transferfromfrominto the current-epoch PFDA. Before go-live it only incrementstotal_lamports_transferredand returns (no pull).claimverifieshashv([0, hashv(claimant || amount)])against the uploaded root, inits a once-onlyCLAIM_STATUSPDA, and capsmax_total_claim/max_num_nodes. The upload authority must also sign.close_priority_fee_distribution_accountafterexpires_atsends leftovers toconfig.expired_funds_accountand rent to the validator vote account.
Do not file a self-funded PFDA transfer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana (if still unused).
2026-09-03: Jito leftover remaining jito-solana tip_manager leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after priority-fee-distribution leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/tip_manager.rs plus tip_manager/{tip_payment,tip_distribution}.rs. Do not rematch mev-programs tip leftover. No mainnet writes. No exploit PoCs.
Checked for: crank that points old_tip_receiver at a stranger so the leftover-logged tip-payment drain pays the caller; deserialize of an attacker-owned config PDA as the singleton.
Result: no user-exploitable finding. Not submitted.
TipManageronly builds validator-signed instructions. PDAs arefind_program_addressof the configured program IDs (CONFIG_ACCOUNT/TIP_ACCOUNT_0..7/TIP_DISTRIBUTION_ACCOUNT+ vote + epoch). Config decode requiresowner == program_idand the leftover-logged Anchor discriminator.change_tip_receiver_and_block_builder_txpasses the current on-chaintip_receiver/block_builderas the old accounts, then the new TDA PDA and block-builder fee info. The leftover-logged program drains to those old accounts first. This crate does nottransferlamports itself.- Init helpers are local-dev cranks (
get_initialize_tip_programs_bundle).should_init_tip_distribution_accounttreats a PDA with the wrong owner as uninitialized so a stranger lamport gift cannot skip init.
Do not file a validator-local instruction builder as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana bundle_stage / rpc bundles (if still unused).
2026-09-03: Filecoin leftover remaining lotus actors leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus index leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/actors. Opened manifest.go, actor_cids.go, builtin/builtin.go, builtin/registry.go, policy/policy.go, aerrors/{error,wrap}.go, and adt/{adt,store}.go. Versioned actor shims. Do not rematch leftover-logged builtin-actors, paych, or miner leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger RegisterManifest / AddActorMeta swapping a builtin CID so a fake miner runs; MakeRegistry defaulting an unknown key onto another actor; SetConsensusMinerMinPower being callable over RPC; Absorb downgrading a fatal error to success.
Result: no user-exploitable finding. Not submitted.
RegisterManifest/ClearManifests/AddActorMetawrite in-process maps undermanifestMx. They are not JSON-RPC.GetActorCodeIDfor v0–7 returns hardcoded specs-actors CIDs; v8+ looks up the registered manifest. Unknown name →cid.Undef, false.MakeRegistrypanics below v8. For v8+ it maps each manifest key to that version’sMethods/Statefromgo-state-types. Unrecognized keys are skipped.IsAccountActor/IsStorageMinerActor/IsBuiltinActoronly match registered meta or the v0–7 hardcoded CIDs.- Policy
Set*helpers (SetSupportedProofTypes,SetConsensusMinerMinPower,SetPreCommitChallengeDelay) mutate package-level constants and are documented as test-only. They are not exposed as node RPC. aerrors.Absorbrefuses to swallow an already-fatalActorErrororretCode == 0.SerializeParamsabsorbs a marshal failure asErrSerialization.adt.WrapStoreis an IPLD helper. None of these sign or move FIL.
Do not file a local actor CID map as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner (types / lib).
2026-09-03: Jito leftover remaining jito-solana bundle_stage leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after tip_manager leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/bundle_stage.rs, bundle_stage/{bundle_consumer,bundle_storage,bundle_account_locker}.rs, and rpc/src/rpc/bundles.rs. Do not rematch tip_manager leftover. No mainnet writes. No exploit PoCs.
Checked for: a stranger bundle that cranks leftover-logged tip-payment and sets the receiver to themselves; simulate_bundle committing to the working bank; forwarding a bundle so atomicity breaks.
Result: no user-exploitable finding. Not submitted.
- Bundles execute sequentially, atomically, all-or-nothing. Account locks are held for the whole bundle. A failed tx cancels the commit. Tip-program accounts are
blacklisted_accountsat insert (try_handle_packet); the consumer comment is that bundles/BankingStage must not call tip-payment (crank-to-self steal). - Each new leader slot,
handle_tip_programsruns the leftover-loggedTipManagercrank before user bundles. Bundles are not forwarded (Forwarddrops them). BAM drain clears storage. simulate_bundleis RPC simulation only (max 20 txs, Base64, optional sigverify). It does not record to PoH.
Do not file a blacklisted tip-program bundle as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana other crates (if still unused). Official Jito mev-programs + tip_manager leftovers are logged.
2026-09-03: Filecoin leftover remaining lotus types leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus actors leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, chain/types. Opened message.go, signedmessage.go, blockheader.go, tipset.go, and electionproof.go. Do not rematch lotus eth leftover (ethtypes) or lotus actors leftover. No mainnet writes. No exploit PoCs.
Checked for: DecodeMessage accepting a non-v0 message that later spends as v0; ValidForBlockInclusion allowing a negative Value; SignedMessage.Cid hashing only the unsigned body for SECPK so a signature can be swapped; NewTipSet joining blocks with different parents.
Result: no user-exploitable finding. Not submitted.
DecodeMessagerequiresVersion == MessageVersion(0).ValidForBlockInclusionrejects undef / NV-illegal From/To, zero-address To after NV7, nil or negative Value / fee fields, Value aboveTotalFilecoinInt, GasPremium > GasFeeCap, and GasLimit outside(0, BlockGasLimit]and belowminGas.- BLS
SignedMessage.Cid/ChainLengthuse the unsigned message (aggregate lives on the leftover-logged block header). SECPK CIDs include the signature bytes.BlockHeader.SigningBytesserializes a copy withBlockSigcleared.SetValidatedis a local flag. NewTipSetrequires a non-empty set, a ticket on every block, equal heights, and identical parent CID lists. Election-proof win-count uses the leftover-logged poisson /expneghelpers against miner vs network power. These types do not sign or move FIL.
Do not file a serialize/validate helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus non-miner (lib).
2026-09-03: Rootstock leftover remaining powpeg-node pegout leftover (254fb3d)
Immunefi program rootstocklabs ($200,000, kyc: true). Official remaining listed after PegIn / PegOut / Collateral leftover. Official rsksmart/powpeg-node 254fb3d. Opened listed BtcReleaseClient.java, BridgeTransactionSender.java, ReleaseRequirementsEnforcer.java, ReleaseCreationInformationGetter.java, and PegoutSignedCacheImpl.java. Do not rematch Flyover Blockscout leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger RPC that makes this node sign an arbitrary BTC pegout; onBtcRelease broadcasting a caller-chosen tx; sendRskTx paying a stranger from the federator.
Result: no user-exploitable finding. Not submitted.
startonly observes a federation this node is a member of. Pegouts come fromFederatorSupport.getStateForFederator/RELEASE_BTCBridge logs, not a public submit API. Signing skips cached / already-signed / wrong-redeem-script txs and signs one HSM-gated input set, thenaddSignatureon the Bridge.onBtcReleasebroadcasts the decoded Bridge event tx to configured BTC peers.BridgeTransactionSenderis a federator-signed, value-0 call toBRIDGE_ADDRafter a local gas estimate.ReleaseRequirementsEnforceronly places the ancestor block for PowHSM v2+.- This process is a federation operator. It does not expose stranger-callable JSON-RPC that moves BTC.
Do not file a federation pegout signer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: rskj / rsk-powhsm (if still unused).
2026-09-03: Filecoin leftover remaining lotus lib sigs leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus types leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, lib/sigs. Opened sigs.go, doc.go, bls/init.go, secp/init.go, and delegated/init.go. Local signature shims. Do not rematch lotus wallet leftover or Filecoin go-crypto leftover. No mainnet writes. No exploit PoCs.
Checked for: Verify accepting a nil signature or an unresolved ID address; RegisterSignature being callable over RPC so a stranger installs a no-op verifier; CheckBlockSignature skipping verify when IsValidated was set by a peer; Delegated verify matching a secp address.
Result: no user-exploitable finding. Not submitted.
Sign/Verify/Generate/ToPublicfail on an unregisteredSigType.Verifyrejects a nil sig andaddress.ID(must resolve first).RegisterSignaturewrites an in-process map and is used from packageinitonly.CheckBlockSignaturerequiresBlockSig, verifiesSigningBytesagainst the worker address, thenSetValidated. A peer cannot set that flag over the wire; leftover-logged types keep it local.- BLS uses leftover-logged filecoin-ffi
HashVerifywith length-checked pubkey / sig. SECPK is blake2b-256 +EcRecover; the recovered address must equalFrom. Delegated is keccak-256 +EcRecover, thenNewDelegatedAddress(EAM, keccak(pubkey)[12:]). This package does not move FIL.
Do not file a local verify shim as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus lib (backupds / rpcenc / peermgr) if still unused.
2026-09-03: Filecoin leftover remaining lotus lib backupds leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus lib sigs leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, lib/backupds. Opened datastore.go, read.go, and log.go. Local datastore dump/restore. Do not rematch lotus node leftover (backup / LOTUS_BACKUP_BASE_PATH). No mainnet writes. No exploit PoCs.
Checked for: RestoreInto applying a stranger dump over a remote node without admin; ReadBackup skipping the SHA-256 checksum; Backup writing outside the leftover-logged backup base path.
Result: no user-exploitable finding. Not submitted.
Wrapproxies a localBatchingdatastore.Backupdumps all KVs as CBOR plus a SHA-256 of the array. Puts are logged to a local*.log.cborwhenlogdiris set.ReadBackuprequires array(2) + indefinite array, then compares the trailing 32-byte checksum. A truncated log errors unlessLOTUS_ALLOW_TRUNCATED_LOG=1(local env).RestoreIntoonlyPuts into a caller-supplied dest.- Path gating and JWT admin live in leftover-logged
node/implbackup RPC. This package does not sign or move FIL.
Do not file a local DS dump helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus lib (rpcenc / peermgr) if still unused.
2026-09-03: Filecoin leftover remaining lotus lib rpcenc leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus lib backupds leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, lib/rpcenc. Opened reader.go. JSON-RPC io.Reader stream encoder/decoder. Do not rematch lotus node leftover or miner leftover. No mainnet writes. No exploit PoCs.
Checked for: a stranger POSTing a UUID that becomes an unauthenticated io.Reader into a FIL-moving RPC; HTTP stream type making the node fetch an attacker URL as consensus input; redirect sending another node's wallet key.
Result: no user-exploitable finding. Not submitted.
ReaderParamEncoderturns a clientio.ReaderintoReaderStream.NullReaderis a byte count.HttpReaderis a URL string. Otherwise the client HEADs, then POSTs the body to{addr}/{uuid}. Redirects (302) are followed by the client (CheckRedirect = ErrUseLastResponse).ReaderParamDecoderregisters a push handler. Path UUID must parse; only HEAD/POST; 30s timeout.Nullbuilds a localNullReader.HTTPwrapshttpreader.HttpReader{URL}.pushwaits on the matching UUID channel.- This is a stream helper for leftover-logged miner/node RPC (JWT-gated). It does not sign messages or change actor balances.
MustRedirect/redirectonly retarget the push URL.
Do not file an io.Reader RPC codec as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus lib (peermgr) if still unused.
2026-09-03: Filecoin leftover remaining lotus lib peermgr leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus lib rpcenc leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, lib/peermgr. Opened peermgr.go. Local Filecoin peer-set expander. Do not rematch lotus net leftover or lotus exchange leftover. No mainnet writes. No exploit PoCs.
Checked for: AddFilecoinPeer moving FIL; doExpand rewriting chain state; Disconnect signing a message.
Result: no user-exploitable finding. Not submitted.
PeerMgrtracks a localpeersmap (min 12 / max 32).AddFilecoinPeer/SetPeerLatency/GetPeerLatencyonly touch that map and emitFilPeerEvt.Disconnectdeletes a peer when libp2p reportsNotConnected.Runticks every 5s. BelowminFilPeers,expandPeerseitherConnects configured bootstrappers (if the set is empty) ordht.Bootstrap. It does not sign, does notSetHead, and does not change actor balances.
Do not file a libp2p peer expander as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus lib (httpreader / addrutil) if still unused.
2026-09-03: Rootstock leftover remaining rskj Bridge leftover (161c3f105d18)
Immunefi program rootstocklabs ($200,000, kyc: true). Official remaining listed after powpeg-node pegout leftover. Official rsksmart/rskj master pin 161c3f105d18. Opened listed rskj-core/src/main/java/co/rsk/peg/Bridge.java plus authorizer wiring in BridgeMethods.java. Do not rematch Flyover Blockscout leftover or powpeg-node pegout leftover. No mainnet writes. No exploit PoCs.
Checked for: empty calldata minting unbacked RBTC; stranger addSignature completing a pegout; public registerBtcTransaction minting without a confirmed BTC lock; unauthenticated Union requestUnionBridgeRbtc drain.
Result: no user-exploitable finding. Not submitted.
Bridgeis a precompile wrapper.parseDatamaps empty calldata toRELEASE_BTC(intended: send RBTC to the Bridge). Invalid 1–3 byte or unknown selectors return null andexecutethrows after RSKIP88.validateCallrejects non-local-only methods on non-local calls (RSKIP88) and disallowedMsgType(RSKIP417).addSignatureisactiveRetiringAndProposedFederationOnly. The provided BTC key must belong to a federation member;processSigningverifies each DER signature against that key and the waiting pegout sighash. A stranger cannot complete a release.registerBtcTransactionis public after RSKIP199.BridgeSupportstill requires an unprocessed tx, merkle/confirmation validation, and a typed peg-in / peg-out / SVP lock.UNKNOWNis ignored. Empty-valuereleaseBtconly queues the sender's call value; contract callers are rejected.- Union
setUnionBridgeContractAddressForTestnetis testnet-and-authorized. Cap and transfer-permission setters useexecuteIfAuthorized.requestUnionBridgeRbtc/releaseUnionBridgeRbtcrequire the configured Union contract as sender; unauthorized callers getUNAUTHORIZED_CALLERand no transfer.
Do not file the public peg-in registrar or empty-calldata peg-out as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: rsk-powhsm (if still unused).
2026-09-03: Filecoin leftover remaining lotus lib httpreader leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus lib peermgr leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, lib/httpreader. Opened httpreader.go and resumable.go. Local HTTP GET readers. Do not rematch lotus lib rpcenc leftover. No mainnet writes. No exploit PoCs.
Checked for: HttpReader.Read fetching an attacker URL as consensus input; ResumableReader following a redirect into a FIL-moving RPC; a stranger calling these without leftover-logged JWT.
Result: no user-exploitable finding. Not submitted.
HttpReaderlazy-http.GetsURLon firstRead, requires HTTP 200, then streams the body. Closing clears the URL. Used as leftover-loggedrpcencHTTPstream type (JWT-gated miner/node RPC).ResumableReaderGETs withRangeafter the first body drops, follows at most 10 redirects, and stops atContent-Length. It is a local piece/data helper.- Neither signs messages nor changes actor balances.
Do not file an HTTP GET reader as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining lotus lib (addrutil) if still unused.
2026-09-03: Filecoin leftover remaining lotus lib addrutil leftover (7740217)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus lib httpreader leftover. Official sparse clone /tmp/filecoin-lotus at 7740217, lib/addrutil. Opened parse.go. Multiaddr / peer-id parser. Do not rematch lotus lib peermgr leftover or lotus net leftover. No mainnet writes. No exploit PoCs.
Checked for: ParseAddresses connecting to a stranger as if they were a bootstrap miner; DNS resolution rewriting actor balances; an unresolved multiaddr being treated as a signed peer.
Result: no user-exploitable finding. Not submitted.
ParseAddressesparses each string as a multiaddr. If the last protocol isipfs/P_IPFS(peer id), it is kept as-is. Otherwisemadns.Resolveruns under a 10s timeout, and only resolved addrs that still end inipfsare kept.peer.AddrInfosFromP2pAddrsbuildspeer.AddrInfos. This package does notConnect, sign, or move FIL. Leftover-loggedpeermgris the only caller that connects bootstrappers.
Do not file a multiaddr parser as stranger theft.
Not submitted. Payment requires user KYC. Unused official lotus leftover that listed trees open is exhausted on this pin. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Rootstock leftover remaining rsk-powhsm leftover (82a12d44efec)
Immunefi program rootstocklabs ($200,000, kyc: true). Official remaining listed after rskj Bridge leftover. Official rsksmart/rsk-powhsm 82a12d44efec. Opened listed firmware/src/powhsm/src/hsm.c, auth.c, auth_path.c, auth_tx.c, auth_receipt.c, and pathAuth.c. Do not rematch rskj Bridge leftover or powpeg-node pegout leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger APDU that signs an arbitrary BTC pegout with the federation seed; unauth-path INS_SIGN spending the BTC key.
Result: no user-exploitable finding. Not submitted.
INS_SIGN/INS_GET_PUBLIC_KEYrequire an unlocked, onboarded HSM. This firmware is a federation operator device, not a public RPC.- BTC / tBTC paths (
m/44'/0'/0'/0/0,m/44'/1'/0'/0/0) setauth_requiredand will not sign until the host streams a version-1/2 BTC tx, an RSK receipt with the Bridge emitter +release_btcevent whose topic matches that tx hash, and a merkle proof. Unknown paths throwERR_AUTH_INVALID_PATH. - RSK / MST paths sign a caller-supplied hash without that receipt. Those keys are not the BTC federation spend path.
- The last authorized BTC tx hash is written to NVM so the same authorized hash is not rewritten. A stranger without the unlocked device cannot complete
seed_sign.
Do not file federation HSM firmware as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: none on official Rootstock leftover trees that still open.
2026-09-03: Jito leftover remaining jito-solana banking_stage leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after bundle_stage leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/banking_stage.rs, banking_stage/{consumer,committer,consume_worker}.rs, and core/src/tpu.rs. Do not rematch tip_manager leftover or bundle_stage leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger TPU packet that cranks tip programs to the caller; banking_stage committing an unsigned drain; tip-payment txs slipping past filter_keys.
Result: no user-exploitable finding. Not submitted.
Tpuinsertstip_manager.tip_payment_program_id()intofilter_keys. Banking-stage vote receivers and the scheduler clone that set. Tip-payment program packets are dropped on the regular TPU path.ConsumeWorker::maybe_run_tip_programsonly runs when tip deps exist, a batch touches tip accounts, and BAM is connected. Init/crank bundles are signed withcluster_info.keypair()(the validator) via leftover-loggedTipManager. Commit failures return false; this is validator-local upkeep, not a public submit API.Consumerre-sanitizes aged txs,check_transactions, QoS cost, thenbank.commit_transactions. Vote-only banks reject non-votes.revert_on_erroris all-or-nothing. A stranger packet still needs a valid signature and does not move validator funds.
Do not file a validator banking pipeline as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana other crates (proxy / forwarding / replay) if still unused.
2026-09-03: Aave leftover remaining v3 ReserveLogic leftover (cff15de)
Immunefi program aave ($1,000,000, kyc: true). Official remaining listed after v3 supporting-logic leftovers. Official aave-dao/aave-v3-origin cff15de. Opened listed src/contracts/protocol/libraries/logic/ReserveLogic.sol via raw.githubusercontent.com at that pin. Do not rematch protocol-v2 ReserveLogic leftover (ce53c4a) or v3 money-path / ValidationLogic / PoolLogic leftovers. No mainnet writes. No exploit PoCs.
Checked for: updateState skipping index growth so variable debt stays cheap; updateInterestRatesAndVirtualBalance inflating virtualUnderlyingBalance so a stranger can borrow unbacked; _accrueToTreasury over-minting aTokens to a caller; init overwriting an existing reserve's aToken.
Result: no user-exploitable finding. Not submitted.
getNormalizedIncome/getNormalizedDebtreturn the stored indexes whenlastUpdateTimestamp == block.timestamp. Otherwise linear (liquidity) / compounded (variable debt) interest israyMul'd onto the stored index.updateStateno-ops in the same block. Else_updateIndexesthen_accrueToTreasury, then stampslastUpdateTimestampon storage and the cache.initrequiresaTokenAddress == address(0)and sets both indexes toRAY.updateInterestRatesAndVirtualBalanceasks the leftover-logged IR strategy withunbacked: reserve.deficitandusingVirtualBalance: true. Virtual balance+=liquidity added /-=taken (SafeCasttouint128)._accrueToTreasuryno-ops at reserve factor 0. Accrued debt iscurrScaledVariableDebt.rayMulFloor(nextVarIndex - currVarIndex)(rounds down to keep the invariant), thenpercentMulreserve factor, then a scaled mint intoaccruedToTreasury._updateIndexesgrows the liquidity index only whencurrLiquidityRate != 0, and the variable borrow index only whencurrScaledVariableDebt != 0.cachesnapshots configuration, indexes, rates, token addresses, andscaledTotalSupplyof the variable debt token. This library does nottransferunderlying.
Do not file index / treasury accrual helpers as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: primacy. Unused official Aave v3 logic leftover that listed trees open is exhausted on this pin.
2026-09-03: Jito leftover remaining jito-solana proxy leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after banking_stage leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/proxy/{mod,auth,block_engine_stage,relayer_stage}.rs and core/src/forwarding_stage.rs. Do not rematch banking_stage leftover, bundle_stage leftover, or tip_manager leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger gRPC that authenticates as the validator; trust_packets minting unbacked spends; forwarding_stage signing or rewriting a stranger tx.
Result: no user-exploitable finding. Not submitted.
- Relayer / Block Engine auth is a challenge signed with
cluster_info.keypair(). Tokens must be non-empty and haveexpires_at_utc. Identity rotation aborts. A stranger cannot mint a validator Bearer token. BlockEngineStage/RelayerStagesubscribe only after that auth. Bundles are sanitized later (leftover-logged bundle_stage). Relayer packets go to the untrusted channel.trust_packetsis operator config for an already-authenticated stream, not a public submit API.ForwardingStagesanitizes, priority-orders, and rate-limits packets toward the next leader TPU-forwards. Failed sanitize drops the packet. It does not sign or move validator funds.
Do not file a validator-to-relayer client as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana replay_stage (if still unused).
2026-09-03: Jito leftover remaining jito-solana replay leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after proxy leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/replay_stage.rs, replay_stage/dead_slots.rs, and replay_stage/update_parent.rs. Do not rematch banking_stage leftover, bundle_stage leftover, tip_manager leftover, or proxy leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger shreds that replay as a funded vote; generate_vote_tx signing without the authorized voter; dump/repair that rewrites another validator's leader slot; a tip-program crank during replay.
Result: no user-exploitable finding. Not submitted.
- This crate has no tip / bundle / block-engine hooks. Replay is validator-local:
replay_blockstore_into_bankcalls leftover-loggedblockstore_processor::confirm_sloton shreds already in the local ledger. generate_vote_txrequires a localauthorized_voterkeypair whose pubkey matches the vote account for the epoch, andnode_pubkey == identity. A hot-spare mismatch returnsHotSpareand does not vote. The vote tx ispartial_signed with identity + authorized voter only.dump_then_repair_correct_slotsrefuses to dump a slot this identity led, a PoH bank still building on that fork, or a frozen hash that already matches the correct hash.dead_slotsonly classifies replay failures and notifies RPC / repair.update_parentdefers child-bank start until SlotMeta parent matches the discovered parent.
Do not file a validator replay / vote signer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused official jito-solana leftover that listed trees open after replay, if still unused.
2026-09-03: Jito leftover remaining jito-solana replay_stage leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after proxy leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/replay_stage.rs, replay_stage/{dead_slots,update_parent}.rs. Do not rematch banking_stage leftover, bundle_stage leftover, proxy leftover, or tip_manager leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger shred that credits the attacker; generate_vote_tx signing with a stolen vote account; replay rewards paying a caller.
Result: no user-exploitable finding. Not submitted.
- Replay is validator-local.
replay_blockstore_into_bankrunsconfirm_sloton shreds already in blockstore. A chained-block-id mismatch marks the slot hard-dead. This is not a public submit API. generate_vote_txrequires a local vote account whosenode_pubkeymatchesnode_keypairand whose authorized voter keypair is present. Missing keys return NonVoting / HotSpare / VoteAccountNotFound. A stranger cannot push a vote.- Rewards appear only as
get_rewards_and_num_partitionsmetadata for RPC.dead_slotsclassifies TooFewTicks as expected protocol death.update_parentdefers when SlotMeta parent does not match.
Do not file a validator replay loop as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: none on official Jito leftover trees that still open.
2026-09-03: Jito leftover remaining jito-solana poh leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after replay leftovers. Official jito-foundation/jito-solana d0e3a47. Opened listed poh/src/{lib,poh_controller,poh_recorder,poh_service,record_channels,transaction_recorder}.rs. Do not rematch banking_stage leftover, bundle_stage leftover, tip_manager leftover, proxy leftover, or replay leftovers. No mainnet writes. No exploit PoCs.
Checked for: stranger record that mixes an attacker mixin into the leader PoH; reset / set_bank from a public RPC; TransactionRecorder signing or moving validator funds; a tip-program crank in this crate.
Result: no user-exploitable finding. Not submitted.
- This crate has no tip / bundle / block-engine hooks.
PohControlleris a local 16-slot crossbeam (Reset/SetBank). Leftover-logged replay is the caller. It is not a public submit API. TransactionRecorderhashes the supplied txs andtry_sends aRecord.RecordSenderCAS-matchesbank_idand an insertion quota; shutdown / inactive / full map toMaxHeightReached/ChannelFull. A mismatched bank id is dropped.PohRecorder::recordrequires a working bank, matchingbank_id, and a non-empty tx list. The mixin is the localhash_transactionsof those txs.reset/set_bank/clear_bankonly run from leftover-loggedPohServiceafter a controller message.PohServicehashes locally and drains the record channel. It does not sign or transfer lamports.
Do not file a validator-local PoH recorder as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana tvu / scheduler if still unused.
2026-09-03: Jito leftover remaining jito-solana tvu leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after poh leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed core/src/tvu.rs. Do not rematch banking_stage leftover, bundle_stage leftover, tip_manager leftover, proxy leftover, replay leftovers, or poh leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger shreds that skip sigverify and credit the attacker; TVU cranking leftover-logged tip programs; votor signing without the authorized voter.
Result: no user-exploitable finding. Not submitted.
Tvu::newis validator wiring. Fetch sockets go toShredFetchStage, thenspawn_shred_sigverify(leader-schedule shred signatures) beforeRetransmitStage/WindowService/ leftover-loggedReplayStage.- This file has no tip / bundle / block-engine hooks.
shredstream_receiver_address/ BAM shred addrs are leftover-logged proxy operator config, not a public submit API. - Votor /
VotingServicetake the localauthorized_voter_keypairsand leftover-loggedcluster_info.keypair(). BLS ingress is rate-limited and sigverified. A stranger packet still needs a valid shred or vote signature.
Do not file a validator TVU wiring crate as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana scheduler if still unused.
2026-09-03: Jito leftover remaining jito-solana scheduler leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after tvu leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed unified-scheduler-logic/src/lib.rs, unified-scheduler-pool/src/lib.rs, and core/src/scheduler_bindings_server.rs. Do not rematch banking_stage leftover (including transaction_scheduler), bundle_stage leftover, tip_manager leftover, proxy leftover, replay leftovers, poh leftover, or tvu leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger Unix-socket handshake that schedules a drain; DefaultTaskHandler executing an unsigned tip-program crank; SchedulingStateMachine minting a token that spends validator funds.
Result: no user-exploitable finding. Not submitted.
unified-scheduler-logicis an in-process FIFO lock sorter. It does not know about banks, signatures, or lamports. The "Unauthorized token minting" comment is aTokenCellmiri test, not a crypto mint.DefaultTaskHandlerruns leftover-loggedexecute_batchon aReplayTransactionalready attached to the working bank. This crate has no tip / bundle / block-engine hooks.scheduler_bindings_server::spawnbinds a local Unix path, acceptshandshake::serversessions, and forwardsBankingControlMsg::Externalon a local mpsc. That is operator-local IPC, not a public submit API.
Do not file a validator-local scheduler as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana tokens / programs / runtime if still unused.
2026-09-03: Jito leftover remaining jito-solana runtime fee leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after scheduler leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/bank/fee_distribution.rs, runtime/src/bank/bundle_simulation.rs, runtime/src/prioritization_fee.rs, and runtime/src/prioritization_fee_cache.rs. Do not rematch bundle + fee leftover (fee/src/lib.rs) or scheduler leftover. No mainnet writes. No exploit PoCs.
Checked for: distribute_transaction_fee_details paying a stranger collector; simulate_transactions_unchecked_with_pre_accounts committing to the working bank; prioritization-fee cache minting lamports.
Result: no user-exploitable finding. Not submitted.
calculate_reward_and_burn_fee_detailsburns 50% of the transaction fee and deposits the rest plus the priority fee.deposit_or_burn_feepays the vote-stateblock_revenue_collector(SIMD-0232, reserved keys rejected) and the leader vote account. A failed deposit is burned, not sent to the caller.bundle_simulationrunsload_and_execute_transactions_with_program_cacheagainstAccountOverridesonly (all_or_nothing,drop_on_failure). It neverstore_accounts the working bank.PrioritizationFee/PrioritizationFeeCacheare in-memory RPC views. Updates after finalize increment a metric and return. They do not transfer lamports.
Do not file leader fee distribution or simulation overrides as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana programs / remaining runtime if still unused.
2026-09-03: Jito leftover remaining jito-solana vote leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after programs leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed programs/vote/src/lib.rs, programs/vote/src/vote_processor.rs, programs/vote/src/vote_state/mod.rs, and programs/vote/src/vote_state/handler.rs. Do not rematch programs leftover (programs/system), runtime fee leftover, or tokens leftover. No mainnet writes. No exploit PoCs.
Checked for: Withdraw that drains a vote account without the authorized withdrawer; Authorize / AuthorizeWithSeed that hands voter or withdrawer to a stranger; DepositDelegatorRewards that pulls lamports out of the vote account; UpdateCommissionCollector that redirects inflation or block-revenue to an unsigned account.
Result: no user-exploitable finding. Not submitted.
- Entrypoint rejects a non-vote owner.
Withdrawrequiresauthorized_withdrawerin the signer set, keeps rent pluspending_delegator_rewardson a partial withdraw, and refuses a close while recent epoch credits or pending rewards remain. Authorize(Voter)accepts the current withdrawer or the epoch authorized voter.Authorize(Withdrawer)accepts only the current withdrawer.AuthorizeWithSeedinserts the derived key only when account 2 signed. Checked variants also require the new authority to sign. BLS voter authorize is feature-gated and verifies a proof of possession bound toALPENGLOW+ the vote pubkey.- Vote / tower-sync paths require the epoch authorized voter.
process_new_vote_staterewrites lockouts, root, credits, and timestamp only. It does not change authorities or collectors. UpdateCommission,UpdateCommissionBps,UpdateCommissionCollector, andUpdateValidatorIdentityrequire the withdrawer. A new collector must be the vote account or a writable, rent-exempt, system-owned account.DepositDelegatorRewardsCPI-transfers from a signed source into the vote account and incrementspending_delegator_rewards.- v1/v3 → v4 conversion copies
authorized_withdrawerandauthorized_voters. Collectors default to the vote pubkey / node pubkey until the withdrawer sets them.
Do not file a signed vote-account withdraw or a delayed voter authorize as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana bpf_loader / remaining runtime / other programs if still unused.
2026-09-03: Jito leftover remaining jito-solana bpf leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after vote leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed programs/bpf_loader/src/lib.rs. Do not rematch vote leftover, programs leftover (programs/system), or runtime fee leftover. No mainnet writes. No exploit PoCs.
Checked for: Upgrade that replaces ProgramData without the upgrade authority; SetAuthority that hands a buffer or program to a stranger; Close that drains ProgramData without the authority; ExtendProgram that mutates ELF bytes or steals rent.
Result: no user-exploitable finding. Not submitted.
- Management IXs run only when the invoked program is native-loader-owned
bpf_loader_upgradeable. v1 / deprecated loaders returnUnsupportedProgramId. Invocation uses the cached executor and rejects Closed / FailedVerification / DelayVisibility. Write,DeployWithMaxDataLen, andUpgraderequire the buffer authority to match the signed upgrade authority.Upgradealso checks ProgramDataupgrade_authority_address, rejects a same-slot deploy, and refuses an immutable program. ProgramData PDA must befind_program_address([program_id], loader).SetAuthorityrequires the present authority to sign. Buffers cannot drop authority.SetAuthorityCheckedalso requires the new authority to sign. Making a pre-v3 ELF immutable is rejected whendisable_sbpf_v0_v1_v2_deploymentis on.Closeof Buffer / ProgramData goes throughcommon_close_account(authority must match and sign). ProgramData close also checks the Program account pointer and writes a Closed tombstone. Closing Uninitialized is the stock loader drain of an uninitialized loader-owned account, not a funded program.ExtendProgramdoes not require the upgrade authority. A stranger can pay rent to grow ProgramData;deploy_program!re-verifies the existing ELF and does not rewrite it. Immutable programs cannot be extended. Same-slot extend / upgrade / close still fail.
Do not file a signed upgrade-authority deploy or an unpaid ELF rewrite as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana compute-budget / zk-elgamal-proof / remaining runtime if still unused.
2026-09-03: Jito leftover remaining jito-solana compute-budget leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after bpf leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed programs/compute-budget/src/lib.rs, compute-budget/src/compute_budget.rs, compute-budget/src/compute_budget_limits.rs, compute-budget-instruction/src/compute_budget_instruction_details.rs, and compute-budget-instruction/src/compute_budget_program_id_filter.rs. Do not rematch bpf leftover, vote leftover, or runtime fee leftover. No mainnet writes. No exploit PoCs.
Checked for: a no-op compute-budget program that still mints CUs; duplicate SetComputeUnitLimit / SetComputeUnitPrice that underpays priority fee; RequestHeapFrame that exceeds MAX_HEAP_FRAME_BYTES; get_prioritization_fee that truncates instead of rounding up.
Result: no user-exploitable finding. Not submitted.
- The native program entrypoint is a no-op. The runtime parses compute-budget IXs before invoke.
ComputeBudgetProgramIdFilteronly matchescompute_budget::id(). Duplicate RequestHeapFrame / SetComputeUnitLimit / SetComputeUnitPrice / SetLoadedAccountsDataSizeLimit returnDuplicateInstruction.- Heap size must be in
[MIN_HEAP_FRAME_BYTES, MAX_HEAP_FRAME_BYTES]and a multiple of 1024. CU limit and loaded-account bytes are capped. A zero loaded-account limit is rejected. - Default CU when unset is builtin-count ×
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMITplus non-builtin ×DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT. Migrating builtins switch after their feature activates. get_prioritization_feemultiplies price × limit in u128, rounds up to the next lamport, and saturates atu64::MAX. Zero price is zero fee.
Do not file a signed compute-budget CU request as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana zk-elgamal-proof / remaining runtime if still unused.
2026-09-03: Jito leftover remaining jito-solana zk-elgamal-proof leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after compute-budget leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed programs/zk-elgamal-proof/src/lib.rs and programs/zk-token-proof/src/lib.rs. Do not rematch compute-budget leftover, bpf leftover, or vote leftover. No mainnet writes. No exploit PoCs.
Checked for: process_verify_proof that accepts a failed proof and still writes context; CloseContextState that drains a context account without the stored authority; a path that mints confidential-transfer tokens.
Result: no user-exploitable finding. Not submitted.
- Feature-gated:
disable_zk_elgamal_proof_programwithoutreenable_zk_elgamal_proof_programrejects every IX. - Each verify consumes a fixed CU budget, then
verify_proof()on the Pod proof from IX data or from a bounded account slice. Failure isInvalidInstructionData. This crate does not mint or transfer SPL tokens. - Optional context write requires a program-owned uninitialized account of exact encoded length. Authority is the next account key. An already-initialized context is rejected.
CloseContextStaterequires account 2 to sign and equalcontext_state_authority, rejects uninitialized / same destination, then moves lamports, zeros data, and assigns the account to the system program.zk-token-proofis a no-op entrypoint (Ok(())). It does not verify proofs or touch accounts.
Do not file a verified proof-context close as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana remaining runtime if still unused.
2026-09-03: Jito leftover remaining jito-solana vote_reward leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining listed after zk-elgamal-proof leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/block_component_processor.rs, runtime/src/block_component_processor/vote_reward.rs, and runtime/src/block_component_processor/vote_reward/epoch_inflation_account_state.rs. Do not rematch runtime fee leftover, vote leftover, or zk-elgamal-proof leftover. No mainnet writes. No exploit PoCs.
Checked for: calc_vote_rewards_update_vote_states that credits a stranger vote account; calculate_reward that mints lamports into VoteState; footer reward_cert accepted without ValidatedRewardCert.
Result: no user-exploitable finding. Not submitted.
- Footer path builds
ValidatedRewardCert::try_newfrom skip/notar certs andValidatedBlockFinalizationCertbeforeupdate_bank_with_footer_fields. Invalid certs abort the footer. update_accountincrements epoch credits only for pubkeys in the validated reward-cert set. Leader extra credits go tobank.leader().vote_address.VoteState::serializecopies the original lamports and owner; this crate does notchecked_add_lamports.calculate_rewardis stake × epoch inflation / (slots × total stake), then split 50/50 validator/leader. Inflation metadata lives on an off-curve PDA (vote_reward_account/ alpenglow feature id).store_accountswrites the serialized vote-state updates for the working bank slot. A stranger shred still needs a valid reward / finalization certificate.
Do not file a certificate-gated credit increment as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: jito-solana check_transactions / partitioned epoch rewards / remaining runtime if still unused.
2026-09-03: Filecoin leftover remaining go-jsonrpc leftover (059363558429)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after lotus leftover (avoid lotus collision). Official filecoin-project/go-jsonrpc 059363558429. Opened listed auth/{auth,handler}.go, handler.go, server.go, and options_server.go. Do not rematch lotus lib rpcenc leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger JSON-RPC that skips JWT and invokes a wallet method; PermissionedProxy calling a method without the required perm tag.
Result: no user-exploitable finding. Not submitted.
auth.Handlerrequires aBearertoken when one is present.Verifyfailure or a missing Bearer prefix returns 401. No token leaves default perms on the context and continues toNext.PermissionedProxypanics at wrap time if a field lacks a knownpermtag. At call timeHasPermmust match or the method is not invoked and an error is returned.handler.handlelooks up the registered method (or alias) and rejects wrong param counts. This library does not hold FIL. Lotus wallet RPC permission tags live in leftover-loggedlib/rpcenc.
Do not file a permission-tagged JSON-RPC helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Filecoin go-* that official trees still open and are not lotus rematches.
2026-09-03: Filecoin leftover remaining go-fil-markets leftover (6e1b1dc05c39)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-jsonrpc leftover (avoid lotus collision). Official filecoin-project/go-fil-markets 6e1b1dc05c39 (6e1b1dc05c39ea26ecd23c0b245b56c2b9325a9a, merge release/v1.28.3). Opened listed storagemarket/impl/requestvalidation/{unified_request_validator,common}.go, storagemarket/impl/providerstates/provider_states.go, storagemarket/impl/providerutils/providerutils.go, retrievalmarket/impl/requestvalidation/requestvalidation.go, retrievalmarket/impl/providerstates/provider_states.go, retrievalmarket/impl/provider.go, and retrievalmarket/types.go (OutstandingBalance / NextInterval). Do not rematch lotus market leftover or go-data-transfer leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger storage deal that locks another user's market escrow; provider collateral reserved from a non-miner address; retrieval voucher redeem that credits FIL without a paych voucher; data-transfer restart that resumes another peer's deal.
Result: no user-exploitable finding. Not submitted.
ValidateDealProposalcallsVerifyProposal, which CBOR-dumpsClientDealProposal.Proposaland verifiesClientSignatureagainstProposal.Client. Provider must equalenvironment.Address(). PieceCID prefix, duration, collateral bounds, ask price, and piece-size gates reject before accept. Client market-balance and verified DataCap checks are filters only; on-chain lock still happens inPublishDeals.ReserveProviderFundslooks up the miner worker and callsReserveFunds(waddr, Proposal.Provider, ProviderCollateral). It does not touchProposal.Clientescrow.- Storage DT
ValidatePush/ValidatePullbind aStorageDataTransferVoucherand require that proposal CID in the local deal store, matching root CID, and an acceptable deal state. Sender/receiver peer IDs are unused; a guessed proposal CID can only disrupt an in-progress transfer (CommP mismatch / deal fail), not move FIL. - Retrieval
ValidatePushis rejected.validatePullrequires payload CID + selector match, a known piece,CheckDealParamsagainst the ask, and optional custom decisioning. Accept isForcePausewithDataLimit = NextInterval(0)and unseal status whenUnsealPrice > 0. Restart keys the deal as{DealID, OtherPeer}. savePaymentforwardsDealPayment.PaymentVouchertoNode.SavePaymentVoucher. Interval math isOutstandingBalance(fundsReceived, queued, inFinalization)plusDataLimit. This crate does not redeem paych or add market escrow; lotus paych leftover already covers voucher save.
Do not file a signed-proposal storage FSM or interval-gated retrieval voucher as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Filecoin go-* that official trees still open and are not lotus rematches (go-state-types / go-paramfetch / go-commp-utils if still unused).
2026-09-03: Filecoin leftover remaining go-state-types leftover (a31d84b45e42)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-fil-markets leftover (avoid lotus collision). Official filecoin-project/go-state-types a31d84b45e42 (a31d84b45e428ee898175f3e422415bb685d6d1b). Opened listed big/int.go, crypto/signature.go, manifest/manifest.go, builtin/v19/market/{deal,methods,policy}.go, builtin/v19/paych/{paych_types,methods}.go, and builtin/v19/miner/monies.go. Do not rematch builtin-actors leftover or lotus types leftover. No mainnet writes. No exploit PoCs.
Checked for: big.Int CBOR that decodes a stranger amount as larger than serialized; DealProposal.ClientBalanceRequirement that understates escrow; SignedVoucher.SigningBytes that includes the signature so a mutated amount still verifies; InitialPledgeForPower that under-pledges so a stranger sector is undercollateralized.
Result: no user-exploitable finding. Not submitted.
big.Intwrapsmath/big. Nil is treated as 0. CBOR is a byte-string with a 0/1 sign prefix andBigIntMaxSerializedLen128.Divis Go integer division (truncates toward zero). This crate does not move FIL.crypto.Signatureis Type+Data only. CBOR rejects unknown types and empty / overlong payloads. There is no verify helper here.ClientDealProposalis aDealProposalplusClientSignature.ClientBalanceRequirementisClientCollateral + StoragePricePerEpoch * Duration. MarketMethodsand paychMethodsare ABI metadata maps (AddBalance/WithdrawBalance/PublishStorageDeals/UpdateChannelState/Settle/Collect); execution lives in leftover-logged builtin-actors.SignedVoucher.SigningBytescopies the voucher, zerosSignature, then CBOR-encodes. Amount, lane, nonce, and channel address are in the signed payload.InitialPledgeForPowerandPledgePenaltyForTerminationare FIP-0081 / FIP-0098 formulas over smoothed reward and circulating supply, capped atInitialPledgeMaxPerByte * qaPower. A stranger cannot invoke them without a miner actor message.
Do not file a types-and-formula crate as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Filecoin go-* that official trees still open and are not lotus rematches (go-paramfetch / go-commp-utils if still unused).
2026-09-03: Filecoin leftover remaining go-paramfetch leftover (78a1658e6493)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-state-types leftover (avoid lotus collision). Official filecoin-project/go-paramfetch 78a1658e6493 (78a1658e6493ff25f0e3149fd4971051a9d6c945). Opened listed paramfetch.go and paramfetch/paramfetch.go (CLI wrapper). Do not rematch proofs leftover or filecoin-ffi leftover. No mainnet writes. No exploit PoCs.
Checked for: fetched params written without digest check so a stranger gateway can poison sealing; GetParams that spends FIL; path write that overwrites a wallet key from a CID.
Result: no user-exploitable finding. Not submitted.
GetParamsunmarshals caller-supplied JSON maps and GETsIPFS_GATEWAYorhttps://proofs.filecoin.io/ipfs/+ CID. It does not send messages or hold FIL.- After download,
checkFilehashes the file with BLAKE2b-512 and compares the first 16 hex bytes toinfo.Digest. Mismatch removes the file and retries once. TRUST_PARAMS=1skips the digest only for.params(notv28-empty-sector-update*) and logsDO NOT USE IN PRODUCTION. That is an operator opt-in, not a stranger call.- The CLI reads sector size plus two local JSON paths from argv and calls
GetParams. Filename isfilepath.Join(paramdir, name)from the JSON the caller already provided.
Do not file a digest-checked proof-param downloader as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Filecoin go-* that official trees still open and are not lotus rematches (go-commp-utils if still unused).
2026-09-03: Filecoin leftover remaining go-commp-utils leftover (b487eb14c907)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-paramfetch leftover (avoid lotus collision). Official filecoin-project/go-commp-utils b487eb14c907 (b487eb14c907471d730809e484e072b56ae8e437). Opened listed commp.go, commd.go, writer/writer.go, and zerocomm/zerocomm.go. Do not rematch go-fil-commcid leftover or proofs leftover. No mainnet writes. No exploit PoCs.
Checked for: PieceAggregateCommP that accepts a non-power-of-two piece and yields a stranger CommD; GeneratePieceCIDFromFile that hashes fewer bytes than pieceSize; Writer.Sum that returns another payload's PieceCID.
Result: no user-exploitable finding. Not submitted.
GeneratePieceCIDFromFilecopies exactlypieceSizebytes intogo-fil-commp-hashhash.Calcand wraps the digest as a PieceCID. Short reads error.PieceAggregateCommPrejects empty lists, unknown seal proofs, piece size < 128, size > sector, and non-power-of-two sizes. EachPieceCIDmust decode as CommP v1. Equal-size limbs SHA-256-fold withd[31] &= 0b00111111; leftover limbs pad fromzerocomm.PieceComms.Writerbuffers 16 MiB unpadded leaves, hashes them concurrently, pads to a power of two withZeroPieceCommitment, then aggregates. Payload size is the raw write length; PieceCID is the tree root.- This crate does not send messages or hold FIL. On-chain deal verification lives in leftover-logged builtin-actors / market.
Do not file a CommP/CommD hasher as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Filecoin go-* that official trees still open and are not lotus rematches.
2026-09-03: Filecoin leftover remaining go-fil-commp-hashhash leftover (256368516783)
Immunefi program filecoin ($50,000, kyc: true). Official remaining listed after go-commp-utils leftover (avoid lotus collision). Official filecoin-project/go-fil-commp-hashhash 256368516783 (2563685167835b98a40bfade4fbdbdc0f9db376b). Opened listed commp.go (Calc, digestQuads, PadCommP, snapshot helpers). Do not rematch go-commp-utils leftover or go-fil-commcid leftover. No mainnet writes. No exploit PoCs.
Checked for: Digest that returns a CommP for < 65 bytes; Write that overflows MaxPiecePayload and wraps; PadCommP that enlarges a digest without hashing stacked nul padding.
Result: no user-exploitable finding. Not submitted.
Writerejects additional bytes that would exceedMaxPiecePayload.Digesterrors belowMinPiecePayload(65). Residual buffer is zero-padded to 127-byte quads, then FR32-expanded to 128 withbyte[31|63|95] &= 0x3F.- Layer workers SHA-256-fold pairs and mask
d[31] &= 0x3F. Close-of-queue pads withstackedNulPadding. Padded size is rounded up to the next power of two. PadCommPrequires a 32-byte source, power-of-two sizes, source ≤ target, source ≥ 128, target ≤MaxPieceSize. Each step hashes the current digest with the matching nul pad.- This crate implements
hash.Hashonly. It does not send messages or hold FIL.
Do not file an FR32 CommP hasher as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Filecoin go-* that official trees still open and are not lotus rematches.
2026-09-03: Optimism leftover remaining L2 ETH liquidity leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after dispute games leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L2/{ETHLiquidity,SuperchainETHBridge,LiquidityController,NativeAssetLiquidity,L2ToL1MessagePasser,L2ToL2CrossDomainMessenger,FeeVault,WETH,L2CrossDomainMessenger}.sol. Do not rematch L1 portal / StandardBridge leftover or dispute games leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger ETHLiquidity.mint that unlocks preloaded ETH; relayETH that pays a caller-chosen _to without a validated interop SentMessage; initiateWithdrawal that records another user's sender; FeeVault.withdraw that pays msg.sender.
Result: no user-exploitable finding. Not submitted.
ETHLiquidity.mint/burnrequiremsg.sender == SUPERCHAIN_ETH_BRIDGE.NativeAssetLiquiditydeposit/withdraw requireLIQUIDITY_CONTROLLER.LiquidityController.mint/burnrequire themintersmap (owner-authorized).SuperchainETHBridge.sendETHburnsmsg.valueand encodes(msg.sender, _to, msg.value).relayETHrequires the L2-to-L2 messenger andcrossDomainMessageSender == address(this), then mints andSafeSends_to.L2ToL2CrossDomainMessenger.relayMessagerequires_id.originis the messenger,CrossL2Inbox.validateMessage, destination== block.chainid, and a freshsuccessfulMessageshash. Transient sender is the decoded log sender.sendMessageis not payable.L2ToL1MessagePasser.initiateWithdrawalhashesmsg.senderandmsg.value.receive()withdraws tomsg.sender. Permissionlessburn()onlyBurn.eths this contract's balance.FeeVault.withdrawis permissionless but always pays the configuredrecipient(L2SafeCall.sendor L1 withdrawal). Config setters are ProxyAdmin owner.
Do not file a messenger-gated ETH mint or recipient-only fee sweep as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: op-node / op-dispute-mon / PolicyEngineStaking / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana transaction_execution leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after check_transactions leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/transaction_execution.rs, runtime/src/transaction_batch.rs, and runtime/src/transaction_balances.rs. Do not rematch remaining runtime leftover, check_transactions leftover, runtime fee leftover, or vote_reward leftover. No mainnet writes. No exploit PoCs.
Checked for: execute_batch that commits a stranger tx after a processing error; check_block_cost_limits that skips executed cost so a block exceeds limits; unlock_failures that unlocks a still-locked account so a second batch writes the same keys.
Result: no user-exploitable finding. Not submitted.
execute_batchis a validator helper, not a stranger IX.load_execute_and_commit_transactions_with_pre_commit_callbackrunsget_first_errorbefore commit. A processing error (for exampleBlockhashNotFound) cancels the commit; tests showtransaction_countstays 0.- After a successful commit,
get_transaction_costsuses executed CUs and loaded-account size only forOkcommit results.Nonecosts are skipped.check_block_cost_limitstry_adds those costs; exceeding the block limit fails the batch. Replay rejects the entry; this crate does not move lamports. find_and_send_votesandPrioritizationFeeCache::updateonly see committed fee-paying txs. Status send is a channel for RPC/ledger metadata.TransactionBatchlocks match sanitized txs 1:1.unlock_failuresasserts it cannot flip err→ok and only unlocks previously-ok locks that now failed. Drop unlocks remaining locked accounts.compile_collected_balancesrewrites SVM native/token snapshots into status structs. UI amount uses the raw token amount. No credit path.
Do not file a validator batch-execute helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (stakes / epoch_stakes / snapshot_* / bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining PolicyEngineStaking leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after L2 ETH liquidity leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/periphery/staking/PolicyEngineStaking.sol. Do not rematch L1 portal / StandardBridge leftover, dispute games leftover, or L2 ETH liquidity leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger unstake that transfers another account's OP; stake that attributes tokens pulled from a non-sender; setAllowedStaker that moves stakedAmount to the caller.
Result: no user-exploitable finding. Not submitted.
stake/changeBeneficiary/unstakeall keystakingData[msg.sender].safeTransferFrompulls_amountfrommsg.sender.unstakesafeTransfers only tomsg.senderand reverts onInsufficientStake.- A non-self beneficiary requires
allowlist[_beneficiary][msg.sender].setAllowedStakerwritesallowlist[msg.sender][_staker]only. Disallowing a delegated staker moves PEeffectiveStakeback to that staker; it does not transfer tokens. Documented trust: the beneficiary can reset the staker'slastUpdate(ordering-weight grief, not theft). pauseisonlyOwnerand gates stake / beneficiary change. Unstake stays available.uint128add/sub reverts on overflow/underflow.
Do not file a self-keyed stake/unstake periphery as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: op-node / op-dispute-mon / websites if still unused.
2026-09-03: Optimism leftover remaining ETHLockbox leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused L1 money path after L1 portal / StandardBridge leftover (portal leftover did not open ETHLockbox.sol). Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L1/ETHLockbox.sol. Do not rematch L1 portal leftover, dispute games leftover, L2 ETH liquidity leftover, or PolicyEngineStaking leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger unlockETH that donates lockbox ETH to the caller; lockETH that credits a non-portal; migrateLiquidity / receiveLiquidity that drains to an unauthorized lockbox.
Result: no user-exploitable finding. Not submitted.
lockETHandunlockETHrequireauthorizedPortals[msg.sender].unlockETHalso reverts whensystemConfig.paused(), when_value > balance, and whenportal.l2Sender() != DEFAULT_L2_SENDER(blocks unlock during a withdrawal execution). Funds go tosender.donateETH{value: _value}(), notmsg.senderas an EOA.receiveLiquidityrequiresauthorizedLockboxes[msg.sender].authorizePortal/authorizeLockbox/migrateLiquidityare ProxyAdmin owner; authorize/migrate also require a shared ProxyAdmin owner.initializeis ProxyAdmin-gatedreinitializer.- Shared SuperchainConfig is required before a portal is authorized.
Do not file a portal-gated ETH lockbox as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: op-node / op-dispute-mon / websites if still unused.
2026-09-03: Optimism leftover remaining op-dispute-mon leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after PolicyEngineStaking leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed op-dispute-mon/monitor.go, op-dispute-mon/mon/{service,monitor,withdrawals,resolve,claims}.go, and op-dispute-mon/mon/bonds/{monitor,collateral}.go. Do not rematch dispute games leftover (on-chain FaultDisputeGame / DelayedWETH). No mainnet writes. No exploit PoCs.
Checked for: monitor that submits claimCredit for a stranger recipient; Resolve that writes a game status on-chain; bond collateral helper that transfers WETH.
Result: no user-exploitable finding. Not submitted.
WithdrawalMonitor.CheckWithdrawalsandBonds.CheckBondsonly compare in-memoryCredits/WithdrawalRequests/ DelayedWETH balances and record metrics. There is noTransact/claimCreditcall.Resolvewalks a bidirectional claim tree in memory and returnsGameStatus. It does not send a transaction.CalculateRequiredCollateralsums unresolved bonds plus unclaimed credits per DelayedWETH address. It does not move ETH.Servicewires L1/rollup RPC readers, pprof, and the monitor loop. This binary is observational.
Do not file a read-only dispute-game monitor as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: op-node / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana stakes leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after transaction_execution leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/stakes.rs, runtime/src/stakes/serde_stakes.rs, runtime/src/stake_account.rs, runtime/src/stake_delegation.rs, and runtime/src/stake_utils.rs. Do not rematch remaining runtime leftover, partitioned epoch rewards leftover, vote_reward leftover, or transaction_execution leftover. No mainnet writes. No exploit PoCs.
Checked for: upsert_stake_delegation that adds a stranger voter's stake without subtracting the old voter; load_from_deserialized_delegations that accepts a snapshot Delegation that does not match accounts-db; StakeAccount::try_from that wraps a non-stake owner as a Delegation.
Result: no user-exploitable finding. Not submitted.
StakesCacheis a validator cache, not a stranger IX.check_and_storeevicts zero-lamport vote/stake accounts. Non-vote/non-stake owners are ignored. Invalid vote or stake state is removed from the cache.upsert_stake_delegationinserts the newStakeAccount, then on replacesub_delegated_stake/vote_accounts.sub_stakethe old voter and add the new voter only when voter or effective stake changed.sub_delegated_stakechecked_subs and panics if the cache is inconsistent.load_from_deserialized_delegationsreloads each stake fromget_account, requiresStakeAccount::try_from, and errorsInvalidDelegationif the stored Delegation differs. Cached vote accounts must equal accounts-db orVoteAccountMismatch.StakeAccount::try_fromrequires the stake program owner and aStakeStateV2with a Delegation. Serde writes Delegation/Stake only; it does not credit lamports.stake_delegationis warmup/cooldown dispatch (stakevsstake_v2).create_stake_accountis test/CLI only.
Do not file a validator stake-cache upsert as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (epoch_stakes / snapshot_* / bank.rs / stake_weighted_timestamp) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining op-node deposits + withdrawals leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-dispute-mon leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed op-node/withdrawals/{proof,utils}.go, op-node/rollup/output_root.go, and op-node/rollup/derive/{deposit_log,deposits,deposit_source,attributes}.go. Do not rematch L1 portal leftover or L2ToL1MessagePasser leftover. No mainnet writes. No exploit PoCs.
Checked for: UserDeposits that accepts a log from a non-portal address; UnmarshalDepositLogEvent that lets a stranger set From / Mint without matching topics; GetWithdrawalProof that returns a storage proof for a hash that does not match the event.
Result: no user-exploitable finding. Not submitted.
UserDepositsskips failed receipts and requireslog.Address == DepositContractAddressplusTopics[0] == TransactionDeposited.UnmarshalDepositLogEventrequires 4 topics, version 0, and a tightly packed opaqueData header.From/Tocome from indexed topics.SourceHashis keccak(domain 0 || keccak(L1 block hash || log index)).PreparePayloadAttributesfetches receipts only when the L1 origin changes, requires parent-hash continuity, and treats deposit-decode failure as critical. Deposits are prepended after the L1-info tx; this helper does not send an L1 transaction.WithdrawalHashABI-encodes(nonce, sender, target, value, gasLimit, data).GetWithdrawalProofrequires that hash equalsev.WithdrawalHash, thenVerifyProofagainst the L2 header state root for the MessagePasser slot.ComputeL2OutputRoothashes version-0(stateRoot, messagePasserStorageRoot, blockHash).- This package builds proofs and payload attributes. On-chain prove/finalize lives in leftover-logged OptimismPortal2.
Do not file a receipt-gated deposit decoder or MPT-verified withdrawal helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node (engine / p2p / sequencing) / websites if still unused.
2026-09-03: Optimism leftover remaining op-node engine leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-node deposits + withdrawals leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed op-node/rollup/engine/{api,payload_process,payload_success,build_start,build_seal,payloads_queue,build_invalid}.go. Do not rematch deposits leftover. No mainnet writes. No exploit PoCs.
Checked for: processNewPayload that inserts a denied or invalid payload as safe; CommitBlock that applies a stranger envelope without an execution-valid status; PayloadsQueue.Push that evicts a later block in favor of a conflicting older one.
Result: no user-exploitable finding. Not submitted.
processNewPayloadchecks SuperAuthority denylist (denied derived payloads request deposits-only replacement; denied unsafe payloads are dropped), thenNewPayload. OnlyExecutionValidcontinues. Invalid Holocene derived payloads also request deposits-only.ProcessPayloaddrops a stale seal whose parent is not the current unsafe head.sealBuildrequires a non-empty payload, first tx type deposit, and no deposit after a non-deposit.SealBuildalso drops if parent ≠ unsafe head.PayloadsQueuerejects nil/duplicate hashes and payloads larger thanMaxSize. Overflow pops lowest block numbers first.DropInapplicableUnsafePayloadsdrops hashes already processed, numbers ≤ safe/unsafe, and next-height payloads that do not parent the unsafe head.CommitBlocktakes aSignedExecutionPayloadEnvelopebut verifies execution viaNewPayloadin this file; signature checks live in the sequencer RPC/signer layer, not here. This package does not send L1 transactions.
Do not file an engine-API payload inserter as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node (p2p / sequencing) / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana epoch_stakes leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after stakes leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/epoch_stakes.rs and runtime/src/stake_history.rs. Do not rematch stakes leftover, remaining runtime leftover, partitioned epoch rewards leftover, or vote_reward leftover. No mainnet writes. No exploit PoCs.
Checked for: parse_epoch_vote_accounts that attributes another node's stake; BLSPubkeyToRankMap that ranks a duplicate BLS key as a stranger validator; snapshot deserialize that injects leftover-ignored delegations as extra vote weight.
Result: no user-exploitable finding. Not submitted.
VersionedEpochStakesis a validator epoch snapshot, not a stranger IX.newcopies vote accounts from leftover-loggedStakesCacheand sums delegated stake. Zero-stake vote accounts are skipped for node/voter maps. Authorized voters come fromvote_state.get_authorized_voter(leader_schedule_epoch).BLSPubkeyToRankMapkeeps onlyNonZerostake, a unique BLS pubkey, and a unique node pubkey. Duplicates are dropped. Rank is stake descending then compressed BLS key. PoP is assumed already verified on the vote state (new_unchecked).set_total_stakeisdev-context-only-utils. Snapshot serde writes an emptystake_delegationslist; deserialize visits and discards that sequence.StakeHistoryis a clone-on-write wrapper around the SDK type. It does not credit lamports.
Do not file an epoch vote-weight snapshot as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (snapshot_* / bank.rs / stake_weighted_timestamp) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining op-node p2p leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-node engine leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed op-node/p2p/{gossip,signer,sync,filter,node}.go. Extract /tmp/op-p2p/. Do not rematch deposits leftover, withdrawals leftover, or engine leftover. No mainnet writes. No exploit PoCs.
Checked for: gossip that accepts an unsigned or stranger-signed payload as the next unsafe head; snappy that expands into a zip-bomb; req/resp sync that inserts a peer-supplied payload as safe; a self-published loop that re-ingests our own gossip as a new tip.
Result: no user-exploitable finding. Not submitted.
BuildBlocksValidatorrejects invalid snappy, decoded length abovemaxGossipSize(10 MiB) or belowminGossipSize(66), then requires a compact secp256k1 signature over the remaining bytes viaverifyBlockSignature. Current sequencer address must verify; previous signer is allowed only during the rotation grace period. Empty current sequencer address isIGNORE, not accept.- After signature, SSZ decode is version-gated. Timestamp must be within the configured past threshold and no more than 5 seconds in the future.
CheckBlockHashmust match. Topic versions reject mismatched withdrawals / blob-gas / parent-beacon-root / withdrawals-root. LRUseenBlocksignores a duplicate hash and rejects more than 5 distinct hashes at the same height. FilterSelfdrops gossip whosefromis this host.signer.gois a thinBlockSignerwrapper and does not publish.- Req/resp client insert is gone.
NewNodeP2Ponly registers a serving handler whenReqRespSyncEnabledand anL2Chainsource exist.handleSyncRequestrate-limits globally and per peer, rejects numbers before genesis or afterTargetBlockNumber(now), and servesPayloadByNumberfrom the local chain. It does not insert the request body as a payload. - This package does not send L1 transactions or mutate balances.
Do not file a gossip or req/resp handler as stranger theft of L2 ETH.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node sequencing (rollup/sequencing) / websites if still unused.
2026-09-03: Optimism leftover remaining op-node sequencing leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-node p2p leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed op-node/rollup/sequencing/{sequencer,origin_selector,engine_iface,iface,disabled}.go. Extract /tmp/op-seq/. Do not rematch deposits leftover, engine leftover, or p2p leftover. No mainnet writes. No exploit PoCs.
Checked for: FindL1Origin that adopts a stranger or future L1 hash so deposits mint to a caller; startBuildingBlock that injects extra attributes; RunAction that commits a gossiped stranger envelope as the next unsafe head.
Result: no user-exploitable finding. Not submitted.
FindL1Origin/findL1OriginOfNextL2BlockrequirecurrentL1Origin.Hash == l2Head.L1Origin.Hash. A next origin must be the immediate child (ParentHashmatch). A future L1 (negative drift) is not adopted. Missing next origin stays on current unless sequencer drift would be exceeded, then it fetchescurrent.Number+1by number from the L1 source. Orphaned next origin and hash mismatch emit reset, not a built block.startBuildingBlockbuilds attributes viaPreparePayloadAttributes(l2Head, l1Origin.ID())(deposit decode already reviewed).NoTxPoolis forced past max sequencer drift, on fork-activation blocks, and in recover mode.StartBuildis dropped on stale parent or invalid attributes.RunActionseals only the in-flight job, thenconductor.CommitUnsafePayload, then gossip, thenProcessPayload. Stale / denied / invalid payloads are dropped. The async-gossip buffer is a previously sealed local payload, not a peer insert.DisabledSequenceris a no-op.- This package does not send L1 transactions or mutate user balances. It is sequencer-operator local.
Do not file an origin-selector or seal loop as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining op-node websites / other unused official leftovers if still open.
2026-09-03: Jito leftover remaining jito-solana stake_weighted_timestamp leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after epoch_stakes leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/stake_weighted_timestamp.rs. Do not rematch epoch_stakes leftover, stakes leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: a low-stake vote timestamp that moves the cluster clock; an unknown vote pubkey that contributes stake; a clamp that lets an estimate escape PoH bounds and credit lamports.
Result: no user-exploitable finding. Not submitted.
calculate_stake_weighted_timestampis a validator helper, not a stranger IX. It builds a stake-weighted median of vote timestamps. Each estimate is that vote's timestamp plus elapsed slots from the vote slot to the current slot.- Unknown vote pubkeys contribute 0 stake.
total_stake == 0returnsNone. - Low-stake outliers cannot move the median. Tests show 0.00003% stake cannot shift the timestamp;
i64::MAX/0outliers are ignored unless they hold more than half of available stake (by design). - When
epoch_start_timestampis present, the estimate is clamped to the PoH offset ±MaxAllowableDrift(fast25%,slow150% v2). Add and subtract saturate. - The helper does not credit lamports. Clock skew with majority stake is consensus, then still PoH-bounded.
Do not file a stake-weighted clock helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (snapshot_* / bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining op-reth leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-node sequencing leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed rust/op-reth/crates/payload/src/{builder,payload,validator,lib,traits,config}.rs and rust/op-reth/crates/rpc/src/{engine,sequencer,miner}.rs. Extract /tmp/op-reth/. Do not rematch op-node engine leftover or sequencing leftover. No mainnet writes. No exploit PoCs.
Checked for: engine_newPayload that inserts a stranger envelope as canonical without JWT; a builder that mints deposits from the txpool; a sequencer RPC helper that pays a caller.
Result: no user-exploitable finding. Not submitted.
OpEngineApidocuments a JWT auth layer and wrapsEngineApi.newPayloadV2/V3/V4convert intoOpExecDataand call the metered inner. This is consensus-to-execution, not a public user entry.ensure_well_formed_payloadrequirestry_into_checked_block(claimed hash match), then Shanghai / Cancun sidecar / Prague field gates.OpPayloadBuilderexecutes sequencer transactions from payload attributes only.no_tx_poolskips the pool. Pool inclusion rejects EIP-4844 and deposit txs. Invalid sequencer txs are skipped; blob sequencer txs abort the build.SequencerClientforwardseth_sendRawTransaction/ Conditional to a configured sequencer URL.OpMinerExtApionly mutates operator DA/gas config.- These crates do not send L1 transactions or mutate user balances.
Do not file an engine-API or payload builder as stranger theft of L2 ETH.
Not submitted. Payment requires user KYC. Remaining listed: flashblocks leftover is logged; unused official leftovers if still open.
2026-09-03: Jito leftover remaining jito-solana serde_snapshot leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after stake_weighted_timestamp leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/serde_snapshot.rs, runtime/src/bank/serde_snapshot.rs, and runtime/src/serde_snapshot/{obsolete_accounts,status_cache,storage,storages_list,types}.rs. Do not rematch stake_weighted_timestamp leftover, epoch_stakes leftover, stakes leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: snapshot deserialize that injects extra lamports; remapped storage that rewrites another account's bytes; obsolete-account restore that resurrects a spent account as live; status-cache deserialize that marks a stranger tx executed so a replay credits.
Result: no user-exploitable finding. Not submitted.
- This is a validator snapshot reconstruct helper, not a stranger IX.
bank/serde_snapshot.rsis tests only (roundtrip). - Wire
AccountsDbFieldskeep the storage-entry map for ABI only; reconstruct uses already-unpacked localStorageAndNextAccountsFileId.reconstruct_accountsdb_from_fieldsgenerate_indexs those files and returns a calculated capitalization and accounts lt hash for later verify. reconstruct_single_storagetakes length from on-disk file size. Obsolete accounts must match the file id orMismatchedAccountsFileId. Archive restore passesNoneobsolete accounts.remap_append_vec_fileremaps colliding IDs (renameat2(NOREPLACE)on linux gnu). It does not rewrite account bytes.StoragesListis a local-only fastboot prune list.- Status-cache snapshot stores
Okas()and errors as metadata. Extra fields requireaccounts_lt_hash. Unused incremental capitalization is_unused. - Snapshot
capitalizationis a field copy. A forged snapshot is not a credit path; bank-hash / lt-hash verify is after this crate.
Do not file a snapshot reconstruct helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (snapshot_utils / snapshot_bank_utils / snapshot_controller / snapshot_minimizer / snapshot_package / bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana snapshot_controller leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after serde_snapshot leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/snapshot_controller.rs, runtime/src/snapshot_package.rs, and runtime/src/snapshot_package/compare.rs. Do not rematch serde_snapshot leftover or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: handle_new_roots that snapshots a stranger bank so a later load credits extra lamports; SnapshotPackage::new that hashes a caller-supplied storage set; compare helpers that promote an incremental package over a full one so a stale state is packed.
Result: no user-exploitable finding. Not submitted.
SnapshotControlleris a validator helper, not a stranger IX.handle_new_rootswalks already-rooted local banks. A slot at or belowlatest_abs_request_slotis skipped. Full interval wins over incremental; either wins over fastboot. It squashes that bank, copiesroot_slot_deltas, and sends aSnapshotRequeston an internal channel.SnapshotPackage::newcopiesbank.get_fields_to_serialize(), bank-hash stats, and the provided storages. Incremental archives assertslot > base.hashis the accounts lt-hash checksum.default_for_testsisdev-context-only-utils.compare.rsis packager priority only: full archive > incremental > fastboot, then slot. Same-kind incrementals ignore the base slot. No account bytes move.
Do not file a snapshot request or package wrapper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (snapshot_utils / snapshot_bank_utils / snapshot_minimizer / bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining op-reth consensus leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-reth leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed rust/op-reth/crates/consensus/src/{lib,proof,error}.rs, rust/op-reth/crates/consensus/src/validation/{mod,canyon,isthmus}.rs, and rust/op-reth/crates/txpool/src/{validator,pool,maintain,transaction,lib,error,interop}.rs. Extract /tmp/op-reth2/. Do not rematch op-reth leftover (payload / engine RPC). No mainnet writes. No exploit PoCs.
Checked for: consensus that accepts a stranger withdrawal as L1 ETH; a receipt-root helper that credits a caller; a txpool validator that admits a deposit typed as a user tx and mints.
Result: no user-exploitable finding. Not submitted.
OpBeaconConsensusis read-only header/body validation: ommers empty, tx root, Canyon empty Shanghai withdrawals and empty withdrawals root, Ecotone excess-blob-gas 0, Isthmuswithdrawals_rootpresent. Post-execution compares receipt root / logs bloom / gas used (Jovian DA footprint too).- Isthmus
verify_withdrawals_rootchecks the header field against theL2ToL1MessagePasserstorage root after execution. Canyon forbids non-empty body withdrawals. This is not a withdraw-to-caller path. - Receipt-root helpers strip deposit nonce only in the Regolith-before-Canyon window to match op-geth. They do not transfer value.
OpTransactionValidatorrejects EIP-4844, reservesL1_INFO_GAS_OVERHEADso a user tx cannot consume the full block gas, and requires sender balance to cover L2 cost plus L1 data fee plus Isthmus/Jovian operator fee. Interop comment: deposits do not enter the pool.OpPoolwraps/filters; it does not mint.
Do not file a consensus receipt root or txpool admission as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: flashblocks leftover is logged; unused official leftovers if still open.
2026-09-03: Jito leftover remaining jito-solana snapshot_minimizer leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after snapshot_controller leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/snapshot_minimizer.rs. Do not rematch snapshot_controller leftover, serde_snapshot leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: minimize that keeps a stranger account so a later load credits extra lamports; filter_storage that rewrites another pubkey's bytes; set_capitalization_for_tests that inflates capitalization above remaining accounts.
Result: no user-exploitable finding. Not submitted.
- The file is
#![cfg(feature = "dev-context-only-utils")]. It is a test/dev snapshot shrinker, not a stranger IX and not on the production validator path. minimizekeeps transaction accounts plus features, static/reserved ids, vote/node, stake, owners, and upgradeable programdata. It thenpurge_keys_exacts others, drops dead slots, flushes cache, and sets capitalization fromcalculate_capitalization_for_tests(remaining accounts only). Optional lt-hash recalculation is the same test helper.filter_storagekeeps stored accounts whose pubkey is in the keep set. Snapshot slot itself is left untouched. Dead storages are dropped after shrink. No credit path.
Do not file a test-only snapshot shrinker as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (snapshot_utils / snapshot_bank_utils / bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining websites leftover
Immunefi program optimism ($2,000,042, kyc: true). Official remaining listed after op-reth consensus leftover. Listed websites_and_applications assets. Live fetch 2026-09-03 via Firecrawl + HEAD. Do not rematch op-reth leftover or L1 portal leftover. No mainnet writes. No exploit PoCs.
Opened: https://app.optimism.io/ (serves /bridge/deposit), https://www.optimism.io/, https://console.optimism.io/, https://docs.optimism.io/, plus HEAD of community.optimism.io (→ docs governance), specs.optimism.io, gateway.optimism.io (→ app.optimism.io), jobs.optimism.io (→ careers), enterprise.optimism.io.
Checked for: an official page that asks for a seed phrase or private key; a first-party wallet connect that signs a stranger transfer; a faucet or bridge UI that drains a connected mainnet wallet.
Result: no user-exploitable finding. Not submitted.
app.optimism.iois a terms gate plus a link to Superbridge (superbridge.app/optimism). Copy says they will never ask for keys. Third-party bridges are labeled as independent.gateway.optimism.ioredirects here.www.optimism.iois marketing / enterprise scheduling. No wallet connect.console.optimism.iois a developer console (faucet, relayer, templates). Sign-in is Privy. Faucet is test ETH. Superchain Safe is a separate welcome URL. Docs and specs are documentation.- These pages do not custody user funds or submit L1 withdrawals.
Do not file a third-party Superbridge link as an official first-party drain.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftovers on other standing programs if still open.
2026-09-03: Jito leftover remaining jito-solana snapshot_utils leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after snapshot_minimizer leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/snapshot_utils.rs and runtime/src/snapshot_utils/snapshot_storage_rebuilder.rs. Do not rematch snapshot_minimizer leftover, snapshot_controller leftover, or serde_snapshot leftover. No mainnet writes. No exploit PoCs.
Checked for: unarchive that injects extra account files so a later load credits lamports; incremental archive that pairs with the wrong full snapshot; prune that deletes a live storage so a replay resurrects a spent account; deserialize that accepts a truncated or oversized snapshot as complete.
Result: no user-exploitable finding. Not submitted.
- This is validator snapshot I/O around leftover-logged serde_snapshot reconstruct, not a stranger IX.
serialize_snapshotwrites bank fields via leftover-loggedserialize_bank_snapshot_into_wincode, plus status cache, version, optional obsolete accounts and storages list. - Deserialize is size-capped (
MAX_SNAPSHOT_DATA_FILE_SIZE32 GiB; obsolete 12 GiB; storages list 100 MiB) and requires the stream to consume the whole file. Incremental archives must havebase_slot ==the full snapshot slot. - Archive unpack remaps via leftover-logged
remap_and_reconstruct_single_storageand passesNoneobsolete accounts. Fastboot dir load uses leftover-loggedreconstruct_single_storageand prunes account-path files not in the storages list. The rebuilder errors if a slot already has a storage. - Purge helpers delete old local archives/dirs. No credit path.
Do not file snapshot archive I/O as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (snapshot_bank_utils / bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana snapshot_bank_utils leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after snapshot_utils leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/snapshot_bank_utils.rs. Do not rematch snapshot_utils leftover, serde_snapshot leftover, or snapshot_controller leftover. No mainnet writes. No exploit PoCs.
Checked for: bank_from_snapshot_archives that accepts a snapshot whose capitalization exceeds indexed lamports; status-cache deltas that mark a stranger tx executed; incremental load that skips slot-hash verify; bank_to_*_snapshot_archive that packs a caller-supplied storage set.
Result: no user-exploitable finding. Not submitted.
- This is validator snapshot load/pack around leftover-logged snapshot_utils + serde_snapshot reconstruct, not a stranger IX. Archive load unarchives then
reconstruct_bank_from_fields. Dir load uses leftover-loggedrebuild_storages_from_snapshot_dir. - After rebuild,
bank.capitalization()must equalgenerate_indexcalculated capitalization unlesslimit_load_slot_count_from_snapshotis set. Tests showgood+1failsMismatchedCapitalization. verify_epoch_stakesrejects epochs above the leader-schedule epoch and requires current..=leader-schedule stakes.verify_slot_deltasrequires roots,slot <= bank, unique entries, and a two-way match with SlotHistory. Archive load also checks snapshot slot+hash, thenverify_snapshot_bankagainst the calculated lt hash (panic if fail).- Status cache is leftover-logged deserialize + append after those checks.
bank_to_full/incremental_snapshot_archiveis ledger-tool/tests: squash/rehash/clean, then leftover-logged serialize+archive. Incremental assertsslot > full_snapshot_slot. No credit path.
Do not file a snapshot load verify helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana accounts_background_service leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after snapshot_bank_utils leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/accounts_background_service.rs and runtime/src/accounts_background_service/pending_snapshot_packages.rs. Do not rematch snapshot_bank_utils leftover, snapshot_controller leftover, or snapshot_package leftover. No mainnet writes. No exploit PoCs.
Checked for: handle_snapshot_request that packages a stranger bank so a later load credits extra lamports; pending-queue overwrite that swaps a full archive for an older incremental; pruned-bank handler that drops a still-live account.
Result: no user-exploitable finding. Not submitted.
- This is a validator background helper, not a stranger IX.
handle_snapshot_requestflushes, cleans, and shrinks the already-rooted local bank, then builds a leftover-loggedSnapshotPackageandpushes it. A full snapshot updatesset_latest_full_snapshot_slotfor zero-lamport handling. - Multiple queued requests pick leftover-logged priority (full > incremental > fastboot, then slot). Older slots are dropped; newer slots are re-enqueued.
PendingSnapshotPackageskeeps one package per kind. A newer same-kind package overwrites; an older one panics.popprefers full; an incremental is re-queued only if its slot is greater than the full and its base slot is at least the full.PrunedBanksRequestHandleronly receives dropped(slot, bank_id)pairs. No credit path.
Do not file a snapshot-request background worker as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank.rs / status_cache / bank_forks) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining CCIP Solana leftover (c73892d)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after CCIP EVM leftover / VRF leftover. Official smartcontractkit/chainlink-ccip c73892d (c73892d4d33926195eee87b77013883e650a833c). Opened listed chains/solana/contracts/programs/{lockrelease-token-pool,burnmint-token-pool,ccip-offramp,ccip-router}/src/lib.rs plus lockrelease context.rs. Extract /tmp/ccip-sol/. Do not rematch CCIP EVM leftover. No mainnet writes. No exploit PoCs.
Checked for: release_or_mint_tokens that pays a stranger; withdraw_liquidity that drains the pool to the caller; execute that mints without an allowed offramp.
Result: no user-exploitable finding. Not submitted.
- Lockrelease
TokenOfframp.authorityis the offramp PDA (EXTERNAL_TOKEN_POOLS_SIGNER).allowed_offrampmust be a router-owned PDA for(remote_chain_selector, offramp_program).validate_release_or_mintthen rate-limits and RMN-curses beforerelease_tokenstorelease_or_mint.receiver. - Onramp
lock_or_burnrequiresauthority == state.config.router_onramp_authority. Config / router / RMN / allow-list mutators are owner or upgrade-authority gated. withdraw_liquidity/provide_liquidityrequireauthority == state.config.rebalancerandcan_accept_liquidity. Burnmint mint/burn uses the same validate helpers; mint authority transfer is owner/multisig path.- Offramp
commit/execute/manually_executetake OCR report context. Routerccip_sendis the sender-initiated lock path, not a stranger mint.
Do not file a pool release as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink CCIP Sui / Aptos / chainlink-evm / OCR / core node / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana status_cache leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after accounts_background_service leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/status_cache.rs. Do not rematch serde_snapshot leftover (snapshot status-cache serde) or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: insert that marks a stranger signature processed so a replay credits twice; get_status that matches a key on a non-ancestor fork; append that injects a snapshot delta as a live credit.
Result: no user-exploitable finding. Not submitted.
- This is an in-memory replay/RPC status cache, not a stranger IX. Keys are 20-byte slices of the tx key.
Tis typicallyResult<(), TransactionError>metadata. The cache does not move lamports. get_statusonly returns an entry whose slot is inancestorsorroots.insertrecords(slot, result)and a slot-delta used for snapshots. Duplicate same-slot keys can appear on a dead slot (sig-verify vs execute);clear_slot_entriesdrops that slot.add_root/purge_rootskeep at mostMAX_RECENT_BLOCKHASHESroots and drop older cache/delta entries.appendis the snapshot rebuild path leftover-logged in serde_snapshot leftover.root_slot_deltasserializes rooted slots only. No credit path.
Do not file a replay status cache as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank.rs / bank_forks) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining CCIP Sui leftover (c365ae0)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after CCIP Solana leftover. Official smartcontractkit/chainlink-sui c365ae0 (c365ae00c332b14a68db1138aefe315b47c77bd6). Opened listed contracts/ccip/ccip_offramp/sources/offramp.move, ccip_onramp/sources/onramp.move, ccip_router/sources/router.move, ccip_token_pools/lock_release_token_pool/sources/{lock_release_token_pool,token_pool}.move, ccip_token_pools/burn_mint_token_pool/sources/burn_mint_token_pool.move. Extract /tmp/ccip-sui/. Do not rematch CCIP Solana leftover or CCIP EVM leftover. No mainnet writes. No exploit PoCs.
Checked for: release_or_mint that pays the caller; withdraw_liquidity without a rebalancer cap; init_execute that mints from an uncommitted merkle root.
Result: no user-exploitable finding. Not submitted.
- Lockrelease
release_or_mintreads dest data from offrampReceiverParams, validates dest token / remote pool / RMN curse / inbound rate limit, then splits the reserve totoken_receiver. Completion takes this module'sTypeProof.lock_or_burnjoins the sender'sCoinafter allowlist / curse / outbound rate-limit checks. withdraw_liquidity/provide_liquidityrequireRebalancerCapmatchingstate.rebalancer_cap_id. Owner / MCMS paths are cap-gated.- Offramp
commit/init_executego through OCR3transmit.pre_execute_single_reportrequires a merkle root already committed (manual path waits the enable window), dest-chain match, untouched sequence, and dest-transfer cap. Routerset_on_rampsis owner/MCMS. Onrampccip_sendis the sender-initiated path.
Do not file a Sui pool release as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink CCIP Aptos / chainlink-evm / OCR / core node / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana bank_forks leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after status_cache leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/bank_forks.rs. Do not rematch status_cache leftover, snapshot_controller leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: insert that replaces a rooted bank so a later replay credits extra lamports; set_root that keeps a stranger fork as canonical; get_with_checked_hash that returns a bank whose hash does not match.
Result: no user-exploitable finding. Not submitted.
- This is an in-memory fork DAG, not a stranger IX.
insertasserts the slot is new, records descendants, and updates the working (highest) bank.get_with_checked_hashassertsbank.hash() == expected_hash. set_rootstores the already-present root bank, calls leftover-loggedSnapshotController::handle_new_roots(or squashes), thenprune_non_rooted. Kept slots are the root, descendants of the root, and slots betweenhighest_super_majority_rootand root that have the new root as a descendant (RPC commitment).clear_bank/dump_slotsremove local unrooted banks and signatures. Epoch-boundary rooting only clears the epoch-rewards cache and advances Alpenglow migration status. No credit path.
Do not file a fork-DAG helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank.rs) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining CCIP Aptos leftover (2cb9bad)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after CCIP Sui leftover. Official smartcontractkit/chainlink-aptos 2cb9bad (2cb9bad4c49eae682d6da957a1cc6d93662b3844). Opened listed contracts/ccip/ccip_offramp/sources/offramp.move, ccip_onramp/sources/onramp.move, ccip_router/sources/router.move, ccip_token_pools/lock_release_token_pool/sources/lock_release_token_pool.move, ccip_token_pools/burn_mint_token_pool/sources/burn_mint_token_pool.move, ccip_token_pools/token_pool/sources/token_pool.move. Extract /tmp/ccip-aptos/. Do not rematch CCIP Solana leftover or CCIP Sui leftover. No mainnet writes. No exploit PoCs.
Checked for: release_or_mint that pays the caller; withdraw_liquidity without a rebalancer; execute that mints from an uncommitted merkle root.
Result: no user-exploitable finding. Not submitted.
- Lockrelease
release_or_mint/lock_or_burnabort unless invoked viatoken_admin_registry(CallbackProof). Validate dest token / remote pool / RMN curse / rate limit, then withdraw from the pool store.withdraw_liquidity/provide_liquiditycallassert_is_rebalancer. - Offramp
commit/executego through OCR3transmit.execute_single_reportrequires a committed merkle root (manual path waits the enable window), dest-chain match, and untouched sequence. Onrampccip_sendis the sender-initiated lock path.
Do not file an Aptos pool release as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink chainlink-evm / OCR / core node / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana non_circulating_supply leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after bank_forks leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/non_circulating_supply.rs. Do not rematch remaining runtime leftover, bank_forks leftover, or snapshot_bank_utils leftover. No mainnet writes. No exploit PoCs.
Checked for: calculate_non_circulating_supply that subtracts a stranger's circulating balance so a later credit looks like inflation; hardcoded non_circulating_accounts / withdraw_authority lists that a stranger can join to hide stolen lamports as supply math; unwrap_or_default on stake state that treats a funded account as unlocked so a withdraw credits extra.
Result: no user-exploitable finding. Not submitted.
- This is an RPC/metrics circulating-supply helper, not a stranger IX. It does not move lamports. It sums
bank.get_balanceover a HashSet and returns the set. - The set starts as a hardcoded mainnet-beta foundation/team pubkey list. Stake accounts owned by the stake program are added only when
InitializedorStakemetadata has a lockup still in force onbank.clock(), or the withdrawer is on the hardcoded autostakewithdraw_authoritylist. Corrupt stake state usesunwrap_or_default()→Uninitializedand is skipped (can undercount non-circulating; does not credit anyone). - Program-id index scan still re-filters
account.owner() == stake::program::id()so zero-lamport wiped defaults are not treated as stake. sum()of balances is reporting only. A forged list would require a source change. Sending lamports to a listed pubkey only changes the reported circulating number.- Tests: genesis non-circulating + locked stakes are counted; advancing one epoch unlocks the test stakes so they drop out of the set.
Do not file a circulating-supply reporter as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (validated_reward_certificate / validated_block_finalization / bank.rs money-path subset / bank/fee_distribution) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining chainlink-evm payments leftover (b274ca1)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after CCIP Aptos leftover / VRF leftover. Official smartcontractkit/chainlink-evm b274ca1 (b274ca1ca00559ad434ca8f43026b16a6a196242). Opened listed contracts/src/v0.8/payments/{PaymentTokenOnRamp,EmergencyWithdrawer,PausableWithAccessControl}.sol plus libraries/{Common,Errors,Roles}.sol and interfaces/{IFeeWithdrawer,IPausable}.sol. Extract /tmp/cl-pay/. Do not rematch VRF leftover or CCIP EVM leftover. No mainnet writes. No exploit PoCs.
Checked for: submitPaymentRequests that pulls a stranger's tokens without a validator signature; withdrawFeeTokens that pays the caller; emergencyWithdraw that drains while unpaused.
Result: no user-exploitable finding. Not submitted.
submitPaymentRequestsis permissionless but only afterecrecoverof a digest bound totypeAndVersion,i_chainSelector,address(this),requestId,deadline,fundingAddress, andtokenAmounts. The signer must holdPAYMENT_VALIDATOR_ROLE. Transfers aresafeTransferFrom(fundingAddress, address(this), amount), not tomsg.sender.requestIdis unique viaEnumerableSet.add. Expired / empty / zero-amount / zero-funder requests revert.ECDSA_RECOVERY_Vis fixed at 27 so a flipped(r,s*)withv=28does not recover the validator.- Constructor grants validators only for non-zero addresses.
ecrecoverfailure yieldsaddress(0), which is not a validator. Pause / unpause arePAUSER_ROLE/UNPAUSER_ROLE. withdrawFeeTokensis permissionless and onlysafeTransfers the contract's balance tos_feeAggregator.setFeeAggregatorisDEFAULT_ADMIN_ROLEand rejects zero / unchanged.emergencyWithdraw/emergencyWithdrawNativerequirewhenPausedandDEFAULT_ADMIN_ROLE. Native / ERC20 helpers reject zero recipient or zero amount.
Do not file a validator-signed pull or aggregator fee sweep as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink automation-cre / llo-feeds / operatorforwarder / OCR / core node / websites if still unused.
2026-09-03: Chainlink leftover remaining chainlink-evm automation-cre leftover (b274ca1)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after payments leftover. Official smartcontractkit/chainlink-evm b274ca1 (b274ca1ca00559ad434ca8f43026b16a6a196242). Opened listed contracts/src/v0.8/automation-cre/{AutomationReceiver,EthBalanceMonitor,ReceiverTemplate,IReceiver}.sol. Extract /tmp/cl-acre/. Do not rematch payments leftover or VRF leftover. No mainnet writes. No exploit PoCs.
Checked for: topUp that pays the caller; withdraw that drains without owner; onReport that executes an unallowlisted target so a stranger pulls ETH.
Result: no user-exploitable finding. Not submitted.
EthBalanceMonitor.topUpis permissionless while unpaused, but only.sendstopUpAmountWeito an owner-set watchlist address that is active, underminBalanceWei, and pastminWaitPeriod. Recipients cannot add themselves..sendforwards 2300 gas so the recipient cannot reenter beforelastTopUpTimestampis written.performUpkeepisonlyKeeperRegistry.withdraw/setWatchList/ pause / registry address areonlyOwner.AutomationReceiver._processReportrejects a zero forwarder (closesReceiverTemplate.setForwarderAddress(0)) and requires a complete workflow identity (workflowIdor both owner + name).onReportstill requiresmsg.sender == s_forwarderAddresswhen the forwarder is set. The outbound call is closed-by-default:(target, selector)must be owner-allowlisted; zero target / missing selector revert. Failed allowed calls emitCallFailedand consume the report. Pause / allowlist / gas-limit / block-number checks are owner-only.
Do not file a watchlist top-up or CRE-forwarded allowlisted call as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink llo-feeds / operatorforwarder / OCR / core node / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana validated_reward_certificate leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after non_circulating_supply leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/validated_reward_certificate.rs. Do not rematch vote_reward leftover, partitioned epoch rewards leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: try_new that accepts a stranger skip/notar cert and inserts an arbitrary vote pubkey so a later reward credit pays the caller; try_new_for_leader that skips BLS verify and builds a reward set from attacker-supplied pubkeys; extract_slot that accepts a Tower-era slot so a pre-migration cert pays twice.
Result: no user-exploitable finding. Not submitted.
- This is an Alpenglow reward-cert validator, not a stranger IX. It does not move lamports. Success returns
ValidatedRewardCert { validators, reward_slot }orNone. extract_slotrequires skip and notar to name the same slot,current_slot == reward_slot + NUM_SLOTS_FOR_REWARD, andreward_slot >the Alpenglow migration slot. Missing both certs →Ok(None). Tests reject Tower / migration-slot rewards.try_newloads the slot's leftover-logged epoch-stakes rank map.verify_base2checks the skip/notar BLS aggregate against that map. A validator pubkey is inserted only whenget_pubkey_stake_entryreturns a real rank. Empty set →None.try_new_for_leaderis the local block-production path: votes were already verified while aggregating. It still usesextract_slotand refuses an empty set. Not a public credit path.- Downstream reward math is leftover-logged in vote_reward leftover. This crate only names who signed.
Do not file a BLS reward-cert wrapper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (validated_block_finalization / bank.rs money-path subset / bank/fee_distribution) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana validated_block_finalization leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after validated_reward_certificate leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/validated_block_finalization.rs. Do not rematch validated_reward_certificate leftover, vote_reward leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: try_from_footer that accepts an unverified footer cert and inserts a stranger vote pubkey so vote_rewards_input later credits the caller; from_validated_fast / from_validated_slow that skip BLS verify for an attacker-built cert; extract_signers that decodes a Base3 bitmap as a full validator set.
Result: no user-exploitable finding. Not submitted.
- This is an Alpenglow block-finalization cert wrapper, not a stranger IX. It does not move lamports.
vote_rewards_inputonly returns(signers, slot)for leftover-logged vote_reward leftover. try_from_footeruncompresses the footer aggregates, buildsUnverifiedCertificates, and calls leftover-loggedBank::verify_certificate. Slow path requires both notarize and finalize; fast path is a singleFinalizeFast.extract_signersloads leftover-logged epoch-stakes rank map forcert_type.slot(), decodes the bitmap as Base2 only (Base3Finalization/ decode errors abort), and mapsiter_onesranks throughget_pubkey_stake_entryto real vote pubkeys.from_validated_slow/from_validated_fastare consensus-pool constructors after the BLS sigverifier already accepted the cert. They still resolve signers from the bank rank map. Not a public credit path.into_parts/to_block_final_cert/clone_certificatesre-encode already-validated certs. No credit path.
Do not file a finalization-cert wrapper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank.rs money-path subset / bank/fee_distribution) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining chainlink-evm operatorforwarder leftover (b274ca1)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after automation-cre leftover. Official smartcontractkit/chainlink-evm b274ca1 (b274ca1ca00559ad434ca8f43026b16a6a196242). Opened listed contracts/src/v0.8/operatorforwarder/{Operator,AuthorizedForwarder,AuthorizedReceiver,LinkTokenReceiver,OperatorFactory}.sol. Extract /tmp/cl-op/. Do not rematch payments leftover or automation-cre leftover. No mainnet writes. No exploit PoCs.
Checked for: onTokenTransfer that spoofs a stranger's payment; fulfillOracleRequest that releases escrow to the caller; cancelOracleRequest that refunds a non-requester; withdraw that drains escrowed LINK.
Result: no user-exploitable finding. Not submitted.
onTokenTransferrequiresmsg.sender == LINKand onlyoracleRequest/operatorRequest. Assembly overwrites the first two payload words with the real LINK sender and amount beforedelegatecall, so payment and requester cannot be spoofed.requestId = keccak256(sender, nonce)must be unused. Commitment isbytes31(keccak256(payment, callbackAddress, callbackFunctionId, expiration)); escrow increments bypayment.fulfillOracleRequest/fulfillOracleRequest2arevalidateAuthorizedSenderand require the same params hash plus a live commitment. Escrow is decremented and the commitment deleted before the untrusted callback. Payment stays on the operator untilwithdraw(onlyOwner+_fundsAvailable, which excludes escrow).cancelOracleRequestrequiresmsg.senderto be the committed callback,expiration <= now(5 minutes), then refundspaymenttomsg.senderand drops escrow.cancelOracleRequestByRequesterrebuildsrequestIdfrommsg.sender+ nonce.AuthorizedForwarder.forward/multiForwardare authorized-sender only and cannot target LINK.ownerForward/ownerTransferAndCallare owner-only.distributeFundsonly sendsmsg.valueto the listed receivers. Factory deploys withmsg.senderas owner.
Do not file an authorized-node fulfill or expired requester cancel as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink llo-feeds / OCR / core node / websites if still unused.
2026-09-03: Chainlink leftover remaining chainlink-evm llo-feeds leftover (b274ca1)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after operatorforwarder leftover. Official smartcontractkit/chainlink-evm b274ca1 (b274ca1ca00559ad434ca8f43026b16a6a196242). Opened listed contracts/src/v0.8/llo-feeds/v0.5.1/{FeeManager,RewardManager,VerifierProxy}.sol. Extract /tmp/cl-llo/. Do not rematch operatorforwarder leftover, payments leftover, or VRF leftover. No mainnet writes. No exploit PoCs.
Checked for: processFee that bills a stranger; claimRewards that pays the caller a recipient's share; withdraw that drains without owner; onFeePaid that credits a self-chosen pot.
Result: no user-exploitable finding. Not submitted.
VerifierProxy.verify/verifyBulkpassmsg.senderassubscriberintoFeeManager.processFee(onlyProxy). Fees are LINK or native from that subscriber; v1 reports are free. Expired reports revert. Discounts / surcharge / recipients are owner (or proxy) gated.withdraw/payLinkDeficitareonlyOwner. Surplus native is refunded to the subscriber.RewardManager.onFeePaidisonlyFeeManagerandtransferFroms the payer.claimRewardspaysmsg.sendertheir stored weight of pot growth since last claim.payRecipientsis owner or an existing pool recipient and pays the named addresses, not the caller.setRewardRecipientsis once-per-pool and weights must sum to 1e18.updateRewardRecipients/setFeeManagerare owner-only.- Proxy verifier routing uses the report config digest; access controller and fee-manager setters are owner-only.
Do not file a subscriber-paid verify or weighted recipient claim as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink OCR / core node / websites if still unused.
2026-09-03: Jito leftover remaining jito-solana fee_distribution leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after validated_block_finalization leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/bank/fee_distribution.rs. Do not rematch runtime fee leftover, bundle + fee leftover, vote_reward leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: distribute_transaction_fee_details that pays msg.sender; deposit_fees that credits a stranger collector; deposit_delegator_fees that overflows pending rewards into extra vote lamports.
Result: no user-exploitable finding. Not submitted.
- End-of-slot validator helper, not a stranger IX. Fees already sit in leftover-logged
collector_fee_details. Burn is statically 50% of the transaction fee. Deposit ispriority_fee + (transaction_fee - burn). deposit_or_burn_feereads the scheduled leader's vote from leftover-logged epoch stakes. SIMD-0232 collector isblock_revenue_collector(fallbackleader.id); commission is clamped toMAX_BPS. Validator share isdeposit * commission / MAX_BPSin u128; the rest is delegator share. Failed deposits return the amount to burn.deposit_feeschecked_adds to the collector. Custom-collector path runscollector_type_checkedunless the collector is the leader vote: system owner, not reserved, rent-exempt after deposit (incinerator skips rent). Legacy path requires system owner and a rent-state transition check. Overflow / rent / reserved → burn, not wrap.deposit_delegator_feesrequires an existing vote-program account, thenincrement_pending_delegator_rewards_checkedandchecked_add_lamports. Missing / wrong owner / overflow → burn.- Capitalization subtracts the burned remainder. Tests cover overflow, reserved collector, non-rent-exempt create, and zero fees.
Do not file leader fee distribution as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank.rs money-path subset) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining websites leftover
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after llo-feeds leftover. Listed websites_and_applications assets. Live fetch 2026-09-03 via Firecrawl + HEAD. Do not rematch llo-feeds leftover or operatorforwarder leftover. No mainnet writes. No exploit PoCs.
Opened: https://faucets.chain.link/ (200), https://data.chain.link/ (Firecrawl 200; this VM HEAD 429), https://chain.link/ (200), https://cre.chain.link/ (redirects to login.chain.link / app.chain.link Auth0 signup).
Checked for: an official page that asks for a seed phrase or private key; a first-party wallet connect that signs a stranger transfer; a faucet that drips mainnet value to a connected wallet.
Result: no user-exploitable finding. Not submitted.
faucets.chain.linkis labeled testnet only (Sepolia / Fuji / Shibuya and similar). Copy: connect MetaMask / WalletConnect / Coinbase Wallet, then receive test ETH/LINK/AVAX. No seed prompt. No mainnet drip.data.chain.linkis a feed / streams / Smart Data directory. Scraped copy has no seed, private key, or approve-to-spend flow.chain.linkis marketing (platform, TVE, news, contact). No wallet connect.cre.chain.linkis an Auth0 email + country + ToS signup (robots noindex). It does not custody funds or request keys.
Do not file a testnet faucet or Auth0 signup as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink OCR / core node if still unused.
2026-09-03: Chainlink leftover remaining OCR leftover (618b5bf)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after websites leftover. Official smartcontractkit/libocr 618b5bf (618b5bf7f342075a81ca1273a04abce15529a101). Opened listed contract2/{OCR2Aggregator,AccessControlledOCR2Aggregator,OCR2Abstract}.sol. Extract /tmp/cl-ocr/. Do not rematch websites leftover or llo-feeds leftover. No mainnet writes. No exploit PoCs.
Checked for: transmit that a stranger can call to credit themselves; withdrawPayment that pays the caller a different oracle's LINK; withdrawFunds that drains owed oracle balances.
Result: no user-exploitable finding. Not submitted.
transmitrequiress_transmitters[msg.sender].active, a newerepochAndRound, matchings_latestConfigDigest, andf+1ECDSA signatures from distinct active signers overkeccak256(keccak256(report), reportContext). Median must sit in[minAnswer, maxAnswer]. Payment is credited to that transmitter via_payTransmitter, not to an arbitrary caller.withdrawPaymentrequiresmsg.sender == s_payees[transmitter]and_payOracletransfers owed juels to that payee.owedPaymentis observation-round delta plus storedpaymentJuels.withdrawFundsis owner or billing-access and onlybalance - _totalLinkDue.setConfig/setPayeesare owner-only. Existing payees cannot be overwritten.transferPayeeship/acceptPayeeshipis a two-step payee change.
Do not file an authorized-transmitter report or payee withdraw as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink core node if still unused.
2026-09-03: Jito leftover remaining jito-solana bank money-path leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after fee_distribution leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/bank.rs money-path subset: transfer, withdraw, test_utils::deposit, store_account / store_accounts, store_account_and_update_capitalization, burn_and_purge_account, calculate_capitalization_for_tests / set_capitalization_for_tests. Do not rematch fee_distribution leftover, transaction_execution leftover, remaining runtime leftover, or snapshot_bank_utils leftover. No mainnet writes. No exploit PoCs.
Checked for: withdraw that drains a stranger account; test_utils::deposit that mints to the caller; store_account_and_update_capitalization that inflates supply without a matching account; transfer that skips leftover-logged execution checks.
Result: no user-exploitable finding. Not submitted.
transferis a test/client helper: signs a system transfer with the caller's keypair andlast_blockhash, then leftover-loggedprocess_transaction/ transaction_execution leftover. Not a stranger credit.withdrawchecked_subs from a named pubkey and keeps a nonce account's rent-exempt min. It usesstore_account(no capitalization bump) so in-flight fees stay in the leftover-logged fee_distribution loop until burn. Missing account / underflow →AccountNotFound/InsufficientFundsForFee. Does not credit a destination.test_utils::depositispub mod test_utilsonly.checked_add_lamportsthenstore_account. Comment: rents are not collected here. Not a production IX.store_account/store_accountsassert!freeze_started(), update leftover-logged stakes cache, then persist.store_account_and_update_capitalizationadjusts the capitalization counter by the lamport diff (or the new account's balance on create).burn_and_purge_accountzeros a program account andfetch_subs its lamports. Ledger-tool / builtin replace paths, not a stranger mint.calculate_capitalization_for_tests/set_capitalization_for_testsare ledger-tool/test only. Snapshot verify is leftover-logged in snapshot_bank_utils leftover.
Do not file a bank test helper or capitalization counter as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (account_saver / bank_client / prioritization_fee) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana account_saver leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after bank money-path leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/account_saver.rs. Do not rematch bank money-path leftover, transaction_execution leftover, or remaining runtime leftover. No mainnet writes. No exploit PoCs.
Checked for: collect_accounts_to_store that persists a failed tx's post-execution accounts so a stranger credit sticks; collect_accounts_for_successful_tx that stores an invoked account the tx did not pass; collect_accounts_for_failed_tx that drops the fee-payer rollback.
Result: no user-exploitable finding. Not submitted.
- This is a post-SVM collect helper, not a stranger IX. It does not move lamports. It returns
Vec<(&Pubkey, &AccountSharedData)>from already-loaded execution results for leftover-loggedstore_accounts. NoOpand unexecuted results store nothing. Successful txs store writable + touched accounts, skipping invoked keys that were not instruction accounts (comment: a committable tx cannot modify those).- Failed executed txs and
FeesOnlystore leftover-loggedrollback_accountsonly (fee payer / nonce rollback). Tests cover fee-payer-only, separate nonce+fee-payer, same nonce+fee-payer, and fees-only. - Geyser
txs_refsis optional reference collection. Capacity helper is an allocation hint. No credit path.
Do not file an account-collect helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (bank_client / prioritization_fee) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining core node leftover (58d2ba6)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after OCR leftover. Official smartcontractkit/chainlink 58d2ba6 (58d2ba658feb47a8d2b8580816d212c84a4e566f). Opened listed core/web/{evm,solana,cosmos}_transfer_controller.go, router.go, sessions_controller.go, and core/web/auth/{auth,gql}.go. Extract /tmp/cl-core/. Do not rematch OCR leftover or websites leftover. No mainnet writes. No exploit PoCs.
Checked for: unauthenticated POST /v2/transfers that sends node ETH to the caller; a session create that issues a cookie without credentials; a GraphQL mutation that withdraws without admin.
Result: no user-exploitable finding. Not submitted.
- Transfer routes are on
authv2(AuthenticateByTokenorAuthenticateBySession) and wrapped withRequiresAdminRole. Missing session/token aborts 401. Non-admin roles abort 403.CreateSessionbinds email/password (plus WebAuthn if enrolled) and returns 401 on failure. - EVM / Solana / Cosmos
Createsend from a node key the admin named (FromAddress/From) viaTxManager().SendNativeTokenorrelayer.Transact. They do not default the destination tomsg.sender. EVM optional balance+fee check unlessAllowHigherAmounts. - GraphQL
/queryuses session-optionalAuthenticateGQL; the schema has no transfer / sendEth mutation.eth_transactionresolvers are read-only presenters.
Do not file an admin-gated node withdrawal as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink core slices (keystore / evm txmgr package / ocr2 services) if still unused. Official Chainlink leftover that listed trees open at this money-path level is otherwise exhausted.
2026-09-03: Jito leftover remaining jito-solana bank_client leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after account_saver leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/bank_client.rs. Do not rematch account_saver leftover, bank money-path leftover, or transaction_execution leftover. No mainnet writes. No exploit PoCs.
Checked for: transfer_and_confirm that credits a stranger without the sender keypair; async_send_versioned_transaction that returns a signature without leftover-logged execution; run that applies unsigned queued txs as credits.
Result: no user-exploitable finding. Not submitted.
- This is a local in-process
SyncClient/AsyncClientfor tests, not a stranger IX.tpu_addris the string"Local BankClient". send_and_confirm_messagesigns with the provided keypairs and leftover-loggedbank.process_transaction.transfer_and_confirmbuilds a system transfer fromkeypair.pubkey()and the same path. Reads (get_balance,get_account,get_signature_status) are bank wrappers.- Async send queues the versioned tx and returns its first signature (or default).
rundrains the channel into leftover-loggedtry_process_entry_transactions. Commitment args are ignored (single local bank). advance_slotisdev-context-only-utils: leftover-loggedBankForks::insertplus a test clock sysvar. No credit path.
Do not file a local test bank client as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (prioritization_fee) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Chainlink leftover remaining core keystore leftover (58d2ba6)
Immunefi program chainlink ($3,000,000, kyc: true). Official remaining listed after core node leftover. Official smartcontractkit/chainlink 58d2ba6 (58d2ba658feb47a8d2b8580816d212c84a4e566f). Opened listed core/services/keystore/{master,eth,keystore,orm}.go. Extract /tmp/cl-ks/. Do not rematch core node leftover (web transfers). No mainnet writes. No exploit PoCs.
Checked for: Unlock that accepts any password and exposes keys; Export that returns raw private key bytes without a password; Sign that a stranger can call over HTTP.
Result: no user-exploitable finding. Not submitted.
Unlockdecryptsencrypted_key_ringswith the supplied password. A second unlock with a different password reverts.isLocked()islen(password)==0.Get/Create/Import/Export/EthSigner.Signall returnErrLockedwhile locked.Exportre-encrypts the in-memory key with the caller-supplied password (ToEncryptedJSON). It does not write plaintext key material.Importrequires that same decrypt password and rejects duplicates.- ORM persists only the encrypted blob. This package is in-process; leftover-logged web export/transfer routes stay admin-gated.
Signis the node-internal loopp signer after unlock, not a public endpoint.
Do not file an unlocked-node signer or password-gated export as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: remaining Chainlink evm txmgr package / ocr2 services / common keystore if still unused.
2026-09-03: Jito leftover remaining jito-solana prioritization_fee leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after bank_client leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/prioritization_fee.rs and runtime/src/prioritization_fee_cache.rs. Do not rematch runtime fee leftover, fee_distribution leftover, or bank_client leftover. No mainnet writes. No exploit PoCs.
Checked for: update that records a stranger CU price as the block min so later txs underpay; get_prioritization_fees that returns a fee that undercuts the real min; finalize_slot that publishes a duplicate bank's fee as the optimistic winner.
Result: no user-exploitable finding. Not submitted.
- RPC/metrics cache, not a stranger IX. It does not move lamports.
PrioritizationFee::updateonly lowersmin_compute_unit_priceand per-writable-account mins from already-landed non-vote txs. Updates aftermark_block_completedare counted and ignored. PrioritizationFeeCache::updateskips votes, zero CU limit, and txs that fail compute-budget or account-lock checks. It queuespriority_fee_lamports/compute_unit_price_in_microlamportsplus writable keys.Saturatingmetrics wrap atu64::MAX.finalize_slotkeeps only the finalizedbank_id, prunes unfinalized slots older thanMAX_UNFINALIZED_SLOTS, thenmark_block_completed(idempotent error if already finalized). Published cache keepsMAX_NUM_RECENT_BLOCKS(default 150) and evicts oldest.get_prioritization_feesismax(block min, max writable-account min among requested keys)per finalized slot. Estimate only; leftover-logged fee_distribution leftover is the actual credit path.
Do not file a priority-fee estimate cache as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (commitment / slot_params / genesis_utils) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana commitment leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after prioritization_fee leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/commitment.rs. Do not rematch bank_forks leftover, stakes leftover, or epoch_stakes leftover. No mainnet writes. No exploit PoCs.
Checked for: increase_confirmation_stake that wraps so a low-stake slot looks supermajority; get_lockout_count that treats a stranger slot as confirmed; slot_with_commitment that returns an unrooted slot as Finalized.
Result: no user-exploitable finding. Not submitted.
- RPC commitment cache, not a stranger IX. It does not move lamports.
BlockCommitmentis a[u64; MAX_LOCKOUT_HISTORY+1]of already-aggregated vote stake.increase_*_stakeadds into that array. Overflow would undercount confirmation, not credit anyone. get_lockout_countwalks confirmation levels high-to-low and returns the lowest level whose cumulative stake is> VOTE_THRESHOLD_SIZE(2/3) oftotal_stake. Missing slot →None. Tests: 45/50 stake at depth 2 → confirmation 2; 25/50 → 0.slot_with_commitment: Processed = current bank slot; Confirmed =highest_confirmed_slot; Finalized =highest_super_majority_root. Setters are local cache writes.highest_slot_with_confirmation_countwalksroot..slotdescending and falls back to root.CommitmentSlotsis a four-field snapshot. No credit path.
Do not file a commitment-level cache as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (slot_params / genesis_utils) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana slot_params leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after commitment leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/slot_params.rs. Do not rematch commitment leftover, remaining runtime leftover, or partitioned epoch rewards leftover. No mainnet writes. No exploit PoCs.
Checked for: vat_to_burn_per_epoch that burns a stranger's vote lamports; cost_limits that raises block limits so a tx underpays; params_at_slot that applies a longer slot so inflation over-credits.
Result: no user-exploitable finding. Not submitted.
- Compile-time slot-time tables plus a bank-local archive, not a stranger IX. It does not move lamports.
LEGACY/ 350 / 300 / 250 / 200 ms tables setns_per_slot, shred caps, entry-byte caps, partitioned-reward store budget, andvat_to_burn_per_epoch. VAT burn is leftover-logged in vote_reward leftover; this crate only returns the constant. cost_limits(true)scales account/block costs* 100 / 60(SIMD-0525). Tests match 40M/100M down to 20M/50M. Saturating mul/div. Does not credit anyone.SlotParamsArchiverebuilds from leftover-logged feature activation slots. Effective slot is first slot ofactivation_epoch + 1. Walks longest-to-shortest so a later longer target is skipped.params_at_slotisrange(..=slot).next_back(). Duration uses saturating add/mul. Slot duration never increases as slots advance.- Source of truth is the feature set, not snapshots. No credit path.
Do not file a slot-time parameter table as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (genesis_utils) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana genesis_utils leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after slot_params leftover. Official jito-foundation/jito-solana d0e3a47. Opened listed runtime/src/genesis_utils.rs. Do not rematch slot_params leftover, remaining runtime leftover, or vote leftover. No mainnet writes. No exploit PoCs.
Checked for: create_genesis_config_with_leader_ex that mints to a stranger pubkey; minimum_vote_account_balance_for_vat that underfunds VAT so a later burn steals; activate_feature that inserts a credit account as a feature.
Result: no user-exploitable finding. Not submitted.
- Test/genesis helper, not a stranger IX. It does not move live lamports.
create_genesis_config*builds aGenesisConfigwith a mint account (mint_lamports), validator/vote/stake accounts from caller-supplied pubkeys and amounts, native mint (LAMPORTS_PER_SOL), and leftover-logged stake-config / epoch-rewards sysvars. - When
validator_stake_lamports > 0, vote/stake are raised tominimum_vote_account_balance_for_vat(100)/minimum_stake_lamports_for_vat(conservativeDEFAULT_VAT_TO_BURN_PER_EPOCH). Zero stake only funds rent-exempt.create_lockup_stake_accountassertslamports >= rent_exempt_reserveand writesStakeStateV2::Initialized. activate_featureinserts a rent-exemptFeature { activated_at: Some(0) }account.deactivate_featuresonly removes knownFEATURE_NAMESkeys. Alpenglow helpers write genesis cert / epoch-inflation test state. Hardcoded mint/validator seeds are test constants.ValidatorVoteKeypairs::newderives BLS from the vote signer. No production credit path.
Do not file a genesis test helper as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (alpenglow_epoch_type / leader_schedule_utils / sysvar_account) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03 leftover: Chainlink Common Keystore (smartcontractkit/chainlink-common keystore/)
Immunefi leftover Common Keystore (https://github.com/smartcontractkit/chainlink-common/tree/main/keystore). Official GitHub GET /repos/smartcontractkit/chainlink-common/contents/keystore?ref=develop 200 (16 entries). Pin ef07b52 (ef07b52a737d782d874d191763238420c96960f0, committer 2026-09-03T14:18:29Z). Local extract /tmp/cl-cks/ via git show <pin>:<path>: encryptor.go, signer.go, keystore.go, file.go, admin.go, memory.go, storage.go, reader.go, plus go.mod/go.sum. No live-contract testing. No exploit PoCs.
This is the library keystore used by the core node leftover (731d82b / /tmp/cl-ks/). Do not rematch core core/services/keystore.
What I actually read
keystore.goLoadKeystore: decrypts storage withgethkeystore.DecryptDataV3using the caller password; empty storage → empty in-memory map; wrong password fails.saveproto-marshals keys thenEncryptDataV3with the same password (scrypt N=1024, P=1).file.goFileStorage:atomicfile.WriteFilemode0600.MemoryStorageis in-process only.admin.goExportKeys: each key is re-encrypted with caller-suppliedkeyReq.Enc.Password(enc.Encrypt); not returned as plaintext.ImportKeysdecrypts with the import password thenAdd.GetKeysreturns KeyInfo (name, type, pubkey, extra metadata) — not private key bytes.GetAccount/GetPublicKeyare public material only.signer.go/encryptor.go:Sign/Decryptrun in-process after a successful load. No HTTP surface in this package.storage.go:EncryptedKeystoreis a JSON blob ({crypto, id, version}) wrapping go-ethereum keystore V3.
Verdict
No finding. Stranger theft of node keys still requires the node password or process memory. Export is re-encrypted to a password the admin supplies. File storage is 0600. This library does not expose a public HTTP unlock. Out of Immunefi leftover remaining for Common Keystore.
Remaining listed (do not rematch)
- VRF (
vrf/v08/vrf/v1). - CCIP (
ccip/) — EVM + Solana + Sui + Aptos leftovers logged. - Payments (
chainlink-evm/…/payments). - Automation CRE (
chainlink-evm/…/automation/). - Operator Forwarder (
chainlink-evm/…/operatorforwarder). - LLO Feeds (
chainlink-evm/…/llo-feeds). - Websites (
smartcontract.community/dev.chain.link/docs.chain.link). - OCR (
libocrocr2/). - Core node transfers (
core/web/v2/transfers). - Core keystore (
core/services/keystore). - Common Keystore (
chainlink-commonkeystore/) — this leftover. - evm txmgr package (under
chainlink-evm/chainlink-framework, notcore/services). - ocr2 services (
core/services/ocr2).
2026-09-03 leftover: Chainlink evm txmgr package (chainlink-evm pkg/txmgr + chainlink-framework chains/txmgr)
Immunefi leftover evm txmgr package (under chainlink-evm / chainlink-framework, not core/services). Official GitHub:
GET /repos/smartcontractkit/chainlink-evm/contents/pkg/txmgr?ref=develop200. Pinb274ca1(b274ca1ca00559ad434ca8f43026b16a6a196242, committer2026-09-03T14:00:35Z).GET /repos/smartcontractkit/chainlink-framework/contents/chains/txmgr?ref=main200. Pinb5a88c1(b5a88c16af029c85b42d9aaa2bff0d86325102a7, committer2026-08-14T14:39:46Z).
Local extract /tmp/cl-txmgr/evm/ and /tmp/cl-txmgr/fw/ via raw GitHub at those pins: txmgr.go, broadcaster.go, confirmer.go, reaper.go, resender.go, strategies.go, attempts.go, transmitchecker.go, stuck_tx_detector.go, finalizer.go, nonce_tracker.go, evm_tx_store.go, builder.go, client.go, models.go. No live-contract testing. No exploit PoCs.
Do not rematch core node transfers leftover (7f8b636 / afe53b6) or Common/core keystore leftovers.
What I actually read
CreateTransaction:keystore.CheckEnabledonFromAddress; idempotency key returns the existing row; optional forwarder wraps payload and stores original dest inMeta.FwdrDestAddress; queue-capacity check; strategy prune of unstarted rows; insert; trigger Broadcaster. No public HTTP in this package.SendNativeToken: rejects the zeroto; inserts a native transfer then triggers broadcast. Does not re-checkCheckEnabledhere. Callers are in-process (core leftover already logged/v2/transfersas admin-gated). Not a stranger HTTP surface.- Broadcaster / Confirmer: sign via
keystore.SignTxforFromAddressonly. Gas bump / rebroadcast keep the stored dest, payload, and value except purge paths. NewPurgeTxAttempt: empty payload, value 0, same nonce/from;NewEmptyTxAttemptis 0-value tofromAddress(self). ForceRebroadcast is the emergency empty/resend path.- Transmit checkers: Simulate fail-open on RPC errors (never fatal on insufficient ETH). VRF v1/v2 fail-open on parse/RPC errors and skip only when the coordinator reports already-fulfilled. Waste-gas / revert, not stranger theft of node keys.
- Stuck detector: lowest-nonce unconfirmed per enabled address; heuristic / chain-specific overflow; purge is 0-value nonce unstick. Reaper deletes old history. Strategies prune unstarted queue rows.
- Finalizer: receipt fetch + mark finalized / missing-receipt fatal. No send path. Nonce tracker uses mined
SequenceAtthen local increment.
Verdict
No finding. This is an in-process tx lifecycle library. Stranger theft of node ETH still requires an enabled key, the node password / process, or an already-reviewed admin transfer API. Purge and empty attempts are 0-value nonce clears, not redirects. Out of Immunefi leftover remaining for the evm txmgr package.
Remaining listed (do not rematch)
- VRF (
vrf/v08/vrf/v1). - CCIP (
ccip/) — EVM + Solana + Sui + Aptos leftovers logged. - Payments / Automation CRE / Operator Forwarder / LLO Feeds.
- Websites (
smartcontract.community/dev.chain.link/docs.chain.link). - OCR (
libocrocr2/). - Core node transfers (
core/web/v2/transfers). - Core keystore (
core/services/keystore). - Common Keystore (
chainlink-commonkeystore/). - evm txmgr package (
chainlink-evmpkg/txmgr+chainlink-frameworkchains/txmgr) — this leftover. - ocr2 services (
core/services/ocr2).
2026-09-03 leftover: Chainlink ocr2 services (core/services/ocr2)
Immunefi leftover ocr2 services (https://github.com/smartcontractkit/chainlink/tree/develop/core/services/ocr2). Official GitHub GET /repos/smartcontractkit/chainlink/contents/core/services/ocr2?ref=develop 200. Pin 58d2ba6 (58d2ba658feb47a8d2b8580816d212c84a4e566f, committer 2026-09-03T13:48:16Z). Local extract /tmp/cl-ocr2/ via raw GitHub at that pin: delegate.go, database.go, validate/validate.go, plugins/median/services.go, plugins/vault/transmitter.go, plugins/generic/oraclefactorytransmitter.go. No live-contract testing. No exploit PoCs.
Do not rematch libocr OCR2Aggregator leftover (5de5620) or LLO feeds leftover (698f034).
What I actually read
ServicesForSpec: job must already have anOCR2OracleSpec. Transmitter comes from the spec (or a singlesendingKeysentry). EVM jobs callGetEVMEffectiveTransmitterID: optionalGetForwarderForEOAwhenForwardingAllowed(OCR2Aggregator transmitter whitelist); otherwise the job EOA. OCR2 key bundle is loaded from the node keystore by job/config ID. Plugins: LLO, Median, Generic, Vault, DonTime, Ring.- Registry-driven
NewServicesonly launchesDonTimePlugin. Transmitter is the on-chain OCR config account matching this node's OCR pubkey, else an eth-keystore address for the configured chain. Not a stranger HTTP surface. - Vault
Transmitter.Transmit: unmarshals report info andhandler.SendResponsein-process.FromAccountis the configured OCR account. No native-token send. - Generic
contractTransmitterforwardsTransmitto the relayer provider and reportsFromAccountas the configuredtransmitterID. - Median:
relayer.NewPluginProviderwith specTransmitterID/ContractID;ContractTransmittercomes from that provider. Juels/gas pipelines are observation data sources, not payment redirects. database.go: OCR persistent state, config, and pending-transmission rows. No send path.
Verdict
No finding. OCR2 services wire an admin job (or registry DON config) to libocr + the relayer transmitter. On-chain payment / payee withdraw stays in the already-reviewed OCR2Aggregator leftover. Stranger theft still needs a node job + enabled key. Out of Immunefi leftover remaining for core/services/ocr2.
Remaining listed (do not rematch)
- VRF (
vrf/v08/vrf/v1). - CCIP (
ccip/) — EVM + Solana + Sui + Aptos leftovers logged. - Payments / Automation CRE / Operator Forwarder / LLO Feeds.
- Websites (
smartcontract.community/dev.chain.link/docs.chain.link). - OCR (
libocrocr2/). - Core node transfers (
core/web/v2/transfers). - Core keystore (
core/services/keystore). - Common Keystore (
chainlink-commonkeystore/). - evm txmgr package (
chainlink-evmpkg/txmgr+chainlink-frameworkchains/txmgr). - ocr2 services (
core/services/ocr2) — this leftover.
Official Chainlink leftover remaining at leftover-heading level is now exhausted. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana alpenglow_epoch_type leftover (d0e3a47)
Immunefi leftover remaining jito-solana alpenglow_epoch_type leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/alpenglow_epoch_type.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-slot/alpenglow_epoch_type.rs (226 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged vote_reward leftover, genesis_utils leftover, bank money-path leftover, or epoch_stakes leftover. This file is the prior-epoch delegated-stake PDA + Tower/Migration/Alpenglow classifier used after snapshot restore. It is not leftover-logged epoch_stakes (those are calculated an epoch in advance).
What I actually read
RewardEpochDelegatedStakesstores prior-epoch delegated stake denominators for non-Tower reward recalc after snapshot restore. PDA:find_program_address([b"reward_epoch_delegated_stakes"], alpenglow::id()).set(): assertdistribution_vote_accounts.len() <= MAX_ALPENGLOW_VOTE_ACCOUNTS; map current distribution vote pubkeys to this struct’s prior-epoch stakes (unwrap_or_defaultif missing); sort by vote pubkey; serialize; fund rent-exempt for max_size via leftover-loggedstore_account_and_update_capitalization. That mints cap to a system-owned PDA — validator-internal snapshot-restore helper, not a stranger credit. Missing prior-epoch keys become 0 stake (undercount denominator / skip that vote), not a credit.get(): deserialize, assert bound,Noneif the account is missing or empty.AlpenglowEpochType::getpanics if the closure returnsNonefor a non-Tower reward epoch. Epoch field must match the rewarded epoch.AlpenglowEpochType::get: Tower / MigrationEpoch / Alpenglow. Requiresepoch < bank.epoch(). Migration epoch uses leftover-loggedget_alpenglow_migration_slot. Migration slot itself is still Tower (+ 1for tower-slot count).is_alpenglow_or_migration_epochis a boolean on the same migration slot. Does not pay. Downstream pay is leftover-logged vote_reward leftover.
Verdict
No finding. Snapshot-restore bookkeeping and epoch classification only. The PDA mint is rent-exempt capitalization for a system-owned account the validator writes itself. Missing prior-epoch stake defaults to 0, which undercounts a vote’s share rather than inventing lamports. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (leader_schedule_utils / sysvar_account) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana leader_schedule leftover (d0e3a47)
Immunefi leftover remaining jito-solana leader_schedule leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/leader_schedule_utils.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-slot/leader_schedule_utils.rs (167 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged epoch_stakes leftover or genesis_utils leftover. This file builds the per-epoch leader schedule from vote accounts and indexes it by slot. It does not move lamports.
What I actually read
leader_schedule(epoch, bank)calls leftover-loggedbank.epoch_vote_accounts(epoch)thenLeaderSchedule::newwith leftover-loggedepoch_schedule.get_slots_in_epoch. Missing vote accounts returnNone.leader_schedule_from_vote_accountsis the snapshot-restore path: it takes the vote-account map directly before aBankis fully constructed. Slot count must fitusize.leader_schedule_by_identitygroups upcoming(slot_index, identity)into a HashMap of base58 identity → slot indices. RPC/display helper.slot_leader_atindexes the schedule by slot-in-epoch (bank.get_epoch_and_slot_index). Window math (first_of_consecutive_leader_slots/last_of_consecutive_leader_slots/leader_slot_index/remaining_slots_in_window) assumes leftover-loggedNUM_CONSECUTIVE_LEADER_SLOTS(tests lock 4).num_ticks_left_in_slotisticks_per_slot - tick_height % ticks_per_slot.- Tests: genesis leader is the leftover-logged bootstrap validator pubkey for the first slots.
Verdict
No finding. Schedule construction and slot-window arithmetic only. Leader identity comes from leftover-logged epoch vote accounts. Downstream pay is leftover-logged fee_distribution leftover / vote_reward leftover. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (sysvar_account) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana sysvar_account leftover (d0e3a47)
Immunefi program jito ($250,000, kyc: true). Official remaining unused runtime leftover after leader_schedule leftover. Official jito-foundation/jito-solana d0e3a47 (d0e3a47ff0bd4da4994504c9628d5aa702156922). Opened listed runtime/src/sysvar_account.rs. Official GitHub GET /repos/jito-foundation/jito-solana/contents/runtime/src/sysvar_account.rs?ref=d0e3a47 200. Extract /tmp/jito-alpenglow/sysvar_account.rs. Do not rematch leftover-logged genesis_utils leftover, alpenglow_epoch_type leftover, or epoch_stakes leftover. No mainnet writes. No exploit PoCs.
Checked for: create_account that mints a stranger-owned sysvar; to_account that overwrites clock/rent so a later reward overpays; from_account that deserializes attacker bytes as a paid sysvar.
Result: no user-exploitable finding. Not submitted.
- Bank-internal sysvar serializer, not a stranger IX. It does not move live lamports.
new_accountbuildsAccountSharedData::new(lamports, data_len, &sysvar::id())with caller-suppliedInheritableAccountFields(lamports, rent_epoch). Owner is the sysvar program. canonical_data_lenmaps known sysvar IDs (clock, epoch_rewards, epoch_schedule, fees, last_restart_slot, recent_blockhashes, rent, rewards, slot_hashes, slot_history, stake_history) to their SIZE constants. Unknown IDs have no canonical size.required_data_lenismax(canonical, serialized).create_account/create_account_with_bincodeserialize into that buffer (wincode/bincode).from_account/to_accountdeserialize / overwrite the data slice. They do not store into the bank and do not credit anyone.- Callers (leftover-logged bank / genesis helpers) choose the lamports. This crate only packs bytes.
Do not file a sysvar serializer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftover that listed remaining-runtime trees open is exhausted on this pin. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana loader_utils leftover (d0e3a47)
Immunefi leftover remaining jito-solana loader_utils leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/loader_utils.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-static/loader_utils.rs (279 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged bpf leftover, bank_client leftover, or bank money-path leftover. This file is #![cfg(feature = "dev-context-only-utils")] — test-only program load helpers. It is not a production stranger IX.
What I actually read
load_program_from_filereads../../deploy/<name>.sorelative to the current executable. Local test fixture only.create_program: bypasses the loader builtin. Allocates a unique program id, builds leftover-logged upgradeable or v1 program accounts from the ELF + defaultRent, then leftover-loggedbank.store_account(no capitalization bump). Owner is the caller-suppliedloader_id. Test helper that writes into an in-processBank, not a credit path.load_upgradeable_buffer/load_upgradeable_program/upgrade_program/set_upgrade_authority: leftover-loggedBankClient/SyncClientsends official loader-v3 IXs (create_buffer, chunkedwrite512 bytes,deploy_with_max_program_len,upgrade,set_upgrade_authority). Rent is1.max(get_minimum_balance_for_rent_exemption(...))paid by the caller keypair.load_upgradeable_programthenset_sysvar_for_testsclock slot=1 so the program is effective after two leftover-loggedadvance_slots (load_upgradeable_program_and_advance_slot).create_invoke_instructionbuilds a one-account signed invoke for tests. Does not move lamports itself.
Verdict
No finding. Dev-context test harness. Production deploy/upgrade still goes through leftover-logged bpf leftover. store_account in create_program is the leftover-logged no-cap test write. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (static_ids / runtime_config / read_optimized_dashmap / vote_sender_types / installed_scheduler_pool) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana vote_sender leftover (d0e3a47)
Immunefi leftover remaining jito-solana vote_sender leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/vote_sender_types.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-static/vote_sender_types.rs (60 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged vote leftover, vote_reward leftover, or banking_stage leftover. This file is channel message types for solCiProcVotes. It does not move lamports.
What I actually read
ReplayVoteMessage:VerifiedExecuted(ParsedVote)from banking as it builds a block; Replay splitsExecuted(bank_id, slot, message_hash, parsed_vote) andVerified(bank_id, slot, message_hashes) so solCiProcVotes waits for both before processing.InvalidBank/BankCompleteare informative early-release messages; if omitted, memory is released when slots are rooted.ReplayVoteSendTypeis the send-side discriminant (VerifiedExecuted/Executed).ReplayVoteSender/ReplayVoteReceiverarecrossbeam_channelaliases. No serialization of votes into accounts. No credit, burn, or fee path.
Verdict
No finding. Type-only IPC. Downstream pay is leftover-logged vote_reward leftover after leftover-logged vote leftover verifies. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (static_ids / runtime_config / read_optimized_dashmap / installed_scheduler_pool) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana installed_scheduler leftover (d0e3a47)
Immunefi leftover remaining jito-solana installed_scheduler leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/installed_scheduler_pool.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-static/installed_scheduler_pool.rs (900 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged scheduler leftover, banking_stage leftover, transaction_execution leftover, or bank_forks leftover. This file is the runtime glue (InstalledScheduler / BankWithScheduler) that lends a pooled scheduler for Replay/Banking. Actual parallel execution lives in solana-unified-scheduler-pool (dependent crate). It does not move lamports.
What I actually read
InstalledSchedulerPool::take_scheduler/take_resumed_schedulerlend a boxed scheduler for aSchedulingContext(oneArc<Bank>). Preallocation context has no bank and panics if used normally.register_timeout_listeneris opaque; stale listeners are cleaned later.uninstalled_from_bank_forksis pool teardown.InstalledScheduler::schedule_executionis non-blocking.Err(SchedulerAborted)means a previously scheduled bad tx aborted the block, not that this schedule itself paid anyone. After abort the scheduler is disposed, not repooled.recover_error_after_abortrequires&mut selfand is idempotent across the read/write lock gap.wait_for_terminationblocks until scheduled txs finish, then uninstalls. Empty schedule returnsOk(()). Must run before leftover-loggedBank::freeze.pause_for_recent_blockhashkeeps the scheduler and holdsResultWithTimings.unpause_after_takenis block-production only (panics on verification).SchedulerStatus: Unavailable (consumed / disabled) / Active / Stale (timeout returned the scheduler to the pool). Stale → Active re-takes viatake_resumed_scheduler. Timeout listenerwait_for_termination(false)thenreturn_to_poolto bound thread creation under forky load.BankWithSchedulerwrapsArc<Bank>+RwLock<SchedulerStatus>. Constructor asserts the scheduler’s bank is the sameArc.schedule_transaction_executionsfeeds leftover-loggedReplayTransactions into the active scheduler. Drop / prune path waits then discards a leftover error.DereftoArc<Bank>.- Tests: mocks only. The transfer fixture is scheduled into a mock, not executed here.
Verdict
No finding. Scheduling glue. Commit/pay is leftover-logged transaction_execution leftover / fee_distribution leftover after leftover-logged banking_stage leftover. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (static_ids / runtime_config / read_optimized_dashmap) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana read_optimized_dashmap leftover (d0e3a47)
Immunefi leftover remaining jito-solana read_optimized_dashmap leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/read_optimized_dashmap.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-static/read_optimized_dashmap.rs (303 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged remaining runtime leftover or installed_scheduler leftover. This file is a DashMap wrapper that stores Arcs to drop shard write-locks after lookup. It does not move lamports.
What I actually read
ReadOptimizedDashMap::get_or_insert_withclones anROValue(Arc) so callers do not hold the shard lock. Double-checked insert viaentry.or_insert_with.get/iterare read-only.remove_if_not_accessed/remove_if_not_accessed_andtake the write-lock entry and remove only when!v.shared()and the predicate is true; otherwiseErr(()).retain_if_accessed_orkeeps entries that are stillshared()even if the predicate is false.unsafe fn retaincan lose concurrent mutations of dropped keys; documented.clearisdev-context-only-utils.ROValue::sharedisArc::strong_count > 1. Deref toV. Tests: remove while held fails; shuttle concurrent insert ends at 50; insert/retain keeps the newly inserted key.
Verdict
No finding. In-process map. No accounts, no credits. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (static_ids / runtime_config) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana static_ids leftover (d0e3a47)
Immunefi leftover remaining jito-solana static_ids leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/static_ids.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-static/static_ids.rs (14 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged remaining runtime leftover or tokens CLI leftover. This file is a compile-time list of well-known token program / mint pubkeys. It does not move lamports.
What I actually read
STATIC_IDSis aLazyLock<Vec<Pubkey>>of leftover-logged SPL IDs: associated-token-account program, token program, native mint, token-2022 program.- No store, no transfer, no account construction. Callers use the vec as a static allow-list / skip-list.
Verdict
No finding. Constant pubkey table. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused remaining-runtime slices (runtime_config) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Jito leftover remaining jito-solana runtime_config leftover (d0e3a47)
Immunefi leftover remaining jito-solana runtime_config leftover (https://github.com/jito-foundation/jito-solana). Official raw GET https://raw.githubusercontent.com/jito-foundation/jito-solana/d0e3a47/runtime/src/runtime_config.rs 200. Pin d0e3a47. Local extract /tmp/jito-solana-static/runtime_config.rs (12 lines). Static review / local clone only. No live-contract testing. No exploit PoCs.
Do not rematch leftover-logged compute-budget leftover or slot_params leftover. This file is a small options struct. It does not move lamports.
What I actually read
RuntimeConfigholds optional leftover-loggedComputeBudget,log_messages_bytes_limit,transaction_account_lock_limit, andskip_transaction_signatures_in_status_cache.- When
skip_transaction_signatures_in_status_cacheis true, signature keys are omitted from leftover-logged status_cache leftover; message-hash keys are still stored for duplicate detection. Defaults areNone/false. - No store, no transfer, no credit. Callers (test / validator startup) pass the struct into leftover-logged Bank construction.
Verdict
No finding. Config bag only. Out of Immunefi leftover remaining for this slice.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftover that listed remaining-runtime trees open is exhausted on this pin. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Arbitrum leftover remaining websites leftover
Immunefi program arbitrum ($2,000,000, kyc: true). Official remaining listed after token-bridge libs leftover. Listed first-party web surfaces. Live fetch 2026-09-03 via Firecrawl (portal) + curl HEAD (docs / foundation). Do not rematch token-bridge + Inbox leftover, custom reverse gateway leftover, nitro challenge leftover, fund-distribution leftover, governance leftover, or token-bridge libs leftover. No mainnet writes. No exploit PoCs.
Opened: https://portal.arbitrum.io/bridge, https://portal.arbitrum.io/earn, https://docs.arbitrum.io/, https://arbitrum.foundation/, https://arbitrum.io/tos. Direct curl from this VM returns Cloudflare 403 on arbitrum.io / portal.arbitrum.io; Firecrawl returned 200 for portal pages.
Checked for: an official page that asks for a seed phrase or private key; a first-party wallet connect that signs a stranger transfer; a bridge UI that drains a connected mainnet wallet without user intent.
Result: no user-exploitable finding. Not submitted.
portal.arbitrum.io/bridgeis the official Arbitrum bridge UI. It shows From/To chain selectors, amount fields, optional custom recipient, a Terms checkbox linkingarbitrum.io/tos, and Connect Wallet. No seed/private-key import form in the rendered page.portal.arbitrum.io/earnis a yield discovery aggregator (Aave, Pendle, Lido, Ether.fi, etc.). It lists APY/TVL and deep-links to opportunity pages; it does not custody user funds itself.docs.arbitrum.iois developer documentation (Docusaurus). It links to the official bridge/portal and node/run guides. No wallet connect on the docs home page.arbitrum.foundationis marketing + DAO governance links (Tally form, forum, Discord). No wallet connect on the homepage scrape.arbitrum.io/tosis Offchain Labs Terms of Service (legal). Not a wallet surface.
Do not file third-party protocol yield links on the Earn tab as an official first-party drain.
Not submitted. Payment requires user KYC. Remaining listed: unused official leftover that listed Arbitrum trees open is exhausted at leftover-heading level. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining ResourceMetering leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused bedrock leftover after websites leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L1/ResourceMetering.sol. Official raw GitHub 200. Local extract /tmp/op-resource/ResourceMetering.sol (173 lines). Do not rematch L1 portal / StandardBridge leftover, dispute games leftover, or ETHLockbox leftover. No mainnet writes. No exploit PoCs.
Checked for: metered that undercharges a stranger deposit; useGas that lets an unprivileged caller inflate demand without paying; base-fee update that refunds ETH to msg.sender; bypass that skips the OutOfGas cap.
Result: no user-exploitable finding. Not submitted.
- Abstract EIP-1559-style deposit gas market helper inherited by leftover-logged OptimismPortal paths.
ResourceParamstracksprevBaseFee,prevBoughtGas,prevBlockNum; config comes from virtual_resourceConfig()in the child. metered(_amount): runs the wrapped function, then_metered. On a new block, updates base fee from prior demand vs target (maxResourceLimit / elasticityMultiplier), including empty-block decay via leftover-loggedArithmetic.cdexp. Clamps betweenminimumBaseFeeandmaximumBaseFee.- Demand accounting:
prevBoughtGas += _amount; revertsOutOfGas()if abovemaxResourceLimit. Charge isresourceCost = _amount * prevBaseFee, converted to gas units withgasCost = resourceCost / max(block.basefee, 1 gwei). - Settlement burns excess gas stipend via leftover-logged
Burn.gas(gasCost - usedGas)whengasCost > usedGas. No ETH transfer to a third party; surplus is burned from the caller’s tx gas budget. useGasisinternalonly (L1 system-tx path) and only incrementsprevBoughtGas.__ResourceMetering_initsets starting base fee to 1 gwei once.
Do not file an EIP-1559 deposit gas burn as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused bedrock helpers (CrossDomainOwnable / other unlogged packages/contracts-bedrock slices) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining CrossDomainOwnable leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused bedrock leftover after ResourceMetering leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L2/{CrossDomainOwnable,CrossDomainOwnable2,CrossDomainOwnable3}.sol. Official raw GitHub 200. Local extract /tmp/op-cross/ (23 / 29 / 57 lines). Do not rematch L1 portal / StandardBridge leftover, dispute games leftover, ETHLockbox leftover, or ResourceMetering leftover. No mainnet writes. No exploit PoCs.
Checked for: _checkOwner that accepts an unaliased L2 EOA as owner when isLocal is false; messenger spoof that sets xDomainMessageSender to an attacker-chosen address without a real L1→L2 relay; transferOwnership(_owner, _isLocal) that lets a non-owner flip isLocal or assign ownership.
Result: no user-exploitable finding. Not submitted.
CrossDomainOwnable(portal-direct path):_checkOwnerrequiresowner() == AddressAliasHelper.undoL1ToL2Alias(msg.sender). Only the aliased L1 owner contract can pass when calling through the portal.CrossDomainOwnable2(messenger path): requiresmsg.sender == Predeploys.L2_CROSS_DOMAIN_MESSENGERandowner() == messenger.xDomainMessageSender(). A random L2 caller cannot satisfy both.CrossDomainOwnable3: whenisLocal, standardowner() == msg.sender. When not local, same messenger +xDomainMessageSendergate as v2.transferOwnershipisonlyOwnerand rejects zero address; it updatesisLocalatomically with ownership transfer.
Do not file cross-domain aliasing or messenger sender checks as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused bedrock helpers (CrossL2Inbox / SuperchainConfig / LegacyMessagePasser / L2ProxyAdmin / other unlogged packages/contracts-bedrock slices) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining CrossL2Inbox leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused bedrock leftover after CrossDomainOwnable leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L2/CrossL2Inbox.sol. Official raw GitHub 200. Local extract /tmp/op-crossl2/CrossL2Inbox.sol (136 lines). Do not rematch L1 portal / StandardBridge leftover, dispute games leftover, ETHLockbox leftover, ResourceMetering leftover, or CrossDomainOwnable leftover. No mainnet writes. No exploit PoCs.
Checked for: validateMessage that accepts a forged _id / _msgHash without the checksum slot pre-warmed in the tx access list; deposit-tx bypass when block.basefee > 0; checksum collision that lets a stranger replay another chain’s message on this chain.
Result: no user-exploitable finding. Not submitted.
- Predeploy inbox for interop message execution.
validateMessagereverts on deposit txs whenblock.basefee > 0 && tx.gasprice == 0, blocking L1-deposit execution paths on L2. - Checksum binds
origin,msgHash,blockNumber,logIndex,timestamp, andchainIdwith field bounds (uint64/uint32) and type-3 MSB masking._isWarmmeasuressloadgas; revertsNotInAccessList()unless the checksum slot was pre-declared warm via EIP-2930 access list entries in the same tx. - Emits
ExecutingMessageonly after warm-slot verify. Permissionless execution is intentional; downstream consumers (e.g. leftover-loggedL2ToL2CrossDomainMessenger.relayMessage) still gate on messenger origin and freshsuccessfulMessageshashes.
Do not file intentional permissionless interop validation as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused bedrock helpers (SuperchainConfig / LegacyMessagePasser / L2ProxyAdmin / other unlogged packages/contracts-bedrock slices) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining SuperchainConfig leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused bedrock leftover after CrossL2Inbox leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L1/SuperchainConfig.sol plus parent ProxyAdminOwnedBase.sol. Official raw GitHub 200. Local extract /tmp/op-crossl2/SuperchainConfig.sol (171 lines). Do not rematch L1 portal / StandardBridge leftover, dispute games leftover, ETHLockbox leftover, ResourceMetering leftover, CrossDomainOwnable leftover, or CrossL2Inbox leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger pause / unpause / extend that blocks withdrawals without being guardian; initialize that lets a random caller set guardian; expired pause that still reads as active; identifier collision that unpauses another cluster.
Result: no user-exploitable finding. Not submitted.
- Global superchain pause registry.
initializeis gated by leftover-loggedProxyAdminOwnedBase._assertOnlyProxyAdminOrProxyAdminOwner()._setGuardianis internal-only from init/upgrade paths. pause,unpause, andextendall call_assertOnlyGuardian()(msg.sender == guardian). Re-pausing an active identifier revertsAlreadyPaused; extending a non-paused identifier revertsNotAlreadyPaused.paused(_identifier)returns false onceblock.timestamp >= pauseTimestamps[_identifier] + PAUSE_EXPIRY(3 months). Legacypaused()delegates to identifieraddress(0).
Do not file intentional guardian pause controls as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused bedrock helpers (LegacyMessagePasser / L2ProxyAdmin / other unlogged packages/contracts-bedrock slices) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining LegacyMessagePasser leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused bedrock leftover after SuperchainConfig leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/legacy/LegacyMessagePasser.sol. Official raw GitHub 200. Local extract /tmp/op-crossl2/LegacyMessagePasser.sol (26 lines). Do not rematch SuperchainConfig leftover or prior Optimism bedrock leftovers. No mainnet writes. No exploit PoCs.
Checked for: passMessageToL1 that marks another sender’s hash; withdrawal finalize on L1 that trusts an unauthenticated sentMessages entry from this deprecated predeploy.
Result: no user-exploitable finding. Not submitted.
- Deprecated Bedrock-predecessor L2→L1 message recorder at predeploy
0x4200…0000.passMessageToL1setssentMessages[keccak256(abi.encodePacked(_message, msg.sender))] = truefor the caller’s own(message, sender)pair only. - No ETH transfer, no L1 execution, no cross-chain auth beyond recording intent. Modern withdrawals use leftover-logged
L2ToL1MessagePasser, not this contract.
Do not file deprecated message recording as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused bedrock helpers (L2ProxyAdmin / other unlogged packages/contracts-bedrock slices) if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Optimism leftover remaining L2ProxyAdmin leftover (eea9542)
Immunefi program optimism ($2,000,042, kyc: true). Official remaining unused bedrock leftover after LegacyMessagePasser leftover. Official ethereum-optimism/optimism eea9542 (eea9542814bdb8784a4d8d8628b31d19f2af4129). Opened listed packages/contracts-bedrock/src/L2/L2ProxyAdmin.sol plus inherited leftover-logged ProxyAdmin.sol. Official raw GitHub 200. Local extract /tmp/op-crossl2/L2ProxyAdmin.sol (59 lines). Do not rematch SuperchainConfig / LegacyMessagePasser leftovers or prior Optimism bedrock leftovers. No mainnet writes. No exploit PoCs.
Checked for: upgradePredeploys callable by a random L2 EOA; delegatecall to attacker-chosen _l2ContractsManager that upgrades predeploys without Constants.DEPOSITOR_ACCOUNT; owner bypass on standard ProxyAdmin.upgrade inherited paths.
Result: no user-exploitable finding. Not submitted.
- L2 predeploy proxy admin at
0x4200…0018. Extends leftover-loggedProxyAdminwith batchupgradePredeploys. upgradePredeploysrequiresmsg.sender == Constants.DEPOSITOR_ACCOUNT(L1 deposit/system path), rejects empty code at_l2ContractsManager, and delegatecallsIL2ContractsManager.upgrade(). Failure revertsUpgradeFailed.- Standard proxy upgrade/remove/change-owner functions remain on inherited
ProxyAdminand are owner-gated there; constructor sets owner toaddress(0)because L2 genesis sets ownership via proxy storage.
Do not file system-depositor predeploy upgrades as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: unused bedrock helpers on other standing Immunefi programs if still open; Optimism listed bedrock helpers on pin eea9542 are largely exhausted at leftover-heading level. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ethena leftover remaining StakedENA leftover (Sourcify)
Immunefi program ethena ($3,000,000, kyc: true). Official remaining unused leftover after minting + staking leftover. Sourcify ETH exact_match StakedENA proxy 0x8bE3460A480c80728a8C4D7a5D5303c85ba7B3b9 (TransparentUpgradeableProxy) impl 0x7fD57b46aE1a7b14f6940508381877Ee03e1018B (StakedENA). Opened listed StakedENA.sol, ENASilo.sol, SingleAdminAccessControlUpgradeable.sol. Official Sourcify 200. Local extract /tmp/ethena-sena/ (411 / 29 / 82 lines). Do not rematch minting + staking leftover (EthenaMinting / StakedUSDeV2 / LP / PSM). No mainnet writes. No exploit PoCs.
Checked for: unstake that withdraws another user’s silo cooldown; cooldownAssets / cooldownShares that burn a stranger’s shares; withdraw / redeem that bypass cooldown and pull another owner without allowance; transferInRewards that credits a caller without REWARDER_ROLE; EnaSilo.withdraw callable by a random EOA.
Result: no user-exploitable finding. Not submitted.
- ERC-4626 sENA vault over ENA. When
cooldownDuration > 0,withdraw/redeemrevert viaensureCooldownOff. Cooldown path:cooldownAssets/cooldownSharesrequireassets <= maxWithdraw(msg.sender)/shares <= maxRedeem(msg.sender)and_withdraw(..., _owner=msg.sender)into the silo. unstakereads onlycooldowns[msg.sender]and payssilo.withdraw(receiver, assets)aftercooldownEnd(or if duration is later set to 0). SilowithdrawisonlyStakingVault.transferInRewardsisonlyRole(REWARDER_ROLE)andsafeTransferFroms the rewarder.rescueTokenscannot move the ENA asset. Blacklist / redistribute are role-gated;_beforeTokenTransferblocks blacklisted from/to except burn-from-blacklisted.initializeisinitializer; constructor_disableInitializers(). Admin transfer is two-step (transferAdmin/acceptAdmin).
Do not file a caller-bound cooldown or a role-gated reward transfer as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: USDtb token proxies / other OFT adapters / TON / other-chain rows if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ethena leftover remaining USDtb leftover (Sourcify)
Immunefi program ethena ($3,000,000, kyc: true). Official remaining unused leftover after StakedENA leftover. Sourcify ETH exact_match USDtb proxy 0xC139190F447e929f090Edeb554D95AbB8b18aC1C (TransparentUpgradeableProxy) impl 0x9D6d77a21702b9AFcF924983fbFB84AAAAe79589 (AnchorageTokenUSDtb). Opened listed AnchorageTokenUSDtb.sol plus SingleAdminAccessControlUpgradeable.sol. Official Sourcify 200. Local extract /tmp/ethena-usdtb/ (291 / 93 lines). Do not rematch minting leftover (USDtbMinting) or StakedENA leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger mint / burn without MINTER_BURNER_ROLE; initialize / initializeV2 that lets a random caller seize admin; deprecated burn / burnFrom that still burn another account; blocklist bypass that transfers from a blocked holder.
Result: no user-exploitable finding. Not submitted.
- Regulated ERC-20 USDtb.
mintandburn(address,amount)areonlyRole(MINTER_BURNER_ROLE)andwhenNotPaused. Legacyburn(uint256)/burnFromalways revertDeprecated(). _beforeTokenTransferrevertsAccountBlockediffromortois blacklisted (except burns toaddress(0)).blockAccounts/unblockAccountsareBLOCKLISTER_ROLE;pause/unpausearePAUSER_ROLE.initializeisinitializer;initializeV2isreinitializer(2)and rejects zero addresses. Constructor_disableInitializers(). Admin is two-step via leftover-loggedSingleAdminAccessControlUpgradeable.
Do not file a role-gated stablecoin mint/burn as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: other OFT adapters / TON / other-chain rows if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: LayerZero leftover remaining ULN301 leftover (9c741e7)
Immunefi program layerzero ($15,000,000, kyc: true). Official remaining unused leftover after ETH Endpoint leftover. Official LayerZero-Labs/LayerZero-v2 9c741e7 (9c741e7f9790639537b1710a203bcdfd73b0b9ac). Opened listed packages/layerzero-v2/evm/messagelib/contracts/uln/uln301/{ReceiveUln301,SendUln301,TreasuryFeeHandler,ReceiveLibBaseE1,SendLibBaseE1}.sol. Official raw GitHub 200. Local extract /tmp/lz-uln301/ (83 / 99 / 41 / 103 / 194 lines). Do not rematch EndpointV2 / SendUln302 / ReceiveUln302 / DVN leftover. No mainnet writes. No exploit PoCs.
Checked for: send that attributes a stranger OApp or refunds native to the caller; TreasuryFeeHandler.payFee that pulls LZ tokens from a non-sender; commitVerification that executes without DVN reclaim; _execute that lets a non-executor deliver a payload.
Result: no user-exploitable finding. Not submitted.
- ULN301 is Endpoint V1 glue over leftover-logged ULN302-style send/receive bases.
SendUln301.setConfigisonlyEndpoint.sendisonlyEndpoint;_assertPathrequires_sender ==the local address in_path; nonce increments vianonceContract; workers then treasury are paid from the attachedmsg.value, with excess refunded to_refundAddress. - LZ-token fee requires
_lzTokenPaymentAddress == sender.TreasuryFeeHandler.payFeerequiresendpoint.getSendLibraryAddress(_sender) == msg.senderandendpoint.isSendingPayload(), thensafeTransferFrom(_sender, _treasury, _required). ReceiveUln301.commitVerificationasserts the packet header forlocalEid, then leftover-logged_verifyAndReclaimStorage(DVN confirmations), then_execute._executerevertsOnlyExecutorunlessmsg.sender == getExecutor(receiver, srcEid).- Default executors are
onlyOwner. WorkerwithdrawFeedebits the caller’s accrued fee balance.
Do not file endpoint-gated send or executor-gated commit as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: ExecutorFeeLib / PriceFeed / OApp examples / other-chain twins if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ether.fi leftover remaining Auction leftover (b4a0968)
Immunefi program etherfi ($500,000, kyc: true). Official remaining unused leftover after LiquidityPool leftover. Official etherfi-protocol/smart-contracts b4a0968 (b4a0968087b178bc346cdf6bee6c0597bf4c42c7). Opened listed src/staking/AuctionManager.sol and src/oracle/EtherFiOracle.sol. Official raw GitHub 200. Local extract /tmp/ef-auction/ (365 / 496 lines). Official src/core/eETH.sol 404 (same as prior leftover). Do not rematch LiquidityPool / WeETH / Liquifier leftover. No mainnet writes. No exploit PoCs.
Checked for: cancelBid that refunds another bidder’s ETH; updateSelectedBidInformation that forwards a stranger bid to the caller; submitReport that publishes without committee membership or quorum.
Result: no user-exploitable finding. Not submitted.
createBidrequires exactmsg.value == _bidSize * _bidAmountPerBidwithin min/max (and whitelist when enabled). Each bid recordsbidderAddress = msg.sender._cancelBidrequiresbid.bidderAddress == msg.senderandisActive, then refundsbid.amounttomsg.sender.updateSelectedBidInformationisonlyStakingManagerContract; it deactivates the bid and sends ETH to immutabletreasury, not the caller.- Bid-price / whitelist admin functions are
onlyOperatingMultisig. Upgrade isonlyUpgradeTimelock. EtherFiOracle.submitReportrequiresshouldSubmitReport(msg.sender)(registered + enabled committee member, finalized slot, last report handled). Consensus publishes only aftersupport >= quorumSize. Unpublish / committee changes are timelock or operating-multisig. No ETH transfer in the oracle.
Do not file a bidder-only refund or a committee-quorum report as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: OFT / bridge adapters / other-chain weETH if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: LayerZero leftover remaining ExecutorFeeLib leftover (9c741e7)
Immunefi program layerzero ($15,000,000, kyc: true). Official remaining unused leftover after ULN301 leftover. Official LayerZero-Labs/LayerZero-v2 9c741e7 (9c741e7f9790639537b1710a203bcdfd73b0b9ac). Opened listed packages/layerzero-v2/evm/messagelib/contracts/{ExecutorFeeLib,PriceFeed}.sol. Official raw GitHub 200. Local extract /tmp/lz-uln301/ (241 / 304 lines). Do not rematch ULN301 leftover or ETH Endpoint leftover. No mainnet writes. No exploit PoCs.
Checked for: getFeeOnSend that pulls ETH from a stranger; withdrawToken / withdrawFee callable by a random EOA; setPrice that lets an unprivileged updater inflate quotes and steal send fees.
Result: no user-exploitable finding. Not submitted.
ExecutorFeeLibis a view quote helper. BothgetFee/getFeeOnSendoverloads only decode options and callPriceFeed.estimateFeeByEid.withdrawTokenisonlyOwner(native if token isaddress(0)).PriceFeed.getFeeispureand returns 0;estimateFeeOnSendtherefore never requiresmsg.value. Price / model-type writes areonlyOwneroronlyPriceUpdater.withdrawFeeisonlyOwner.- Neither contract custody user OFT balances. Send-path fee collection remains on leftover-logged Endpoint / ULN send libraries.
Do not file an owner-gated fee-lib withdraw or a view quote as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: OApp examples / other-chain twins if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: LayerZero leftover remaining OApp OFT leftover (9c741e7)
Immunefi program layerzero ($15,000,000, kyc: true). Official remaining unused leftover after ExecutorFeeLib leftover. Official LayerZero-Labs/LayerZero-v2 9c741e7 (9c741e7f9790639537b1710a203bcdfd73b0b9ac). Opened listed packages/layerzero-v2/evm/oapp/contracts/{oapp/{OApp,OAppCore,OAppSender,OAppReceiver},oft/{OFT,OFTCore,OFTAdapter}}.sol. Official raw GitHub 200. Local extract /tmp/lz-oapp/ (39–399 lines). Do not rematch ULN301 leftover, ExecutorFeeLib leftover, or ETH Endpoint leftover. No mainnet writes. No exploit PoCs.
Checked for: send that debits a stranger without approval; _lzReceive that credits a forged recipient without a trusted peer; setPeer callable by a random EOA; OFTAdapter unlock that pays the executor instead of the decoded recipient.
Result: no user-exploitable finding. Not submitted.
OAppReceiver.lzReceiverequiresmsg.sender == endpointand_origin.sender == peers[srcEid].setPeer/setDelegateareonlyOwner.OFTCore.sendcalls_debit(msg.sender, ...), then_lzSendwith_getPeerOrRevert. DefaultOFT._debitburns from_from; defaultOFTAdapter._debitsafeTransferFroms_frominto the adapter._creditmints/transfers to the decodedsendToaddress only after peer-gated delivery.OAppSender._payNativerequiresmsg.value == _nativeFee; LZ token fees usesafeTransferFrom(msg.sender, endpoint, ...). Slippage guard reverts ifamountReceivedLD < minAmountLD.
Do not file a peer-gated OFT burn/mint or an endpoint-only receive as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: other-chain twins / example OmniCounter if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ethena leftover remaining USDeOFTAdapter leftover (Sourcify)
Immunefi program ethena ($3,000,000, kyc: true). Official remaining unused leftover after USDtb leftover. Sourcify ETH match USDeOFTAdapter 0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34. Opened listed USDeOFTAdapter.sol, OFTOwnable2StepAdapter.sol, RateLimiter.sol. Official Sourcify 200. Local extract /tmp/ethena-oft/ (71 / 76 / 81 lines). Do not rematch minting + staking leftover, StakedENA leftover, or USDtb leftover. No mainnet writes. No exploit PoCs.
Checked for: send that locks a stranger’s USDe without approval; _lzReceive credit without a trusted LZ peer; setRateLimits that lets a random caller disable outbound caps; rate-limit bypass that unlocks another user’s locked USDe.
Result: no user-exploitable finding. Not submitted.
- LayerZero OFT adapter over USDe via leftover-logged
OFTAdapterpull/debit semantics.OFTOwnable2StepAdapteruses two-step ownership and blocksrenounceOwnership. - Outbound
_debitapplies_checkAndUpdateRateLimitthensuper._debit(caller-funded lock). UnconfigureddstEidyieldsamountCanBeSent == 0, revertingRateLimitExceeded. setRateLimiterisonlyOwner.setRateLimitsrequiresmsg.sender == rateLimiter || owner(). Inbound credit remains on peer-gatedlzReceivein the inherited OFT stack.
Do not file a rate-limited OFT adapter lock or a peer-gated mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: TON / other-chain OFT rows if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ether.fi leftover remaining bridge adapters leftover (1f502e1)
Immunefi program etherfi ($500,000, kyc: true). Official remaining unused leftover after Auction leftover. Listed Immunefi ETH bridge adapters (added 15 Dec 2025): NTTAdapter 0x16B4AE4D4c96793524084A22E6f4c160cad08975, EtherFiOFTBridgeAdapter 0x3E0ccbce6c3beC4826397005c877BE66C39D9912, ScrollERC20BridgeAdapter 0x319a33b9A3080c17A825E3A539c49A60bbB2E793, EtherFiLiquidBridgeAdapter 0x86016539796E660d4cD333459378763FaFFa6Eee, StargateAdapter 0xeb39db7a020DB2ac0890d51F9d5b817e7ef2b1A3. Official etherfi-protocol/cash-v3 1f502e1 (1f502e1aad29fec9c133c9a17fa37f186cb852e4). Opened listed src/top-up/bridge/{BridgeAdapterBase,EtherFiOFTBridgeAdapter,NTTAdapter,ScrollERC20BridgeAdapter,EtherFiLiquidBridgeAdapter,StargateAdapter}.sol plus delegatecall caller src/top-up/TopUpFactory.sol (bridge). Sourcify 404 on all five listed adapter addresses (chain 1). Official raw GitHub 200. Local extract /tmp/ef-bridge-adapters/ (56 / 80 / 75 / 75 / 82 / 116 / 864 lines). Do not rematch LiquidityPool / WeETH / Liquifier leftover or Auction leftover. No mainnet writes. No exploit PoCs.
Checked for: permissionless bridge that pulls another user's ERC-20 from TopUpFactory without TOPUP_FACTORY_BRIDGER_ROLE; delegatecall adapter that lets a stranger set destRecipient; OFT / Stargate / NTT send that credits the executor instead of the configured recipient; Scroll depositERC20 that routes L2 credit to msg.sender; Liquid teller bridge with a mismatched vault that drains unrelated tokens; direct adapter calls that steal factory custody when adapters are invoked outside TopUpFactory.
Result: no user-exploitable finding. Not submitted.
- TopUpFactory
bridge(token, amount, destChainId)iswhenNotPaused+onlyRole(TOPUP_FACTORY_BRIDGER_ROLE), requires configuredtokenChainConfig, checks factory balance>= amount, and delegatecalls the configured adapter with fixedconfig.recipientOnDestChain(not caller-supplied). Bridge fee must be passed asmsg.value. - Adapters are written for delegatecall:
address(this)is TopUpFactory, soforceApprove/ WETH unwrap / native fee checks operate on factory balances only when invoked through the factory path. - EtherFiOFTBridgeAdapter quotes LayerZero OFT
send, enforcesminAmountLDslippage, and refunds excess native toaddress(this)(factory). StargateAdapter rejects pools whosetoken()!= input token (InvalidStargatePool) and revalidates quoted receive amount vs slippage. NTTAdapter strips transfer dust beforetransfer. ScrollERC20BridgeAdapter pays Scroll L1 gateway fee from factory ETH and deposits to the configured L2 recipient. EtherFiLiquidBridgeAdapter requiresteller.vault() == token(InvalidTeller) beforeteller.bridge. - Direct external calls to standalone adapter bytecode only move tokens/ETH already held by the adapter contract itself; they cannot reach TopUpFactory custody without the bridger role path above.
Do not file a bridger-role gated factory bridge or a direct-call adapter balance move as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: other-chain weETH (weETH-cross-chain) / RoleRegistry / TopUpSourceFactory / PixWalletAutoTopup / Scroll Cash modules if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ether.fi leftover remaining weETH-cross-chain leftover (7e535a7)
Immunefi program etherfi ($500,000, kyc: true). Official remaining unused leftover after bridge adapters leftover. Official etherfi-protocol/weETH-cross-chain 7e535a7 (7e535a7fa6dbc6c85ebfbc8e8ea921c6732ddf19). Opened listed OFT stack contracts/{EtherFiOFTAdapter,EtherFiOFTAdapterUpgradeable,EtherfiOFTUpgradeable,PairwiseRateLimiter}.sol; native-minting L1/L2 sync pools native-minting/{EtherfiL1SyncPoolETH,EtherfiL2ExchangeRateProvider,BucketRateLimiter}.sol, layerzero-base/{L1BaseSyncPoolUpgradeable,L2BaseSyncPoolUpgradeable,L1BaseReceiverUpgradeable}.sol, L2 OP/Scroll ETH sync pools, and receivers/L1ScrollReceiverETHUpgradeable.sol. Official raw GitHub 200. Local extract /tmp/weeth-cross-extract/ (15 / 82 / 106 / 206 / 276 / 329 / 478 / 108 / 124 / 126 / 48 / 80 / 39 lines). Do not rematch LiquidityPool / WeETH / Liquifier leftover, Auction leftover, or bridge adapters leftover. No mainnet writes. No exploit PoCs.
Checked for: permissionless L2 mint of weETH/OFT to a stranger; lzReceive / _lzReceive on L1 sync pool without a trusted LZ peer; onMessageReceived callable by a non-registered receiver or spoofed L2 messenger sender; L2 sync that inflates unsyncedAmountIn/Out beyond prior deposits; sweep / finalize paths that pay the caller instead of the lockbox; OFT _credit without inbound rate-limit / pause guards; BucketRateLimiter.updateRateLimit from a non-consumer.
Result: no user-exploitable finding. Not submitted.
- OFT adapters extend leftover-logged LayerZero
OFTAdapter/OFTUpgradeablewith owner-set pairwise inbound/outbound rate limits and pauser roles.EtherfiOFTUpgradeable.mintisonlyRole(MINTER_ROLE)(sync-pool consumer)._debit/_creditapply rate limits andwhenNotPaused. - L2
depositpulls ETH (or ERC-20) frommsg.sender, converts via configured exchange-rate provider, optionally updatesBucketRateLimiterasconsumer-only, and mintstokenOuttomsg.sender. UnauthorizedtokenInreverts (l1Address == address(0)). - L2
syncis permissionless but only forwards accumulatedunsyncedAmountIn/Outfrom prior deposits, then zeroes counters before LZ + native-bridge messages. OP/Scroll variants additionally send ETH through the canonical messenger to the configured L1 receiver. - L1
_lzReceive(anticipated deposit) is peer-gated viaOAppReceiver;_handleAnticipatedDepositsends mintedtokenOutto the configured lockbox, trackingtotalUnbackedTokenson shortfall.onMessageReceivedrequiresmsg.sender == receivers[originEid].L1BaseReceiverrequiresmsg.sender == messengerand L2 sender ==l1SyncPool.peers(originEid)before forwarding ETH to finalize.EtherfiL1SyncPoolETHanticipated/finalize paths are ETH-only, pausable, and use dummy-token + liquifier plumbing tied to per-originEidconfig. sweepon L1 base sync pool isonlyOwner. Rate-limiter capacity/refill and sync-pool peer/receiver wiring are owner/admin gated.
Do not file a peer-gated LZ receive, messenger-authenticated finalize, or MINTER_ROLE sync-pool mint as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: PixWalletAutoTopup destination config / Scroll Cash modules if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ether.fi leftover remaining RoleRegistry TopUpSourceFactory leftover (1f502e1)
Immunefi program etherfi ($500,000, kyc: true). Official remaining unused leftover after weETH-cross-chain leftover. Listed Immunefi ETH assets (added 15 Dec 2025): RoleRegistry 0x55963de88267Aa3D1D995c359e8068D0Df34BEBb, TopUpSourceFactory (TopUpFactory) 0xF4e147Db314947fC1275a8CbB6Cde48c510cd8CF, PixWalletAutoTopup 0xf76f1bea29b5f63409a9d9797540A8E7934B52ea (configured settlement recipient, not deployable contract bytecode). Official etherfi-protocol/cash-v3 1f502e1 (1f502e1aad29fec9c133c9a17fa37f186cb852e4). Opened src/role-registry/RoleRegistry.sol, src/{beacon-factory/BeaconFactory,utils/UpgradeableProxy}.sol, src/top-up/{TopUpFactory,TopUp}.sol, and src/settlement-dispatcher/SettlementDispatcherV2.sol (PIX auto-topup destination wiring). Sourcify 404 on RoleRegistry and TopUpSourceFactory (chain 1). Official raw GitHub 200. Local extract /tmp/ef-cash-role-topup/ (276 / 121 / 119 / 863 / 197 / 984 lines). Do not rematch bridge adapters leftover (adapter delegatecall path), weETH-cross-chain leftover, LiquidityPool leftover, or Auction leftover. No mainnet writes. No exploit PoCs.
Checked for: stranger grantRole / configureSafeAdmins that escalates Cash protocol privileges; permissionless TopUpFactory upgrade or beacon impl swap; processTopUp / deployTopUpContract that drains another user's TopUp to the caller; redirectToTradingSafe that sends funds to an attacker-chosen TradingSafe; SettlementDispatcher bridge / setDestinationData that routes PIX/USDC to a caller-controlled recipient without bridger/admin roles; withdrawFunds callable by a random EOA.
Result: no user-exploitable finding. Not submitted.
RoleRegistry.setRole/grantRole/revokeRoleare owner-only (SoladyOwnable).configureSafeAdminsrequiresmsg.senderbe a registered EtherFi Safe viaetherFiDataProvider.isEtherFiSafe. Per-safe admin roles are scoped togetSafeAdminRole(msg.sender)._authorizeUpgradeisonlyOwner.UpgradeableProxy/BeaconFactoryupgrades requireroleRegistry.onlyUpgrader(msg.sender)(registry owner).upgradeBeaconImplementationisonlyRoleRegistryOwner._deployBeaconverifies CREATE3 address matches prediction before init.TopUpFactory.deployTopUpContractis permissionless but initializes each TopUp withowner = address(this);TopUp.processTopUprequiresmsg.sender == owner, so sweeps move balances only into the factory, not the external caller. PermissionlessprocessTopUpis gated by_validateSweepTokens(supported-token set).bridgeandredirectToTradingSaferemain role-gated (TOPUP_FACTORY_BRIDGER_ROLE,TOPUP_FACTORY_REDIRECT_ROLE); redirect resolves destination from the TopUp's deterministic TradingSafe, not caller input. AdminrecoverFundsblocks supported bridge tokens.SettlementDispatcherV2.setDestinationData(where PixWalletAutoTopup is wired asdestRecipient) isonlyRoleRegistryOwner.bridge/ liquid withdraw paths areSETTLEMENT_DISPATCHER_BRIDGER_ROLEand use admin-configureddestRecipient(including the listed Pix wallet).withdrawFundsis owner-only.
Do not file an owner-/bridger-role gated registry upgrade or a factory-owned TopUp sweep as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: eETH impl 404 if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ether.fi leftover remaining Scroll Cash modules leftover (1f502e1)
Immunefi program etherfi ($500,000, kyc: true). Official remaining unused leftover after RoleRegistry TopUpSourceFactory leftover. Listed Immunefi Scroll (chain 534352) Cash assets: DebtManager 0x0078C5a459132e279056B2371fE8A8eC973A9553, EtherFiLiquidModule 0x2A0E60E26a118fF6F181B98666E6FD6BBf3e1826, LiquidUSDLiquifierModule 0x23C4dc847Cd876D4ca2C15b4a1EAD349dC705082, SettlementDispatcherCardOrder 0x2539031cD38e98317Cd246c8ED36F31117e6725b (BinSponsor.CardOrder). Official etherfi-protocol/cash-v3 1f502e1 (1f502e1aad29fec9c133c9a17fa37f186cb852e4). Opened listed src/debt-manager/{DebtManagerCore,DebtManagerStorageContract}.sol, src/modules/etherfi/{EtherFiLiquidModule,LiquidUSDLiquifierOP}.sol (Scroll prod liquifier path per DeployCashLendProd.s.sol), and src/settlement-dispatcher/SettlementDispatcherV2.sol. Sourcify match on all four Scroll addresses (534352). Official raw GitHub 200. Local extract /tmp/ef-cash-v3/ (954 / 671 / 629 / 276 / 984 lines). Do not rematch bridge adapters leftover, weETH-cross-chain leftover, RoleRegistry TopUpSourceFactory leftover (PIX wiring), LiquidityPool leftover, or Auction leftover. No mainnet writes. No exploit PoCs.
Checked for: permissionless borrow / repay / liquidate that opens DebtManager debt or seizes Safe collateral without EtherFi Safe + legacy-engine gates; migrateToLendGateway callable by a stranger leaving a half-migrated Safe exploitable by third parties; supply / withdrawBorrowToken that drains supplier shares without approval; Liquid module deposit / withdraw / executeBridge without Safe admin signatures or without a matching CashModule pending withdrawal; repayUsingLiquidUSD that pulls Liquid USD from a stranger Safe without ETHER_FI_WALLET_ROLE; withdrawLiquidUSD / CardOrder bridge that routes settlement float to a caller-chosen recipient; owner-only withdrawFunds callable by a random EOA.
Result: no user-exploitable finding. Not submitted.
DebtManagerCore.borrowisonlyEtherFiSafe+onlyLegacySafe(msg.sender)andensureHealthbefore sending borrowed stables to the configured settlement dispatcher.repay/liquidaterequire the user Safe be on the legacy engine.migrateToLendGatewayisonlyRole(ETHER_FI_WALLET_ROLE)and atomically clears legacy debt, supplies collateral to Aave when applicable, re-borrows on the gateway, and flipsusesLendGatewayin the same tx. Suppliersupply/withdrawBorrowTokenare self-custodied share accounting withsafeTransferFrom/safeTransferonmsg.sender. Admin paths delegate throughDebtManagerAdminvia fallback;setAdminImplisonlyRoleRegistryOwner.EtherFiLiquidModuledeposit/withdraw requireonlySafeAdminECDSA nonces tied toblock.chainidandaddress(this).requestBridgerequires Safe owner quorum signatures;executeBridgeonly proceeds whencashModule.getData(safe).pendingWithdrawalRequestmatches the stored bridge request (recipient = module, token, amount) beforeprocessWithdrawaland LayerZero tellerbridge.cancelBridgerequires owner signatures or CashModule callback. Liquid asset/teller/queue config isETHERFI_LIQUID_MODULE_ADMINor registry-owner gated.LiquidUSDLiquifierOPModule.repayUsingLiquidUSDrequiresonlyEtherFiSafe(user)andonlyEtherFiWallet(); gateway repay caps at live Aave debt and routes USDC through the Safe before reclaiming Liquid USD via module execution.withdrawLiquidUSDisSETTLEMENT_DISPATCHER_BRIDGER_ROLE.withdrawFundsisonlyRoleRegistryOwner.SettlementDispatcherCardOrder(immutableBinSponsor.CardOrder) follows leftover-loggedSettlementDispatcherV2:bridge, liquid withdraw, Frax/Midas redeem, andsettleareSETTLEMENT_DISPATCHER_BRIDGER_ROLE; destination recipients and CCTP/OFT/Stargate/canonical paths areonlyRoleRegistryOwner;withdrawFundsis owner-only.
Do not file a Safe-admin-signed Liquid deposit, a bridger-role CardOrder bridge, or a wallet-role LiquidUSD repay as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: eETH impl leftover is logged. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ether.fi leftover remaining eETH impl leftover (b4a0968)
Immunefi program etherfi ($500,000, kyc: true). Official remaining unused leftover after Scroll Cash modules leftover. Listed eETH implementation 0xd1901dD36CBf4a81386d0162DF2707f7dDb60527 (UUPS impl behind eETH token proxy). Official etherfi-protocol/smart-contracts b4a0968 (b4a0968087b178bc346cdf6bee6c0597bf4c42c7). Opened listed src/core/EETH.sol (prior attempts used wrong-case eETH.sol, which 404s). Sourcify 404 on impl 0xd1901dD36CBf4a81386d0162DF2707f7dDb60527 (chain 1). Official raw GitHub 200. Local extract /tmp/ef-smart-contracts/src/core/EETH.sol (526 lines). Do not rematch LiquidityPool / WeETH / Liquifier leftover (pool-side mint/burn already logged), Scroll Cash modules leftover, Auction leftover, bridge adapters leftover, weETH-cross-chain leftover, or RoleRegistry TopUpSourceFactory leftover. No mainnet writes. No exploit PoCs.
Checked for: permissionless mintShares / burnShares that mints or burns a stranger's eETH balance; transfer / transferFrom that bypasses blacklist or share accounting; permit that approves spend for a non-owner; recoverETH / recoverERC20 / recoverERC721 callable by a random EOA; _authorizeUpgrade without timelock.
Result: no user-exploitable finding. Not submitted.
mintShares/burnSharesrequiremsg.sender == address(liquidityPool)(onlyPoolContract/ explicit caller check), apply global mint/burn rate limits, and honor blacklist on the affected user. Transfers are not rate-limited (supply-neutral)._transfer/transferFromdebit the named sender's shares vialiquidityPool.sharesForAmount, with pause + blacklist on sender, recipient, andmsg.sender.permitbinds toownervia EIP-712 nonce and ECDSA recovery;_approveonly sets allowances for the owner.- Asset recovery and UUPS upgrade are
onlyOperatingTimelock/onlyUpgradeTimelock.
Do not file a liquidity-pool-only mint/burn or a permit signed by the owner as stranger theft.
Not submitted. Payment requires user KYC. Ether.fi listed leftovers that official trees open are exhausted at leftover-heading level. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: LayerZero leftover remaining other-chain twins OmniCounter leftover (9c741e7)
Immunefi program layerzero ($15,000,000, kyc: true). Official remaining unused leftover after OApp OFT leftover. Spot-checked listed EVM twins on Arbitrum (chain 42161, EID 30110) via official LayerZero-Labs/lz-address-book: EndpointV2 0x1a44076050125825900e736c501f859c50fE728c, SendUln302 0x975bcD720be66659e3EB3C0e4F1866a3020E493A, ReceiveUln302 0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6 — Sourcify match on all three (same source family as leftover-logged ETH Endpoint slice). Opened example OApp stack packages/layerzero-v2/evm/oapp/contracts/oapp/examples/{OmniCounter,OmniCounterAbstract,OmniCounterPreCrime}.sol plus precrime/PreCrime.sol. Official LayerZero-Labs/LayerZero-v2 9c741e7 (9c741e7f9790639537b1710a203bcdfd73b0b9ac). Official raw GitHub 200. Local extract /tmp/lz-v2/ (15 / 285 / 102 / 211 lines). Do not rematch ETH Endpoint leftover, ULN301 leftover, ExecutorFeeLib leftover, or OApp OFT leftover. No mainnet writes. No exploit PoCs.
Checked for: Arbitrum twin send / verify / lzReceive paths that differ from ETH and let a stranger attribute or deliver another OApp's payload; OmniCounter increment that debits a stranger; _lzReceive that credits a forged peer; withdraw / setAdmin without admin; lzCompose callable outside the endpoint; PreCrime _preCrime bypass that lets inbound exceed outbound without admin brokenIncrement.
Result: no user-exploitable finding. Not submitted.
- Arbitrum EndpointV2 / SendUln302 / ReceiveUln302 Sourcify to the same contracts reviewed on Ethereum (
EndpointV2.sol,SendUln302.sol,ReceiveUln302.solfamily). Cross-chain twins inherit leftover-logged endpoint gating:sendattributesmsg.sender,verifyrequires a valid receive library,lzReceiveclears a verified payload hash before delivery, DVN threshold on commit. OmniCounterAbstractextends leftover-loggedOApp:increment/batchIncrementcall_lzSendwithMessagingFee(msg.value, 0)and refund tomsg.sender;_lzReceiveis peer-gated viaOAppReceiverand only increments local counters / optional compose hooks. Adminwithdraw/setAdmin/brokenIncrementareonlyAdmin.lzComposerequiresmsg.sender == endpointand_oApp == address(this).OmniCounterPreCrimeis a view-only simulator hook comparing inbound vs outbound counts; it does not custody user funds.
Do not file a peer-gated OApp demo counter increment or an admin-only OmniCounter withdraw as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: Aptos / Solana / TON non-EVM rows if still unused. Next unused leftover is a different Immunefi program, not a rematch.
2026-09-03: Ethena leftover remaining StakedUSDeOFTAdapter + ENAOFTAdapter leftover (Blockscout)
Immunefi program ethena ($3,000,000, kyc: true). Official remaining unused leftover after USDeOFTAdapter leftover. Listed Immunefi ETH adapters: StakedUSDeOFTAdapter 0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2, ENAOFTAdapter 0x58538e6a46e07434d7e7375bc268d3cb839c0133. Blockscout ETH match on both; opened verified bundle paths contracts/susde/StakedUSDeOFTAdapter.sol, contracts/usde/{USDeOFTAdapter,ENAOFTAdapter}.sol, plus inherited contracts/libs/{OFTOwnable2StepAdapter,RateLimiter}.sol (same stack as leftover-logged USDeOFTAdapter). Local extract /tmp/ethena-oft-adapters/ (57 / 70 / 70 lines for top-level adapters). Do not rematch USDeOFTAdapter leftover except as inherited base. No mainnet writes. No exploit PoCs.
Checked for: send / _debit that locks a stranger’s sUSDe or ENA without approval; _credit on StakedUSDeOFTAdapter that credits a random caller instead of the decoded recipient; blacklist redirect that lets a non-owner seize inbound OFT to themselves; setRateLimits / setRateLimiter callable by a random EOA; failed hasRole probe on inbound credit that misroutes bridged funds to msg.sender; rate-limit bypass on ENA adapter.
Result: no user-exploitable finding. Not submitted.
- Both adapters extend leftover-logged
OFTOwnable2StepAdapter+RateLimiterwith owner/rate-limiter gatedsetRateLimits. Outbound_debitapplies_checkAndUpdateRateLimitthensuper._debit(caller-fundedsafeTransferFromlock into adapter). ENAOFTAdapteris the same rate-limited adapter shell asUSDeOFTAdapter, differing only by wrapped token address at deploy time.StakedUSDeOFTAdapter._creditqueriesinnerToken.hasRole(FULL_RESTRICTED_STAKER_ROLE, _to); if the recipient is blacklisted or the probe fails, inbound credit is redirected toowner()(documented compliance behavior), notmsg.sender. Peer-gatedlzReceiveremains in inherited OFT stack.- Inbound/outbound paths still require trusted LZ peers configured by owner; no permissionless mint/unlock of another user’s locked balance.
Do not file a compliance blacklist redirect to owner or a rate-limited adapter lock as stranger theft.
Not submitted. Payment requires user KYC. Remaining listed: TON minter/vault/OFT rows (no verified TVM source in session) and other-chain USDeOFT / StakedUSDeOFT / ENAOFT twins if still unused. Next unused leftover is a different Immunefi program, not a rematch.