- Reviewed migration runner + filename safety rules
- Reviewed relevant service/security/admin files
- Create
src/db/migrations/XXX_create_contract_upgrades.sql- Define
contract_upgradestable and status workflow - Add indexes + constraints for idempotency and monotonicity
- Define
- Implement
ContractUpgradeOrchestratorService- Create request (status=pending, pin target
code_id) - Approve request (two-key approval, distinct identities)
- Apply request
- Run dry-run simulation first
- Block submission on any simulation failure/timeout
- Record tx hash on success and set status=applied
- Record failure details on failure and set status=failed
- Create request (status=pending, pin target
- Implement simulation logic (Horizon simulate) with deterministic parsing
- Ensure apply uses the exact pinned
proposed_code_id - Alarm emission on dry-run failure
- Persist upgrade lifecycle events to existing audit log/audit hashing system
- Add endpoints to
src/routes/admin.ts- POST create
- POST approve
- POST apply
- Unit tests for orchestrator state transitions and security edge cases
- Happy path
- Approver collusion (same identity)
- Code-id mismatch protection
- Dry-run failure blocks submission + records failure + alarm
- Dry-run timeout treated as failure
- Run
npm test
- Run
npm run migrateagainst local DB (with DATABASE_URL set)