Operations
Release loop
- 1
Preflight
Run lint/tests and validate env/deployment artifacts.
- 2
Deploy contracts
Use bun deployment wrappers and refresh schemas when needed.
- 3
Deploy apps/indexer
Ship client/admin and update indexer config for new addresses.
- 4
Post-deploy verify
Confirm routes, query surfaces, and module activation states.
Contract deployment procedure (mainnet -> sepolia -> arbitrum)
Use wrapper scripts from repo root:
# 0) Mainnet ENS receiver (required before Arbitrum)
bun --filter @green-goods/contracts deploy:dry:mainnet
bun --filter @green-goods/contracts deploy:mainnet
# 1) Sepolia deployment
bun --filter @green-goods/contracts deploy:dry:sepolia
bun --filter @green-goods/contracts deploy:sepolia
bun --filter @green-goods/contracts verify:post-deploy:sepolia
# 2) Arbitrum deployment
bun --filter @green-goods/contracts deploy:dry:arbitrum
bun --filter @green-goods/contracts deploy:arbitrum
bun --filter @green-goods/contracts verify:post-deploy:arbitrum
Deployment behavior:
- Mainnet deploy writes
ensReceiverintopackages/contracts/deployments/1-latest.json. - After successful mainnet broadcast,
ENS_L1_RECEIVERis auto-populated in root.env. - Arbitrum ENS path is send-only: transaction send must succeed; L1 settlement is not awaited in flow.
Validation notes:
deploy:dry:*runs full deployment simulation against target RPC (no broadcast), including runtime checks.deploy:preflight:*runs compile-only preflight (no RPC calls).- If post-deploy verify fails with
contract ... does not have any code, the checkeddeployments/<chain>-latest.jsonfile is stale or points to a different deployment than the one on-chain.
Operational checks
bun format && bun lint && bun test- Contract test suites including fork/E2E where relevant.
- Docs updates for behavioral changes in same PR.
bun run docs:auditpasses with no warnings.- Deployment/indexer status table updated in docs.
Next best action
Close the release loop by validating activation truth before publishing release notes.
Check deployment status