Documentation
Internal security review
Internal reviewUpdated 2026-10-23
What the development team checked, what it found, how each finding is handled, and what remains for an independent audit.
Summary
The development team reviewed the Upoch contracts, SDK, backend and website, tested them with the checks below, and verified the testnet and mainnet deployments. No critical or high-severity issue was found. Four medium findings were identified; each is fixed, prohibited by a protocol rule, or documented as an accepted trade-off. This is an internal review by the people who wrote the code, not an independent audit; an independent audit is planned.
Scope
- Contracts:
Epoch,EpochRegistry,EpochLedger,EpochRecovery,EpochStorage,CheckpointHash,IEpoch, against protocol specification v0.5. - TypeScript SDK: checkpoint hashing, signing and relayed submission, action gate, recovery coordinator. Python verifier parity.
- Backend: API-key and wallet (EIP-4361) sign-in, roles, tenant isolation, outbox, indexer reorg handling, notification webhooks.
- Website and console: session cookies, content security policy, secrets in the browser bundle, wallet flows.
Checks and results
| Check | Result |
|---|---|
| Contract unit, fuzz and invariant tests (Hardhat and Foundry) | 403 / 403 pass in both, re-run 2026-10-23 |
| Compiler pipelines compared (IR and legacy), clean rebuilds | Same behaviour; byte-identical rebuilds |
| Planted bugs: deliberately broken code must make tests fail | Contracts 24/24, TypeScript SDK 21/21, Python 16/16, backend 13/13, wallet sign-in 10/10, notifications 6/6 caught |
| Backend tests on PostgreSQL, including a real chain reorganization | 54 / 54 pass: authentication, tenant isolation, replay and expiry, roles, revocation |
| Browser tests (Chromium) | 41 / 41 pass, including wallet sign-in with MetaMask- and Phantom-like wallets and accessibility checks |
| Real Phantom extension against the console | Connect, sign-in and unsupported-network handling verified |
| Secrets | None of the project's secrets in any committed file or in the website's browser bundle |
| Dependencies | No known vulnerabilities in runtime dependencies; two development-tool advisories recorded and tracked |
Findings
| ID | Severity | Finding | Handling |
|---|---|---|---|
| M-1 | Medium | With the owner away, one guardian can re-pause after each guardian-led resume | Mitigated: a guardian quorum can remove that guardian through a recovery. The single-guardian emergency pause is kept on purpose |
| M-2 | Medium | Colluding guardians could keep the single recovery slot occupied | Mitigated: honest guardians reject the proposal and it is cancelled at once. A group at or above the threshold remains the security bound |
| M-3 | Medium | The workflow owner is the root of trust | Documented: owners should use a protected key; a fallback delay lets guardians act if the owner is unavailable |
| M-4 | Medium | A permissive policy allowed a single guardian to take over in one block | Prohibited: recovery without the owner needs two guardians and at least a 1-hour timelock (rules P-8, P-9) |
| L-1 to L-8 | Low | Gas of deep rollbacks, late expiry events, large view pages, bytecode size, rollback depth bound, trust in the RPC node | Mitigated, bounded or documented; none blocks deployment |
Mainnet deployment
- Robinhood Chain mainnet (4663), contract
0x6179d9123c3c1f9e82f948101a4350cb55aa8c27, deployed in block 96839623 by a separate, confirmation-gated deployment script (decision D-054). - The same contract as on testnet: the code on the chain matches two independent builds of the source, and the constants were read back and checked.
- Source code verified with an exact match on Sourcify. Explorer: Robinhood Chain explorer.
- A smoke test registered one test workflow and submitted two linked checkpoints; the head matched the hash computed off-chain.
- This review is internal. An independent audit is planned and has not started.
Testnet deployment
- Robinhood Chain testnet (46630), contract
0x8b929fc22731ac3285fe98b190423bddd1487361, deployed in block 141313629. - The code on the chain was compared with two independent builds of the source and matches both; the contract's constants were read back and checked.
- Source code published and verified with an exact match on Sourcify. Explorer: Robinhood Chain testnet explorer.
- A smoke test registered a workflow and submitted two linked checkpoints; their hashes were recomputed off-chain and matched.
Limits and next step
- The review was done by the team that wrote the code, which limits its independence.
- Not covered: formal verification, economic analysis beyond the guardian scenarios above, and live storage and encryption providers.
- Next step: an independent audit of the contracts and the signing and recovery paths. When its report is published, it is linked from the Security page.