Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 10 additions & 25 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ on:
branches: [main, dev]
pull_request:
branches: [main, dev]
# The registry job reads live chain state. Between pull requests nothing
# would notice a governance transaction, a whitelist change or a provider
# disagreement, so it also runs on a clock. A scheduled failure is a page,
# not a nuisance: it means chain state moved without a matching review.
# Keep the payment-artifact gate scheduled as a defence against workflow or
# branch-policy drift even when no pull request is open.
schedule:
- cron: '17 */6 * * *'
- cron: "17 */6 * * *"
workflow_dispatch:

# CodeQL actions/missing-workflow-permissions: an unrestricted GITHUB_TOKEN is
Expand Down Expand Up @@ -50,7 +48,7 @@ jobs:
run: bun run prettify:check

registry:
name: Canonical registry · drift + chain state
name: v1.4 deployment artifacts · fail-closed validation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.3.1
Expand All @@ -67,22 +65,9 @@ jobs:
- name: Install dependencies
run: bun install --frozen-lockfile

# The generated table is a derived artifact. Hand-editing it would change
# where the SDK sends money without touching the registry, so the gate is
# a regenerate-and-compare rather than a review convention.
- name: Generated splitter table matches the registry
run: node scripts/generate-sdk-table.mjs --check

# Chain state is the source of truth. This fails when a required chain is
# unreachable, on purpose: "could not check" must not pass as "verified".
# Every value is read from two independent providers and must agree.
- name: Registry matches live chain state
run: node scripts/verify-registry.mjs

