diff --git a/config/all-mainnet-pool-creation-matrix.json b/config/all-mainnet-pool-creation-matrix.json index c8cb63df..6d1aac4f 100644 --- a/config/all-mainnet-pool-creation-matrix.json +++ b/config/all-mainnet-pool-creation-matrix.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "generatedAt": "2026-04-29T03:11:03.493Z", + "generatedAt": "2026-04-29T03:26:37.681Z", "description": "Canonical pool-creation matrix for ALL Mainnet public spend readiness. Pools must exist here before funding.", "lifecycle": [ "planned", @@ -57,12 +57,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -72,22 +72,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -108,7 +103,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "ALL Mainnet source-side spend mesh" + "ALL Mainnet source-side spend mesh", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -137,12 +133,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -152,22 +148,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -188,7 +179,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "ALL Mainnet source-side spend mesh" + "ALL Mainnet source-side spend mesh", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -217,12 +209,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -232,22 +224,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -269,7 +256,8 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", - "ALL Mainnet official DODO V2 DVM-backed pool created 2026-04-28" + "ALL Mainnet official DODO V2 DVM-backed pool created 2026-04-28", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -303,12 +291,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -318,22 +306,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -355,7 +338,8 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", - "ALL Mainnet official DODO V2 DVM-backed pool created 2026-04-28" + "ALL Mainnet official DODO V2 DVM-backed pool created 2026-04-28", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -389,17 +373,17 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { "role": "single_sided_inventory", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -409,17 +393,12 @@ }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "single_sided_inventory", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": true, @@ -440,7 +419,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "ALL Mainnet source-side spend mesh" + "ALL Mainnet source-side spend mesh", + "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, { @@ -464,17 +444,17 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { "role": "single_sided_inventory", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -484,17 +464,12 @@ }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "single_sided_inventory", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": true, @@ -516,7 +491,8 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", - "DODO DVM fallback AUSDT/AUSDC pool created at 0xdDaCbe0d72df3A844c1BB725EEAb171B37714154; single-sided inventory/vault wrapper still required before marking this row created." + "DODO DVM fallback AUSDT/AUSDC pool created at 0xdDaCbe0d72df3A844c1BB725EEAb171B37714154; single-sided inventory/vault wrapper still required before marking this row created.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -546,17 +522,17 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { "role": "single_sided_inventory", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -566,17 +542,12 @@ }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "single_sided_inventory", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": true, @@ -597,7 +568,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "ALL Mainnet source-side spend mesh" + "ALL Mainnet source-side spend mesh", + "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, { @@ -621,12 +593,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -636,22 +608,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -673,7 +640,8 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -705,12 +673,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -720,22 +688,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -757,7 +720,8 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -789,12 +753,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -804,22 +768,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -841,7 +800,8 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -1023,12 +983,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -1038,22 +998,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 0, "singleSided": false, @@ -1075,7 +1030,8 @@ }, "notes": [ "Public destination spend settlement pool", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -1107,12 +1063,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -1122,22 +1078,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 0, "singleSided": false, @@ -1159,7 +1110,8 @@ }, "notes": [ "Public destination spend settlement pool", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -1716,12 +1668,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -1731,22 +1683,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -1767,7 +1714,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.558Z", @@ -1795,12 +1743,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -1810,22 +1758,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -1846,7 +1789,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -2399,12 +2343,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -2414,22 +2358,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 500000000000000000, "singleSided": false, @@ -2451,7 +2390,8 @@ }, "notes": [ "Public destination spend settlement pool", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -2483,12 +2423,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -2498,22 +2438,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 500000000000000000, "singleSided": false, @@ -2535,7 +2470,8 @@ }, "notes": [ "Public destination spend settlement pool", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { "generatedAt": "2026-04-29T03:11:03.493Z", @@ -3092,12 +3028,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -3107,22 +3043,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -3143,7 +3074,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -3172,12 +3104,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -3187,22 +3119,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -3223,7 +3150,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -3777,12 +3705,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -3792,22 +3720,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -3828,7 +3751,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -3857,12 +3781,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -3872,22 +3796,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -3908,7 +3827,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -4462,12 +4382,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -4477,22 +4397,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -4513,7 +4428,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -4541,12 +4457,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -4556,22 +4472,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -4592,7 +4503,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -5145,12 +5057,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -5160,22 +5072,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 500000000000000000, "singleSided": false, @@ -5196,7 +5103,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, { @@ -5220,12 +5128,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -5235,22 +5143,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 500000000000000000, "singleSided": false, @@ -5271,7 +5174,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, { @@ -5820,12 +5724,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -5835,22 +5739,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 500000000000000000, "singleSided": false, @@ -5871,7 +5770,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, { @@ -5895,12 +5795,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -5910,22 +5810,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": 3, "k": 500000000000000000, "singleSided": false, @@ -5946,7 +5841,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, { @@ -6495,12 +6391,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -6510,22 +6406,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -6546,7 +6437,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -6574,12 +6466,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -6589,22 +6481,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -6625,7 +6512,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -7178,12 +7066,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -7193,22 +7081,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -7229,7 +7112,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", @@ -7258,12 +7142,12 @@ "vaultAssignments": [ { "role": "treasury_reserve", - "vaultAddress": null, + "vaultAddress": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", "requiredBeforeFunding": true }, { "role": "bridge_liquidity", - "vaultAddress": null, + "vaultAddress": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", "requiredBeforeFunding": true }, { @@ -7273,22 +7157,17 @@ }, { "role": "protocol_adapter", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true }, { "role": "emergency_withdraw", - "vaultAddress": null, + "vaultAddress": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "requiredBeforeFunding": true } ], - "vaultAssignmentStatus": "missing_required_vaults", - "missingRequiredVaultRoles": [ - "treasury_reserve", - "bridge_liquidity", - "protocol_adapter", - "emergency_withdraw" - ], + "vaultAssignmentStatus": "ready", + "missingRequiredVaultRoles": [], "feeBps": null, "k": null, "singleSided": false, @@ -7309,7 +7188,8 @@ "pauseOnReserveReadFailure": true }, "notes": [ - "Public destination spend settlement pool" + "Public destination spend settlement pool", + "Vault assignments applied from explicit All Mainnet vault assignment map." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", diff --git a/config/all-mainnet-vault-assignments.json b/config/all-mainnet-vault-assignments.json new file mode 100644 index 00000000..a6fc3be4 --- /dev/null +++ b/config/all-mainnet-vault-assignments.json @@ -0,0 +1,20 @@ +{ + "description": "Operational vault assignments generated from smom-dbis-138/.env public addresses. No private material is stored here.", + "defaultByRole": { + "treasury_reserve": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", + "bridge_liquidity": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", + "protocol_adapter": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", + "emergency_withdraw": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", + "single_sided_inventory": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8" + }, + "byChain": { + "651940": { + "treasury_reserve": "0x74eccf9affb0e0938c2168ebdf7ef63a26964483", + "bridge_liquidity": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8", + "protocol_adapter": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", + "emergency_withdraw": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", + "single_sided_inventory": "0x31884f84555210FFB36a19D2471b8eBc7372d0A8" + } + }, + "byPoolId": {} +} diff --git a/package.json b/package.json index e026d10a..d8494ddd 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "pool-matrix:validate": "node scripts/validation/validate-pool-creation-matrix.mjs", "all-mainnet:readiness": "node scripts/status/generate-all-mainnet-readiness.mjs", "all-mainnet:pool-balances": "node scripts/status/check-all-mainnet-required-pool-balances.mjs", + "all-mainnet:canary-preflight": "node scripts/status/preflight-all-mainnet-canaries.mjs", "all-mainnet:apply-vaults": "node scripts/status/apply-all-mainnet-vault-assignments.mjs", "all-mainnet:record-canaries": "node scripts/status/record-all-mainnet-canary-evidence.mjs" }, diff --git a/scripts/status/preflight-all-mainnet-canaries.mjs b/scripts/status/preflight-all-mainnet-canaries.mjs new file mode 100644 index 00000000..44d0923a --- /dev/null +++ b/scripts/status/preflight-all-mainnet-canaries.mjs @@ -0,0 +1,230 @@ +#!/usr/bin/env node +/** + * Read-only canary readiness preflight for ALL Mainnet spend pools. + * + * This does not approve tokens or execute swaps. It checks the operator + * wallet inventory, allowances, and quote/query surfaces for rows already + * promoted to live_read. + */ + +import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { ethers } from "ethers"; + +const repoRoot = resolve(new URL("../..", import.meta.url).pathname); +const matrixPath = resolve(repoRoot, "config/all-mainnet-pool-creation-matrix.json"); +const outDir = resolve(repoRoot, "reports/status"); +const reportPath = resolve(outDir, "all-mainnet-canary-preflight-latest.json"); + +const rpcByChain = { + 1: process.env.ETHEREUM_MAINNET_RPC || process.env.RPC_URL_1 || "https://ethereum.publicnode.com", + 10: process.env.OPTIMISM_RPC || process.env.RPC_URL_10 || "https://optimism.publicnode.com", + 25: process.env.CRONOS_RPC || process.env.RPC_URL_25 || "https://cronos-evm-rpc.publicnode.com", + 56: process.env.BSC_RPC || process.env.RPC_URL_56 || "https://bsc-rpc.publicnode.com", + 100: process.env.GNOSIS_RPC || process.env.RPC_URL_100 || "https://gnosis.publicnode.com", + 137: process.env.POLYGON_RPC || process.env.RPC_URL_137 || "https://polygon-bor-rpc.publicnode.com", + 8453: process.env.BASE_RPC || process.env.RPC_URL_8453 || "https://base-rpc.publicnode.com", + 42161: process.env.ARBITRUM_RPC || process.env.RPC_URL_42161 || "https://arbitrum-one-rpc.publicnode.com", + 42220: process.env.CELO_RPC || process.env.RPC_URL_42220 || "https://celo-rpc.publicnode.com", + 43114: process.env.AVALANCHE_RPC || process.env.RPC_URL_43114 || "https://avalanche-c-chain-rpc.publicnode.com", + 651940: process.env.ALL_MAINNET_RPC || process.env.CHAIN_651940_RPC_URL || "https://mainnet-rpc.alltra.global", +}; + +const erc20Abi = [ + "function balanceOf(address) view returns (uint256)", + "function allowance(address,address) view returns (uint256)", + "function decimals() view returns (uint8)", +]; +const uniV2RouterAbi = [ + "function getAmountsOut(uint256,address[]) view returns (uint256[])", +]; +const dodoDvmAbi = [ + "function querySellBase(address,uint256) view returns (uint256)", + "function querySellQuote(address,uint256) view returns (uint256)", +]; + +function operatorAddress() { + if (process.env.DEPLOYER_ADDRESS && ethers.isAddress(process.env.DEPLOYER_ADDRESS)) { + return ethers.getAddress(process.env.DEPLOYER_ADDRESS); + } + if (process.env.SIGNER_ADDRESS && ethers.isAddress(process.env.SIGNER_ADDRESS)) { + return ethers.getAddress(process.env.SIGNER_ADDRESS); + } + if (process.env.PRIVATE_KEY) { + return new ethers.Wallet(process.env.PRIVATE_KEY).address; + } + throw new Error("Set DEPLOYER_ADDRESS, SIGNER_ADDRESS, or PRIVATE_KEY for canary preflight."); +} + +function smallQuoteAmount(decimals) { + const capped = Math.min(Number(decimals), 6); + return 10n ** BigInt(capped); +} + +function normalizedAddress(address) { + return ethers.getAddress(String(address).toLowerCase()); +} + +async function callOrError(fn) { + try { + return { ok: true, value: await fn() }; + } catch (error) { + return { ok: false, error: error.shortMessage || error.message }; + } +} + +async function tokenSnapshot(provider, tokenAddress, owner, spender) { + const token = new ethers.Contract(normalizedAddress(tokenAddress), erc20Abi, provider); + const allowanceSpender = spender ? normalizedAddress(spender) : null; + const [balance, decimals, allowance] = await Promise.all([ + callOrError(() => token.balanceOf(owner)), + callOrError(() => token.decimals()), + allowanceSpender ? callOrError(() => token.allowance(owner, allowanceSpender)) : Promise.resolve({ ok: false, error: "spender_not_configured" }), + ]); + + return { + address: tokenAddress, + balanceRaw: balance.ok ? balance.value.toString() : null, + decimals: decimals.ok ? Number(decimals.value) : null, + allowanceRaw: allowance.ok ? allowance.value.toString() : null, + errors: [ + ...(balance.ok ? [] : [`balance:${balance.error}`]), + ...(decimals.ok ? [] : [`decimals:${decimals.error}`]), + ...(spender && !allowance.ok ? [`allowance:${allowance.error}`] : []), + ], + }; +} + +async function quoteUniswap(provider, row, base, quote) { + if (!row.routerAddress) return { supported: false, errors: ["missing_router_address"] }; + const router = new ethers.Contract(normalizedAddress(row.routerAddress), uniV2RouterAbi, provider); + const baseAmount = smallQuoteAmount(base.decimals ?? 18); + const quoteAmount = smallQuoteAmount(quote.decimals ?? 18); + const baseToken = normalizedAddress(row.baseToken.address); + const quoteToken = normalizedAddress(row.quoteToken.address); + const [baseToQuote, quoteToBase] = await Promise.all([ + callOrError(() => router.getAmountsOut(baseAmount, [baseToken, quoteToken])), + callOrError(() => router.getAmountsOut(quoteAmount, [quoteToken, baseToken])), + ]); + + return { + supported: true, + routerAddress: row.routerAddress, + baseToQuote: baseToQuote.ok ? baseToQuote.value.map((v) => v.toString()) : null, + quoteToBase: quoteToBase.ok ? quoteToBase.value.map((v) => v.toString()) : null, + errors: [ + ...(baseToQuote.ok ? [] : [`base_to_quote:${baseToQuote.error}`]), + ...(quoteToBase.ok ? [] : [`quote_to_base:${quoteToBase.error}`]), + ], + }; +} + +async function quoteDodo(provider, row, base, quote, operator) { + const pool = new ethers.Contract(normalizedAddress(row.poolAddress), dodoDvmAbi, provider); + const baseAmount = smallQuoteAmount(base.decimals ?? 18); + const quoteAmount = smallQuoteAmount(quote.decimals ?? 18); + const [sellBase, sellQuote] = await Promise.all([ + callOrError(() => pool.querySellBase(operator, baseAmount)), + callOrError(() => pool.querySellQuote(operator, quoteAmount)), + ]); + + return { + supported: sellBase.ok || sellQuote.ok, + poolAddress: row.poolAddress, + sellBaseOutRaw: sellBase.ok ? sellBase.value.toString() : null, + sellQuoteOutRaw: sellQuote.ok ? sellQuote.value.toString() : null, + errors: [ + ...(sellBase.ok ? [] : [`query_sell_base:${sellBase.error}`]), + ...(sellQuote.ok ? [] : [`query_sell_quote:${sellQuote.error}`]), + ], + }; +} + +const matrix = JSON.parse(readFileSync(matrixPath, "utf8")); +const generatedAt = new Date().toISOString(); +const operator = operatorAddress(); +const rows = matrix.rows.filter((row) => row.requiredForSpend === true && row.status === "live_read"); +const results = []; + +for (const row of rows) { + const rpcUrl = rpcByChain[row.chainId]; + const result = { + poolId: row.poolId, + chainId: row.chainId, + network: row.network, + protocol: row.protocol, + poolAddress: row.poolAddress, + routerAddress: row.routerAddress, + operator, + baseToken: row.baseToken, + quoteToken: row.quoteToken, + base: null, + quote: null, + quoteCheck: null, + canaryPreflight: "blocked", + blockers: [], + }; + + if (!rpcUrl) { + result.blockers.push("missing_rpc"); + results.push(result); + continue; + } + if (!row.poolAddress || !row.baseToken?.address || !row.quoteToken?.address) { + if (!row.poolAddress) result.blockers.push("missing_pool_address"); + if (!row.baseToken?.address) result.blockers.push("missing_base_token_address"); + if (!row.quoteToken?.address) result.blockers.push("missing_quote_token_address"); + results.push(result); + continue; + } + + const provider = new ethers.JsonRpcProvider(rpcUrl, row.chainId, { staticNetwork: true }); + const spender = row.routerAddress || row.poolAddress; + const [base, quote] = await Promise.all([ + tokenSnapshot(provider, row.baseToken.address, operator, spender), + tokenSnapshot(provider, row.quoteToken.address, operator, spender), + ]); + result.base = base; + result.quote = quote; + + if (base.errors.length > 0) result.blockers.push(...base.errors.map((error) => `base_${error}`)); + if (quote.errors.length > 0) result.blockers.push(...quote.errors.map((error) => `quote_${error}`)); + if (BigInt(base.balanceRaw || "0") === 0n) result.blockers.push(`missing_operator_inventory:${row.baseToken.symbol}`); + if (BigInt(quote.balanceRaw || "0") === 0n) result.blockers.push(`missing_operator_inventory:${row.quoteToken.symbol}`); + + if (row.protocol === "uniswap_v2") { + result.quoteCheck = await quoteUniswap(provider, row, base, quote); + } else if (row.protocol === "dodo_pmm") { + result.quoteCheck = await quoteDodo(provider, row, base, quote, operator); + } else { + result.quoteCheck = { supported: false, errors: [`unsupported_protocol:${row.protocol}`] }; + } + + if (result.quoteCheck?.errors?.length > 0) { + result.blockers.push(...result.quoteCheck.errors.map((error) => `quote_${error}`)); + } + if (!result.quoteCheck?.supported) { + result.blockers.push("quote_surface_unverified"); + } + + result.canaryPreflight = result.blockers.length === 0 ? "ready" : "blocked"; + results.push(result); +} + +const statusCounts = results.reduce((counts, result) => { + counts[result.canaryPreflight] = (counts[result.canaryPreflight] || 0) + 1; + return counts; +}, {}); + +const report = { + generatedAt, + sourceMatrix: "config/all-mainnet-pool-creation-matrix.json", + operator, + liveReadRequiredRows: rows.length, + statusCounts, + results, +}; + +mkdirSync(outDir, { recursive: true }); +writeFileSync(reportPath, `${JSON.stringify(report, null, 2)}\n`); +console.log(`[OK] ALL Mainnet canary preflight written: ${statusCounts.ready || 0} ready, ${statusCounts.blocked || 0} blocked.`);