Security
IndexPad is testnet software. It has been through intensive internal multi-agent review (below), but no professional third-party audit. Do not use it with real funds until the mainnet gates are met.
Design-level guarantees
The most important security properties are structural, not patched-in:
- No trusted operator. The fee split executes inside every swap in the
IndexFeeHook, in the same PoolManager lock. There is no keeper, no batch job, and no privileged "convert" — nothing whose honesty or liveness holders depend on. The oldFeeSwapEngine/IndexDividends/ dividend path is deleted. - Fixed, never-mintable supply. 1,000,000 tokens minted once; there is no
mintfunction anywhere. Bonds sell treasury inventory rather than minting, so supply is a hard invariant that can only decrease via redemption burns. - Immutable token economics. The basket and the 3-way fee split (
rfvShareBps/buybackShareBps) are fixed at launch — the creator cannot rug via parameter changes. There is no blacklist and no fee-exemption list; fees are a property of the pool, not the token. - Unpausable exits. The guardian pause blocks new launches only. Swaps,
IndexTreasury.redeem(), and bondclaim()can never be paused or gated. - Oracle-free floor. Redemption is pure pro-rata arithmetic over the treasury's raw balances — it works even if every price feed is down, and rounding always favors the remaining holders. NAV/backing displays use Chainlink; the payout never does.
- Per-asset isolation. A single frozen/paused RWA can neither brick a trade (the hook's basket leg is
try/catch-isolated, its USDG falling through to the reserve) nor brick an exit (the redeem payout leg is isolated, its share staying as backing). - Vault-style hygiene throughout: checks-effects-interactions,
nonReentrantonredeem/bond/claim, received-amount (net) measurement on deposits and swaps, and hard caps (basket ≤ 16) bounding all loops.
Bond-market safety (built, enabled later)
Bonds sell treasury inventory at a discount, so their whole risk surface is not selling below true value:
- Floored at guarded backing. The sale price is
max(marketTWAP × (1 − discount), backingPerToken), and the backing leg uses a fail-closed reader (backingPerTokenUsdgGuarded) that reverts on a stale/missing feed or a down sequencer. A mispriced-low floor can never let a bond sell below true backing. - Manipulation-resistant market price. The market leg is a TWAP over ≥ 30 min recorded by the hook, not an instantaneous spot; a thin or freshly-launched pool prices off the backing floor instead.
- Minimum vesting (1h). Breaks the atomic crash-spot → bond → claim sequence, forcing any manipulator to carry price-recovery risk across time.
- Strictly accretive. The deposit raises NAV while supply is untouched, so backing-per-token rises with every bond. Confirmed numerically in the adversarial audit.
Internal audits
The protocol has been through repeated multi-agent adversarial audits as its architecture evolved (multiple specialized finders + independent skeptic verifiers, across several rounds). Two are load-bearing for the current design:
- Fixed-supply + treasury-inventory bonds + 3-way split (the pivot to the current model): a 5-lens × 3-skeptic pass at high effort returned 0 confirmed findings, with all seven core invariants numerically verified — fixed supply, protocol-always-10% (in both buyback-success and reroute cases), inventory-only bonds, strictly-accretive, per-asset isolation, one-shot depository latch, and ETH-nets-to-zero.
- Inline-split hook rewrite (USDG single-sided + inline no-keeper fee split): validated by the full unit suite plus an on-chain
LaunchTradeE2Eproving the split grows reserve + buyback + basket every swap. An adversarial audit of the rewritten hook's delta accounting is the tracked follow-up before mainnet.
Earlier rounds eliminated whole classes of bug by construction: removing the keeper killed the keeper-trust and snapshot-liveness surface; removing the on-chain dividend accumulator killed its overflow-DoS and griefable-maturity findings; the fixed-supply pivot removed every mint path.
Full details in AUDIT.md.
Known limitations & accepted residuals
- Basket leg routing. The inline split buys stocks on hookless
USDG/stockV4 reserve pools. On mainnet, Robinhood tokenized equities trade via RFQ/0x, not necessarily AMM pools — this routing must be confirmed (or adapted) before mainnet. - Basket assets must be vanilla ERC-20s (no fee-on-transfer/rebasing) — enforced socially via the governance allow-list; the official Robinhood tokenized equities qualify (standard ERC-20, no pause/freeze/blocklist per Robinhood's docs). Deposits/swaps are net-measured to absorb the FoT case regardless.
- ERC-8056 Scaled UI Amount. If a basket stock's
uiMultiplier()folds dividends/splits intobalanceOf, confirmbalanceOfalready reflects it before enabling bonding on such a basket (guarded NAV values rawbalanceOf). Redemption is unaffected (pro-rata of raw balances). - Custom router. In-app trading uses the purpose-built
V4SwapRouterbecause Robinhood Chain ships a forked Universal Router; the real UR should be confirmed for mainnet. - Legacy registry fields (
keeper,challengeWindow,swapEngine,distributionEnabled,ethUsdFeed) are vestigial in the inline model and slated for deletion before mainnet.
Mainnet gates
All of the following before any 4663 deployment:
- Tokenized-equity custody spike (verify an arbitrary contract can hold/transfer the real stock tokens).
- Professional audit of the high-severity areas — especially the hook's delta accounting.
- US-person geo-gating + legal review for stock baskets.
- Confirm mainnet stock-buy routing (RFQ/0x vs AMM reserve pools) and the real Universal Router vs the custom router.
Reporting
Found something? Open a private security advisory on GitHub or contact the team — please don't open public issues for vulnerabilities.