# The timelock documents claimed a 48-hour delay that was never deployed,
# and nothing could notice. A status banner fixes today; a machine-readable
# marker held to the chain keeps it fixed. Fails in both directions, so it
# also catches docs still describing direct ownership after a timelock
# goes live.
- name: Governance documents match on-chain ownership
run: node scripts/verify-governance-docs.mjs
# The legacy v1.1-v1.3 registry was intentionally removed and cannot
# model v1.4's splitter + TokenList + Profiles topology. Validate the
# checked-in v1.4 records instead; live RPC verification remains a
# release-gate operation and must never silently pass on provider errors.
- name: Validate v1.4 deployment records and quarantine state
run: bun run check:deployments:offline
14 changes: 5 additions & 9 deletions config/v14-production-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ export interface V14ProductionNetwork {

const CIRCLE_USDC_SOURCE = "Circle USDC contract-address registry, verified 2026-08-27";
const TETHER_USDT_SOURCE = "Tether supported-protocols registry, verified 2026-08-27";
const POLYGON_BRIDGED_USDC_SOURCE =
"Polygon PoS bridged USDC.e contract, corrected during AIFINP-223 review 2026-09-13";

const CREATE3_SALTS = {
TokenList: "0x8be94b4c2852b83d5f69de83ba79859073143caceb89a1cdda67fb51455c4606",
Expand Down Expand Up @@ -73,9 +75,9 @@ export const V14_PRODUCTION_NETWORKS: Record<number, V14ProductionNetwork> = {
},
{
address: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
symbol: "USDT",
name: "USDT",
source: TETHER_USDT_SOURCE,
symbol: "USDC.e",
name: "Bridged USDC",
source: POLYGON_BRIDGED_USDC_SOURCE,
},
],
salts: CREATE3_SALTS,
Expand Down Expand Up @@ -160,12 +162,6 @@ export const V14_PRODUCTION_NETWORKS: Record<number, V14ProductionNetwork> = {
],
salts: CREATE3_SALTS,
},
677: {
name: "BOT Chain",
chainId: 677,
stablecoins: [],
salts: CREATE3_SALTS,
},
1440000: {
name: "XRPL EVM",
chainId: 1440000,
Expand Down
4 changes: 3 additions & 1 deletion deployments/amoy-v14-amoy-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@
"usdc": "0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0xd4990487312c00916aa218bdcd697bbf1a2729335b6a4fda903517b9d3153a27"
"runtimeCodeHash": "0xd4990487312c00916aa218bdcd697bbf1a2729335b6a4fda903517b9d3153a27",
"status": "enabled",
"settlementEnabled": true
}
5 changes: 4 additions & 1 deletion deployments/arbitrum-v14-arbitrum-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"usdc": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0xc15837e6f438d0fd2f23e0c5eb7a2f655b2af7dc717bd2861365819de45757f7"
"runtimeCodeHash": "0xc15837e6f438d0fd2f23e0c5eb7a2f655b2af7dc717bd2861365819de45757f7",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "Backend v1.4 receipt verification and end-to-end settlement gate are incomplete"
}
5 changes: 4 additions & 1 deletion deployments/avalanche-v14-avalanche-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"usdc": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
"usdt": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7"
},
"runtimeCodeHash": "0x65db1830b1d15400cba35b4ef54dd6c5852d5baa077a732bdc84f7c2218952ef"
"runtimeCodeHash": "0x65db1830b1d15400cba35b4ef54dd6c5852d5baa077a732bdc84f7c2218952ef",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "Backend v1.4 receipt verification and end-to-end settlement gate are incomplete"
}
12 changes: 11 additions & 1 deletion deployments/base-v14-base-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,18 @@
"treasury": "0x5afe07483886dfa0b77c6d60212b6e52d78ac11e",
"tokenList": "0xbA98C0797707611787B04680E260036573D9D7a1",
"profiles": "0x4dcDd923d9c45bd306aA21c4438B3D325f8F783C",
"stablecoins": [
{
"symbol": "USDC",
"name": "USDC",
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
}
],
"usdc": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0xc724e02657817177d1394e8d41189dd7f8299bb5cf2da04946572378c935883c"
"runtimeCodeHash": "0xc724e02657817177d1394e8d41189dd7f8299bb5cf2da04946572378c935883c",
"status": "invalid",
"settlementEnabled": false,
"disabledReason": "INVALID DEPLOYMENT: splitter address equals TokenList address and Profiles has no code; redeploy required"
}
5 changes: 4 additions & 1 deletion deployments/bnb-v14-bnb-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"usdc": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
"usdt": "0x55d398326f99059fF775485246999027B3197955"
},
"runtimeCodeHash": "0x8aa8c5999a1a0ee87198e380188faaa9d6df88819b47d68682096cc33db81638"
"runtimeCodeHash": "0x8aa8c5999a1a0ee87198e380188faaa9d6df88819b47d68682096cc33db81638",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "Backend v1.4 receipt verification and end-to-end settlement gate are incomplete"
}
5 changes: 4 additions & 1 deletion deployments/optimism-v14-optimism-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"usdc": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0x5a2d0ffb996d5655fa483e41d3e5870c6a032fd00bea71c3107f95a4b405e152"
"runtimeCodeHash": "0x5a2d0ffb996d5655fa483e41d3e5870c6a032fd00bea71c3107f95a4b405e152",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "Backend v1.4 receipt verification and end-to-end settlement gate are incomplete"
}
19 changes: 17 additions & 2 deletions deployments/polygon-v14-polygon-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,23 @@
"treasury": "0x01b80329ff81ce1d22a9e2e8807df5f92414c3c3",
"tokenList": "0xbA98C0797707611787B04680E260036573D9D7a1",
"profiles": "0x4dcDd923d9c45bd306aA21c4438B3D325f8F783C",
"stablecoins": [
{
"symbol": "USDC",
"name": "USDC",
"address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"
},
{
"symbol": "USDC.e",
"name": "Bridged USDC",
"address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
}
],
"usdc": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"usdt": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0x974b871ac79082d92a7e3bba89ba52794f7906f99119dfad7959017e5b0bf038"
"runtimeCodeHash": "0x974b871ac79082d92a7e3bba89ba52794f7906f99119dfad7959017e5b0bf038",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "Backend v1.4 verification and end-to-end settlement gate are not complete"
}
6 changes: 5 additions & 1 deletion deployments/robinhood-v14-robinhood-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@
"treasury": "0x5AFe07483886DFa0B77C6d60212B6E52D78ac11e",
"tokenList": "0xbA98C0797707611787B04680E260036573D9D7a1",
"profiles": "0x4dcDd923d9c45bd306aA21c4438B3D325f8F783C",
"stablecoins": [],
"usdc": "0x0000000000000000000000000000000000000000",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0x96812eb70224f48c095b240bc0e1d739a7fcb878c3237b5f795629c239d7ef72"
"runtimeCodeHash": "0x96812eb70224f48c095b240bc0e1d739a7fcb878c3237b5f795629c239d7ef72",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "TokenList was deployed empty; USDe/USDG require a 3-of-4 Safe allowlist transaction and backend verification"
}
5 changes: 4 additions & 1 deletion deployments/unichain-v14-unichain-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"usdc": "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0xcb4f1c15a87720c326daa574a7ab52c116c208805167b46dd055f47c9c8695ca"
"runtimeCodeHash": "0xcb4f1c15a87720c326daa574a7ab52c116c208805167b46dd055f47c9c8695ca",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "Backend v1.4 receipt verification and end-to-end settlement gate are incomplete"
}
5 changes: 4 additions & 1 deletion deployments/xrplevm-v14-xrplevm-latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@
"usdc": "0x0000000000000000000000000000000000000000",
"usdt": "0x0000000000000000000000000000000000000000"
},
"runtimeCodeHash": "0xd26862dbc501481675f50924ca013acd5c20aca339f2a1aca818becedf7b5aa0"
"runtimeCodeHash": "0xd26862dbc501481675f50924ca013acd5c20aca339f2a1aca818becedf7b5aa0",
"status": "disabled",
"settlementEnabled": false,
"disabledReason": "No stablecoin is configured and backend verification is incomplete"
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"check:wallet": "hardhat run scripts/check-wallet.ts",
"check:multisig": "bun scripts/check-multisig.ts",
"check:deployment": "hardhat run scripts/check-deployment-v14.ts",
"check:deployments:offline": "node scripts/validate-v14-deployments.mjs",
"init:multisig": "bun scripts/init-safe-multisig.ts",
"verify": "hardhat run scripts/verify.ts --build-profile production",
"lint": "solhint 'contracts/**/*.sol'",
Expand Down
Loading
Loading