Skip to content

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

CheckResult
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 rebuildsSame behaviour; byte-identical rebuilds
Planted bugs: deliberately broken code must make tests failContracts 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 reorganization54 / 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 consoleConnect, sign-in and unsupported-network handling verified
SecretsNone of the project's secrets in any committed file or in the website's browser bundle
DependenciesNo known vulnerabilities in runtime dependencies; two development-tool advisories recorded and tracked

Findings

IDSeverityFindingHandling
M-1MediumWith the owner away, one guardian can re-pause after each guardian-led resumeMitigated: a guardian quorum can remove that guardian through a recovery. The single-guardian emergency pause is kept on purpose
M-2MediumColluding guardians could keep the single recovery slot occupiedMitigated: honest guardians reject the proposal and it is cancelled at once. A group at or above the threshold remains the security bound
M-3MediumThe workflow owner is the root of trustDocumented: owners should use a protected key; a fallback delay lets guardians act if the owner is unavailable
M-4MediumA permissive policy allowed a single guardian to take over in one blockProhibited: recovery without the owner needs two guardians and at least a 1-hour timelock (rules P-8, P-9)
L-1 to L-8LowGas of deep rollbacks, late expiry events, large view pages, bytecode size, rollback depth bound, trust in the RPC nodeMitigated, 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.