diff --git a/config/all-mainnet-canary-evidence.json b/config/all-mainnet-canary-evidence.json index 880a7925..ca41471f 100644 --- a/config/all-mainnet-canary-evidence.json +++ b/config/all-mainnet-canary-evidence.json @@ -90,6 +90,80 @@ "notes": [ "Tiny live canary swap executed on Polygon DODO PMM cWUSDT/USDT." ] + }, + { + "poolId": "651940-uniswap_v2-usdt-ausdc", + "generatedAt": "2026-04-30T07:30:00Z", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0xa5479400c203922b0e29a4c438daeeeef6f99b847d617f029e7978c1beba6b2b", + "approvalTxHash": "0xe4e73ff7d9c4a998e4cca1fcbf847d351171c0c026b11e798a0c1dc2bb6b4f12", + "fundingSwapTxHash": "0x39bddcca6160e2df5c7595350f9d911c73e0e7bfe59595fae2c3248576962d5b", + "fundingApprovalTxHash": "0x238bae3818d16a95711c19657dbd08bc076ef3fde7fedb7291ed514d2e090684", + "amountInRaw": "1000000", + "tokenIn": "USDT", + "tokenOut": "AUSDC", + "executor": "UniswapV2Router.swapExactTokensForTokens" + } + ], + "notes": [ + "Tiny live canary swap executed on ALL Mainnet Uniswap V2 USDT/AUSDC after acquiring USDT inventory via AUSDC/USDT." + ] + }, + { + "poolId": "651940-uniswap_v2-wall-usdt", + "generatedAt": "2026-04-30T07:30:00Z", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0x7b6a3d5dedc775e9b0f73de4e0a89bdd004f82c451d7cccf1e2178e5893d487c", + "approvalTxHash": "0xdd7985b4535915523831f989e054e6333af6b84e589c67791e73cce7acbff6a6", + "amountInRaw": "1000000", + "tokenIn": "WALL", + "tokenOut": "USDT", + "executor": "UniswapV2Router.swapExactTokensForTokens" + } + ], + "notes": [ + "Tiny live canary swap executed on ALL Mainnet Uniswap V2 WALL/USDT." + ] + }, + { + "poolId": "42220-dodo_pmm-cwusdc-usdc", + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0x32d3869f987d558e392fd01aab77968d9cad1d90da71be1db90061f58d5c14b1", + "fundingTransferTxHash": "0x8ecd2a68f5dc3f2ab471ccc7ea8fdce16064029b6792bce7a387d943326fa1d6", + "amountInRaw": "100", + "tokenIn": "cWUSDC", + "tokenOut": "USDC", + "executor": "DODO_DVM.transfer_then_sellBase" + } + ], + "notes": [ + "Tiny live canary swap executed on Celo DODO PMM cWUSDC/USDC after deployer-funded seed liquidity." + ] + }, + { + "poolId": "42220-dodo_pmm-cwusdt-usdt", + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0x0498a0484f6707e0f8019b8803a8aed932f33f587a57186cc37bcdc594393094", + "fundingTransferTxHash": "0xd4182a6e116df30544097851892f379d67af2b33fc2374bb0204a6450dcecea4", + "amountInRaw": "100", + "tokenIn": "cWUSDT", + "tokenOut": "USDT", + "executor": "DODO_DVM.transfer_then_sellBase" + } + ], + "notes": [ + "Tiny live canary swap executed on Celo DODO PMM cWUSDT/USDT after deployer-funded seed liquidity." + ] } ] } diff --git a/config/all-mainnet-pool-creation-matrix.json b/config/all-mainnet-pool-creation-matrix.json index decbdf8d..3dc4cb53 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-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "description": "Canonical pool-creation matrix for ALL Mainnet public spend readiness. Pools must exist here before funding.", "lifecycle": [ "planned", @@ -23,9 +23,9 @@ ], "statusCounts": { "planned": 83, - "canary_passed": 6, - "created": 17, - "live_read": 7 + "production": 10, + "created": 5, + "live_read": 15 }, "protocolCounts": { "dodo_pmm": 49, @@ -89,10 +89,10 @@ "feeBps": null, "k": null, "singleSided": false, - "publicRoutingEnabled": true, + "publicRoutingEnabled": false, "reserveSource": "dodo_pmm_integration", "status": "planned", - "requiredForSpend": true, + "requiredForSpend": false, "canaryEvidence": null, "fundingTiersUsd": { "seed": 10, @@ -107,6 +107,7 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", + "Deferred from the production spend gate: cUSDC-equivalent is a placeholder, and AUSDC is already the canonical ALL Mainnet bridge-equivalent for cUSDC.", "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { @@ -165,10 +166,10 @@ "feeBps": null, "k": null, "singleSided": false, - "publicRoutingEnabled": true, + "publicRoutingEnabled": false, "reserveSource": "dodo_pmm_integration", "status": "planned", - "requiredForSpend": true, + "requiredForSpend": false, "canaryEvidence": null, "fundingTiersUsd": { "seed": 10, @@ -183,6 +184,7 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", + "Deferred from the production spend gate: cUSDT-equivalent is a placeholder, and AUSDT is already the canonical ALL Mainnet bridge-equivalent for cUSDT.", "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { @@ -243,11 +245,11 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "canary_passed", + "status": "production", "requiredForSpend": true, "canaryEvidence": { + "poolId": "651940-dodo_pmm-wall-ausdc", "generatedAt": "2026-04-29T04:41:13.993Z", - "sourceFile": "config/all-mainnet-canary-evidence.json", "canaryTransactions": [ { "direction": "base_to_quote", @@ -261,7 +263,8 @@ ], "notes": [ "Tiny live canary swap executed on ALL Mainnet DODO PMM WALL/AUSDC." - ] + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" }, "fundingTiersUsd": { "seed": 10, @@ -279,7 +282,8 @@ "ALL Mainnet official DODO V2 DVM-backed pool created 2026-04-28", "Vault assignments applied from explicit All Mainnet vault assignment map.", "Live reserve read recorded from required-pool balance checker.", - "Canary evidence recorded from explicit All Mainnet canary evidence file." + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -292,12 +296,23 @@ "verification": "DODOPMMIntegration pools(base,quote) resolves to pool address; DVM clone has bytecode; initial reserves are zero until funding." }, "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#651940-dodo_pmm-wall-ausdc", "baseBalanceRaw": "1000000000001000000", "quoteBalanceRaw": "999999999998000001", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -445,11 +460,11 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "canary_passed", + "status": "production", "requiredForSpend": true, "canaryEvidence": { + "poolId": "651940-dodo_pmm-wall-ausdt", "generatedAt": "2026-04-30T06:58:00Z", - "sourceFile": "config/all-mainnet-canary-evidence.json", "canaryTransactions": [ { "direction": "base_to_quote", @@ -463,7 +478,8 @@ ], "notes": [ "Tiny live canary swap executed on ALL Mainnet DODO PMM WALL/AUSDT." - ] + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" }, "fundingTiersUsd": { "seed": 10, @@ -483,7 +499,8 @@ "Seeded with 1 WALL and 1 AUSDT from deployer wallet.", "EnhancedSwapRouterV2 DODO route registered and quoteable.", "Live reserve read recorded from required-pool balance checker.", - "Canary evidence recorded from explicit All Mainnet canary evidence file." + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "infrastructure": { "dvmFactory": "0x8a3403aef8d40c0F4AfaF6Dc2000A537EbC863c2", @@ -496,7 +513,7 @@ "verification": "DODOPMMIntegration pools(WALL,AUSDT) resolves to pool address; DVM clone has bytecode." }, "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#651940-dodo_pmm-wall-ausdt", "baseBalanceRaw": "1000000000001000000", "quoteBalanceRaw": "999999999998000001", @@ -518,6 +535,17 @@ "slippageBps": 30, "routerQuoteExecutable": true } + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -570,10 +598,10 @@ "feeBps": null, "k": null, "singleSided": true, - "publicRoutingEnabled": true, + "publicRoutingEnabled": false, "reserveSource": null, "status": "planned", - "requiredForSpend": true, + "requiredForSpend": false, "canaryEvidence": null, "fundingTiersUsd": { "seed": 10, @@ -588,6 +616,7 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", + "Deferred from the production spend gate until a real single-sided inventory/vault wrapper contract is deployed.", "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, @@ -641,10 +670,10 @@ "feeBps": null, "k": null, "singleSided": true, - "publicRoutingEnabled": true, + "publicRoutingEnabled": false, "reserveSource": null, "status": "planned", - "requiredForSpend": true, + "requiredForSpend": false, "canaryEvidence": null, "fundingTiersUsd": { "seed": 10, @@ -660,6 +689,7 @@ "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.", + "Deferred from the production spend gate until the single-sided wrapper is deployed; the fallback DODO pool remains tracked as infrastructure.", "Vault assignments applied from explicit All Mainnet vault assignment map." ], "infrastructure": { @@ -719,10 +749,10 @@ "feeBps": null, "k": null, "singleSided": true, - "publicRoutingEnabled": true, + "publicRoutingEnabled": false, "reserveSource": null, "status": "planned", - "requiredForSpend": true, + "requiredForSpend": false, "canaryEvidence": null, "fundingTiersUsd": { "seed": 10, @@ -737,6 +767,7 @@ }, "notes": [ "ALL Mainnet source-side spend mesh", + "Deferred from the production spend gate: bridge is a placeholder route target, not an ERC-20 quote token address.", "Vault assignments applied from explicit All Mainnet vault assignment map." ] }, @@ -792,11 +823,11 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "canary_passed", + "status": "production", "requiredForSpend": true, "canaryEvidence": { + "poolId": "651940-uniswap_v2-wall-ausdc", "generatedAt": "2026-04-29T04:41:13.993Z", - "sourceFile": "config/all-mainnet-canary-evidence.json", "canaryTransactions": [ { "direction": "base_to_quote", @@ -810,7 +841,8 @@ ], "notes": [ "Tiny live canary swap executed on ALL Mainnet Uniswap V2 WALL/AUSDC." - ] + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" }, "fundingTiersUsd": { "seed": 10, @@ -827,15 +859,27 @@ "ALL Mainnet source-side spend mesh", "Live reserve read recorded from required-pool balance checker.", "Vault assignments applied from explicit All Mainnet vault assignment map.", - "Canary evidence recorded from explicit All Mainnet canary evidence file." + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#651940-uniswap_v2-wall-ausdc", "baseBalanceRaw": "224445209871270534969174163", "quoteBalanceRaw": "129194376317333448505973", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -890,9 +934,27 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "live_read", + "status": "production", "requiredForSpend": true, - "canaryEvidence": null, + "canaryEvidence": { + "poolId": "651940-uniswap_v2-wall-usdt", + "generatedAt": "2026-04-30T07:30:00Z", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0x7b6a3d5dedc775e9b0f73de4e0a89bdd004f82c451d7cccf1e2178e5893d487c", + "approvalTxHash": "0xdd7985b4535915523831f989e054e6333af6b84e589c67791e73cce7acbff6a6", + "amountInRaw": "1000000", + "tokenIn": "WALL", + "tokenOut": "USDT", + "executor": "UniswapV2Router.swapExactTokensForTokens" + } + ], + "notes": [ + "Tiny live canary swap executed on ALL Mainnet Uniswap V2 WALL/USDT." + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" + }, "fundingTiersUsd": { "seed": 10, "smoke": 100, @@ -907,15 +969,28 @@ "notes": [ "ALL Mainnet source-side spend mesh", "Live reserve read recorded from required-pool balance checker.", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#651940-uniswap_v2-wall-usdt", - "baseBalanceRaw": "116762468938410673082689864", - "quoteBalanceRaw": "98510599724849461923660", + "baseBalanceRaw": "116762468938410673083689864", + "quoteBalanceRaw": "98510599724849461922819", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -970,9 +1045,29 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "live_read", + "status": "production", "requiredForSpend": true, - "canaryEvidence": null, + "canaryEvidence": { + "poolId": "651940-uniswap_v2-usdt-ausdc", + "generatedAt": "2026-04-30T07:30:00Z", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0xa5479400c203922b0e29a4c438daeeeef6f99b847d617f029e7978c1beba6b2b", + "approvalTxHash": "0xe4e73ff7d9c4a998e4cca1fcbf847d351171c0c026b11e798a0c1dc2bb6b4f12", + "fundingSwapTxHash": "0x39bddcca6160e2df5c7595350f9d911c73e0e7bfe59595fae2c3248576962d5b", + "fundingApprovalTxHash": "0x238bae3818d16a95711c19657dbd08bc076ef3fde7fedb7291ed514d2e090684", + "amountInRaw": "1000000", + "tokenIn": "USDT", + "tokenOut": "AUSDC", + "executor": "UniswapV2Router.swapExactTokensForTokens" + } + ], + "notes": [ + "Tiny live canary swap executed on ALL Mainnet Uniswap V2 USDT/AUSDC after acquiring USDT inventory via AUSDC/USDT." + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" + }, "fundingTiersUsd": { "seed": 10, "smoke": 100, @@ -987,15 +1082,28 @@ "notes": [ "ALL Mainnet source-side spend mesh", "Live reserve read recorded from required-pool balance checker.", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#651940-uniswap_v2-usdt-ausdc", - "baseBalanceRaw": "126950810303091320030551", - "quoteBalanceRaw": "78791103453769787415423", + "baseBalanceRaw": "126950810303091319423347", + "quoteBalanceRaw": "78791103453769787796332", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -1220,10 +1328,10 @@ "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#1-dodo_pmm-cwusdc-usdc", - "baseBalanceRaw": "818811480", - "quoteBalanceRaw": "233144600", + "baseBalanceRaw": "8430994833", + "quoteBalanceRaw": "22650702", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" } @@ -1300,10 +1408,10 @@ "Vault assignments applied from explicit All Mainnet vault assignment map." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#1-dodo_pmm-cwusdt-usdt", - "baseBalanceRaw": "9845664", - "quoteBalanceRaw": "2160199", + "baseBalanceRaw": "227576006", + "quoteBalanceRaw": "93484", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" } @@ -1884,8 +1992,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -1901,11 +2009,44 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding transfers completed, but DVM reserve accounting still reads zero; production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.558Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode" + }, + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 56, + "token": "cWUSDC", + "amountRaw": "1000000000", + "txHash": "0x295a450f4513a7683768244c860cd6cb36578b0d0458edb9383a4e5aeca0cfb3" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 56, + "swapHash": "0x1f747256f8250b60b94d24c07770c0ccb0648cd8537b3daff789abf3e3c35d98", + "baseTransferHash": "0x3eff595421b3918cd19384a1b6219a1de7bdc0d01b0da15dc7bc2baf83c7f07c", + "quoteTransferHash": "0x517bdada4e6bab7f16d145b573c6c7d3b11399d8aa8370607eb961eead11094e", + "buySharesHash": "0x06a57ad7425a1c57698d493aeb361daa492574126c9d83df620a7733ad56cdc6", + "canaryTransferHash": "0x7a90a51c8403d1656c2c7d865aa9715b1fcef8d640f5fd9b6abfb2a5bbdc9b07", + "seedRaw": "1000000", + "baseSymbol": "cWUSDC", + "quoteSymbol": "USDC", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#56-dodo_pmm-cwusdc-usdc", + "baseBalanceRaw": "1001000", + "quoteBalanceRaw": "1000000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -1959,8 +2100,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -1976,11 +2117,44 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding transfers completed, but DVM reserve accounting still reads zero; production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode" + }, + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 56, + "token": "cWUSDT", + "amountRaw": "1000000000", + "txHash": "0xa63e84c85637731ffbd58d3187e1c382a4707c9c3b00a6c8d80791279e068260" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 56, + "swapHash": "0xd30fd42762fac4038ca659b22a032715cf13ad48f432cfa0f96b6569b905409b", + "baseTransferHash": "0x33d82f7563b5b414429200007a1a56dc20ab2d21b7af2d0057b57b4f610dc40e", + "quoteTransferHash": "0xc5495b89faf96c4469a87c50751d0438db23d81bec9c485a57beddda08a9c099", + "buySharesHash": "0x905a9d59d96c7ea816ffed9a79deed9d23e442be40cc5608826505b888b3e7c7", + "canaryTransferHash": "0xe42780b8a94903e90a38081801f5968b0531fb9c6acfc42c2b5fc7a9d37005ff", + "seedRaw": "1000000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#56-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "1001000", + "quoteBalanceRaw": "1000000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -2560,11 +2734,11 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "canary_passed", + "status": "production", "requiredForSpend": true, "canaryEvidence": { + "poolId": "137-dodo_pmm-cwusdc-usdc", "generatedAt": "2026-04-29T04:41:13.993Z", - "sourceFile": "config/all-mainnet-canary-evidence.json", "canaryTransactions": [ { "direction": "base_to_quote", @@ -2578,7 +2752,8 @@ ], "notes": [ "Tiny live canary swap executed on Polygon DODO PMM cWUSDC/USDC." - ] + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" }, "fundingTiersUsd": { "seed": 10, @@ -2595,15 +2770,27 @@ "Public destination spend settlement pool", "Live reserve read recorded from required-pool balance checker.", "Vault assignments applied from explicit All Mainnet vault assignment map.", - "Canary evidence recorded from explicit All Mainnet canary evidence file." + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#137-dodo_pmm-cwusdc-usdc", "baseBalanceRaw": "39885", "quoteBalanceRaw": "39883", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -2658,11 +2845,11 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "canary_passed", + "status": "production", "requiredForSpend": true, "canaryEvidence": { + "poolId": "137-dodo_pmm-cwusdt-usdt", "generatedAt": "2026-04-29T04:41:13.993Z", - "sourceFile": "config/all-mainnet-canary-evidence.json", "canaryTransactions": [ { "direction": "base_to_quote", @@ -2676,7 +2863,8 @@ ], "notes": [ "Tiny live canary swap executed on Polygon DODO PMM cWUSDT/USDT." - ] + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" }, "fundingTiersUsd": { "seed": 10, @@ -2693,15 +2881,27 @@ "Public destination spend settlement pool", "Live reserve read recorded from required-pool balance checker.", "Vault assignments applied from explicit All Mainnet vault assignment map.", - "Canary evidence recorded from explicit All Mainnet canary evidence file." + "Canary evidence recorded from explicit All Mainnet canary evidence file.", + "Promoted to production after reserve and canary evidence checks." ], "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#137-dodo_pmm-cwusdt-usdt", "baseBalanceRaw": "2605", "quoteBalanceRaw": "2603", "poolHasCode": true, "liveReadStatus": "nonzero_base_and_quote" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -3306,7 +3506,7 @@ "transactionHash": "0x6a63466a12d2ee71201be232db0af6d5f40f8d829dbe453c9f00abbe6df6fbb9" }, "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#8453-dodo_pmm-cwusdc-usdc", "baseBalanceRaw": "1000000", "quoteBalanceRaw": "1000000", @@ -3365,8 +3565,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -3382,12 +3582,36 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Live reserve read recorded from required-pool balance checker.", + "Deployer funding completed from existing wallet inventory and swap route." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode", "transactionHash": "0x896abe7fea208889d61e9f93dc14c892fc13db7488a2760f2f49a1d4dc660208" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#8453-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "1001000", + "quoteBalanceRaw": "1000000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "method": "deployer_inventory_swap_then_transfer_base_quote_buyShares", + "chainId": 8453, + "swapHash": "0xf102a798f7dae621c6ed0f8b7367ed6aa4c30d5c070791f42ac19771058ad684", + "approveSwapHash": "0x3dc6e0bbe9a791a3182f572cb9fa3194298d35f0e3c1acaac94236b5811e72ac", + "baseTransferHash": "0xf51865e636f558f89c7fc88da933154f4d3e3bc2f77b6308cdf8d3e066b433e8", + "quoteTransferHash": "0xee2b3d33f18e0eb1e48abd03d13588b31ec2b0de79b6eb00703419fa31276617", + "buySharesHash": "0xdd38f0a7773d472f12868d1dc94ab8c610926543dadf93a1f92ef7e44d772c54", + "seedRaw": "1000000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "funded_nonzero_reserves_canary_sellBase_reverted" } }, { @@ -3992,7 +4216,7 @@ "transactionHash": "0x4385161e41e88a560cc5107020d6099c540428c4e39f2415e238a37de16f4d31" }, "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#42161-dodo_pmm-cwusdc-usdc", "baseBalanceRaw": "100000", "quoteBalanceRaw": "100000", @@ -4051,8 +4275,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -4068,12 +4292,37 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Deployer funding attempt completed, but DVM reserve accounting still reads zero; requires DODO pool surface remediation before production.", + "Live reserve read recorded from required-pool balance checker.", + "Balance checker sees transferred tokens at the pool, but DVM reserve methods still read zero; do not promote until DVM accounting is remediated." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode", "transactionHash": "0xc3abbe7ca2cdfe32aca0982e0060f7810d97581885554da48b0d2f92f5c88ca2" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "method": "deployer_inventory_swap_then_transfer_base_quote_buyShares", + "chainId": 42161, + "swapHash": "0x61add30e41100f6ca800b666152af1833a8077962ac6044305beac8f7f761c4d", + "approveSwapHash": "0xf89633af963b004afa71f50a694ab008e00d142333f811b759837b1ee151e7e4", + "baseTransferHash": "0xda4b939979e8ff9e1eac83e7033700f3cd519cbfbb2f4fd02664a098282ff16d", + "quoteTransferHash": "0x628c042a714369634b1ef361a947200cd7010bcd15d210c8954597d42d2daefc", + "buySharesHash": "0x3dfa43f3d27674f847796d1294e9fbf0066111b2cbe2baea079317f163c8cdc8", + "seedRaw": "100000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#42161-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "100100", + "quoteBalanceRaw": "100000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -4652,8 +4901,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -4669,11 +4918,44 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding transfers completed, but DVM reserve accounting still reads zero; production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode" + }, + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 43114, + "token": "cWUSDC", + "amountRaw": "1000000000", + "txHash": "0x4b22617426c45322022b31beaee793430f24df224c777f68666c34f4d379f7ad" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 43114, + "swapHash": "0xc51ec753ab69bb5f2e6ed3b3c204646446d7cff6f1a892d6b33b1bd2b06ad83e", + "baseTransferHash": "0xd715804f4a0287ddcdc7c666e33e4ba77462d93c0215ff87264d1ba7080f2122", + "quoteTransferHash": "0x72b0ff226279b803fec4c79ff1fc315c124d24ecf35c97d17a69bfea333b07d4", + "buySharesHash": "0x926fc0e802ee4c206dd087f15197c8bd3bd9c6f1d7b0da0829f2c03bbc555796", + "canaryTransferHash": "0x5a5344c01bbc867074c72afd3ee302a6ebef7aba302c8356a7b0c4c141743b54", + "seedRaw": "1000000", + "baseSymbol": "cWUSDC", + "quoteSymbol": "USDC", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#43114-dodo_pmm-cwusdc-usdc", + "baseBalanceRaw": "1001000", + "quoteBalanceRaw": "1000000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -4727,8 +5009,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -4744,11 +5026,44 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding transfers completed, but DVM reserve accounting still reads zero; production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode" + }, + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 43114, + "token": "cWUSDT", + "amountRaw": "1000000000", + "txHash": "0xf371818e20ad51ff6f87a20f041cee01ca90d36a0a3ba14dd3f0d710c9c28ad0" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 43114, + "swapHash": "0xa7f9aa1670a5e5dbb13cc4456d623e41cab34512daaf20525c76e1f2025222d8", + "baseTransferHash": "0x41ee907b4b07ddcf023f0151c371e331eb81cf0a2e5219df525b58b79f7f1a1a", + "quoteTransferHash": "0x1c0dc6cfed0757909385c09428575a55ba640772102776de0f0f8fe64c1d4000", + "buySharesHash": "0x899d57c43b5869d2708c02c643b6124d8ce6c22e9a4f06db52b5b650720a1732", + "canaryTransferHash": "0xe366eb69c3befcdf9e4cb672e5912fb11fcf4f6e6f2a99cc4d555ef5e7e8f132", + "seedRaw": "1000000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#43114-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "1001000", + "quoteBalanceRaw": "1000000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -5344,8 +5659,19 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." - ] + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW bridge transaction submitted from Chain 138; pending destination CCIP delivery." + ], + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "chain138_cw_l1_bridge_lockAndSend_pending_ccip_delivery", + "chainId": 10, + "token": "cWUSDC", + "canonicalToken": "cUSDC", + "amountRaw": "1000000000", + "sourceChainId": 138, + "txHash": "0xb27f94465241219971c421805927c5b632dc08bf82c43e0608b25e025607888a" + } }, { "poolId": "10-dodo_pmm-cwusdt-usdt", @@ -5415,8 +5741,20 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." - ] + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW bridge transaction submitted from Chain 138; pending destination CCIP delivery." + ], + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "chain138_cw_l1_bridge_lockAndSend_pending_ccip_delivery", + "chainId": 10, + "token": "cWUSDT", + "canonicalToken": "cUSDT", + "amountRaw": "1000000000", + "sourceChainId": 138, + "approvalTxHash": "0xd3cc079dc3876b1714b24c0b9e566833b0dc918453bda64d1a1d98d25c16504f", + "txHash": "0xf43e5c6aacfaa2fad31274237b4b170194e287ba34198b20289ef8e5e4d4e96b" + } }, { "poolId": "10-dodo_pmm-cwusdc-usdt", @@ -5994,8 +6332,8 @@ "k": 500000000000000000, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "promod_gru_v2_full_mesh_gap_report", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -6011,8 +6349,41 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." - ] + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding completed; DODO sellBase canary still reverts, so production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." + ], + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 25, + "token": "cWUSDC", + "amountRaw": "1000000000", + "txHash": "0x18183c0e19cdd18bc1ba099ad5c49617990636112a477c78f75b2a2cb24f5e40" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 25, + "swapHash": "0xbde8e33abbedd6ff74bcd6e7a10818d0b0bdef7ac77292afe27738a361146995", + "baseTransferHash": "0x20418ab709efec907dea5c8693206689e96d411cb539378a28167488dea2097b", + "quoteTransferHash": "0x48ed9582e435204c872442ddd07057b83cb19566d46af5029c3a8348dc300c25", + "buySharesHash": "0x64e5db8d01300cf597f534e52ae6f2ed9f3ffb7f99be15159184ac461b1db2b0", + "canaryTransferHash": "0xcf8ee7d4093b4b51139f7d3fcb98da127eb470e67ef24be5cd4c0a6f0cabe20b", + "seedRaw": "3000", + "baseSymbol": "cWUSDC", + "quoteSymbol": "USDC", + "result": "funded_nonzero_reserves_canary_sellBase_reverted" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#25-dodo_pmm-cwusdc-usdc", + "baseBalanceRaw": "3100", + "quoteBalanceRaw": "3000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" + } }, { "poolId": "25-dodo_pmm-cwusdt-usdt", @@ -6065,8 +6436,8 @@ "k": 500000000000000000, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "promod_gru_v2_full_mesh_gap_report", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -6082,8 +6453,33 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." - ] + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Live reserve read recorded from required-pool balance checker.", + "Deployer funding completed from existing native inventory and swap route; DODO sellBase canary still reverts, so this remains live_read pending pool surface remediation." + ], + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#25-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "3100", + "quoteBalanceRaw": "3000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:35:42.907Z", + "method": "deployer_native_swap_then_transfer_base_quote_buyShares", + "chainId": 25, + "swapHash": "0x0590cfce98133eb56914500a1736ee420baba5de59565fcd15b11ee4623165d0", + "baseTransferHash": "0x42ad206319ad98d5a6a1dfe37093d544381a19a54abf146c85af7943fabdbe1d", + "quoteTransferHash": "0x1c1b6c2efbde886683e9aeaf099b09119523a969200179b846969c348ecd4629", + "buySharesHash": "0x714c1e874edb2ca2d8355d0ef63a68e885bc9b3d28e97da5213ff33cbb97ec44", + "canaryTransferHash": "0xce06874892ba7c19b0cf171115db9aa96a877cd81eba1a5bc6f4e3fec90c49e1", + "canarySwapHash": null, + "seedRaw": "3000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "funded_nonzero_reserves_canary_sellBase_reverted" + } }, { "poolId": "25-dodo_pmm-cwusdc-usdt", @@ -6661,8 +7057,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -6678,11 +7074,44 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding transfers completed, but DVM reserve accounting still reads zero; production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode" + }, + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 100, + "token": "cWUSDC", + "amountRaw": "1000000000", + "txHash": "0x503202795c028a83da84152f64286615f1a2b871d0cc99ae466c622f9f52a1ca" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 100, + "swapHash": "0xe8373c7d0d64bfe23770f1479446148b6b8a4bb6344602cbc70d532016dffe0f", + "baseTransferHash": "0x5d0885ad5a7cc90d8e2f5f4c9fabb552aff5b2f6e80f450583ccd2fb8c96f455", + "quoteTransferHash": "0x46149e4eb1fc7cb1aae99f38ac280de11eea2eebfc555c249eb90447418f4e30", + "buySharesHash": "0xfd731849cfd424b755b7f020fd66c87d77ef59b0ea013cd434b2efe935c03e94", + "canaryTransferHash": "0xc0c9f150b5d5ced370209813f57d8477bcf46281dccb60bdecf067c231718d15", + "seedRaw": "1000000", + "baseSymbol": "cWUSDC", + "quoteSymbol": "USDC", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#100-dodo_pmm-cwusdc-usdc", + "baseBalanceRaw": "1001000", + "quoteBalanceRaw": "1000000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -6736,8 +7165,8 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "live_read", "requiredForSpend": true, "canaryEvidence": null, "fundingTiersUsd": { @@ -6753,11 +7182,44 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "cW destination inventory issued to deployer for pool funding.", + "Deployer funding transfers completed, but DVM reserve accounting still reads zero; production promotion is blocked on pool surface remediation.", + "Live reserve read recorded from required-pool balance checker." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode" + }, + "cWInventoryEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "destination_mint_by_deployer_minter_role", + "chainId": 100, + "token": "cWUSDT", + "amountRaw": "1000000000", + "txHash": "0x4457bbd545935b1bd64157bb51a0e3dee5ed15e96dd3c643d11f2f94ca1d437a" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T08:52:59.886Z", + "method": "deployer_cw_inventory_plus_native_quote_swap_then_transfer_base_quote_buyShares", + "chainId": 100, + "swapHash": "0x2b62475ab75a86638bcbb273cf9e8697c667fb7d63c170d246e1610735fbba75", + "baseTransferHash": "0x5bafd149aac8f0d68e0aa99f6dc52a93eb4e8503243f0d5a419a599ebae4c542", + "quoteTransferHash": "0x160b6a9e0090cae17eef06c9548d379a4189ff15bd51a4039bc66de3ef17eb91", + "buySharesHash": "0x4c18c5a16246600248ddfe22f1cf79d7572a54132d9bd4956dc6ca4db6556c50", + "canaryTransferHash": "0x62ff4e2a2b9c0a4927790b627370e7ca0927ee99ee2c3b7386ddcabc6a3b623e", + "seedRaw": "1000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "tokens_present_but_dvm_reserves_remain_zero" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#100-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "1100", + "quoteBalanceRaw": "1000", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" } }, { @@ -7336,10 +7798,28 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "production", "requiredForSpend": true, - "canaryEvidence": null, + "canaryEvidence": { + "poolId": "42220-dodo_pmm-cwusdc-usdc", + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0x32d3869f987d558e392fd01aab77968d9cad1d90da71be1db90061f58d5c14b1", + "fundingTransferTxHash": "0x8ecd2a68f5dc3f2ab471ccc7ea8fdce16064029b6792bce7a387d943326fa1d6", + "amountInRaw": "100", + "tokenIn": "cWUSDC", + "tokenOut": "USDC", + "executor": "DODO_DVM.transfer_then_sellBase" + } + ], + "notes": [ + "Tiny live canary swap executed on Celo DODO PMM cWUSDC/USDC after deployer-funded seed liquidity." + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" + }, "fundingTiersUsd": { "seed": 10, "smoke": 100, @@ -7353,12 +7833,48 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Live reserve read recorded from required-pool balance checker.", + "Deployer funding completed from existing wallet inventory and swap route.", + "Promoted to production after reserve and canary evidence checks." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode", "transactionHash": "0x17c5866855a0cbd058c8103c5fdafd1ecfc0671eee5e314421f1f1a57ceeb207" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#42220-dodo_pmm-cwusdc-usdc", + "baseBalanceRaw": "10100", + "quoteBalanceRaw": "9802", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "method": "deployer_inventory_swap_then_transfer_base_quote_buyShares", + "chainId": 42220, + "swapHash": "0x109b0cf8f921be9b1a2d786c49fdcafbf2ea6016f6288c41f8bcf79f20f5a92b", + "approveSwapHash": "0x0e40bf390de49a57c2dce6a247f2750911bb136601a6feb86fce668451417f74", + "baseTransferHash": "0x498bc020994745adb281a356b595c3a306ca6c3e87c2718d15db4c7c75adf75b", + "quoteTransferHash": "0x43ecbe77214809d2424799f8f97ea5cb43ba5941973ea0adccd8f4f29c348194", + "buySharesHash": "0x77388fd2c32f60e98d0d716f086395e123bd96067ff496bf2996415fdb283858", + "seedRaw": "10000", + "baseSymbol": "cWUSDC", + "quoteSymbol": "USDC", + "result": "funded_nonzero_reserves_canary_passed" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T08:32:53.041Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -7412,10 +7928,28 @@ "k": null, "singleSided": false, "publicRoutingEnabled": true, - "reserveSource": "dodo_pmm_integration", - "status": "created", + "reserveSource": "all-mainnet-required-pool-balance-check", + "status": "production", "requiredForSpend": true, - "canaryEvidence": null, + "canaryEvidence": { + "poolId": "42220-dodo_pmm-cwusdt-usdt", + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "canaryTransactions": [ + { + "direction": "base_to_quote", + "txHash": "0x0498a0484f6707e0f8019b8803a8aed932f33f587a57186cc37bcdc594393094", + "fundingTransferTxHash": "0xd4182a6e116df30544097851892f379d67af2b33fc2374bb0204a6450dcecea4", + "amountInRaw": "100", + "tokenIn": "cWUSDT", + "tokenOut": "USDT", + "executor": "DODO_DVM.transfer_then_sellBase" + } + ], + "notes": [ + "Tiny live canary swap executed on Celo DODO PMM cWUSDT/USDT after deployer-funded seed liquidity." + ], + "sourceFile": "config/all-mainnet-canary-evidence.json" + }, "fundingTiersUsd": { "seed": 10, "smoke": 100, @@ -7429,12 +7963,48 @@ }, "notes": [ "Public destination spend settlement pool", - "Vault assignments applied from explicit All Mainnet vault assignment map." + "Vault assignments applied from explicit All Mainnet vault assignment map.", + "Live reserve read recorded from required-pool balance checker.", + "Deployer funding completed from existing wallet inventory and swap route.", + "Promoted to production after reserve and canary evidence checks." ], "createdEvidence": { "onChainVerifiedAt": "2026-04-28T09:01:52.559Z", "verification": "integration pools(base,quote) resolves to pool address and pool address has bytecode", "transactionHash": "0xa7271d12b9602c28020eb168e90745e78df92bb004a29dda2f67543098c6560c" + }, + "reserveEvidence": { + "generatedAt": "2026-04-30T08:53:07.745Z", + "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#42220-dodo_pmm-cwusdt-usdt", + "baseBalanceRaw": "10100", + "quoteBalanceRaw": "9802", + "poolHasCode": true, + "liveReadStatus": "nonzero_base_and_quote" + }, + "fundingEvidence": { + "generatedAt": "2026-04-30T00:00:00.000-07:00", + "method": "deployer_inventory_swap_then_transfer_base_quote_buyShares", + "chainId": 42220, + "swapHash": "0xae5f215f4110ca3dbc860d46592cefabd8f83448be42b782807fc363d436d158", + "approveSwapHash": "0x8bef33e6f354083880a6a8289a646cb0aa626d2f21b20e3a1fa339b925648ae4", + "baseTransferHash": "0xba5e9a79a2191dde4dda4193c6248b7fe69027161cd93d9af6a16136e476c380", + "quoteTransferHash": "0x9387ad9ac9961b95ca70bfc20a422cb1b4f0bbb51d53bfc84f0767669f460aa5", + "buySharesHash": "0xb6c1fbda85d73e0be887ebcaa8305396d1d7799f5f36e36dd910efbaa9dbaf5f", + "seedRaw": "10000", + "baseSymbol": "cWUSDT", + "quoteSymbol": "USDT", + "result": "funded_nonzero_reserves_canary_passed" + }, + "productionEvidence": { + "generatedAt": "2026-04-30T08:32:53.041Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } }, { @@ -8693,7 +9263,7 @@ "singleSided": false, "publicRoutingEnabled": true, "reserveSource": "all-mainnet-required-pool-balance-check", - "status": "canary_passed", + "status": "production", "requiredForSpend": true, "canaryEvidence": { "generatedAt": "2026-04-29T06:17:00Z", @@ -8728,7 +9298,8 @@ "ALL Mainnet official Uniswap V3 pool stack deployed from upstream Uniswap V3 artifacts.", "AUSDT/WALL 0.30% pool initialized at 1:1 sqrtPriceX96 and seeded through NonfungiblePositionManager.", "Standalone SwapRouter and Quoter are live and tested; EnhancedSwapRouterV2 V3 provider remains disabled until adapter quote compatibility is fixed.", - "Live reserve read recorded from required-pool balance checker." + "Live reserve read recorded from required-pool balance checker.", + "Promoted to production after reserve and canary evidence checks." ], "infrastructure": { "nftDescriptorLibrary": "0xb53E8A0A19fB381537c6f28D37b7C2f7DC29EF02", @@ -8747,7 +9318,7 @@ "verification": "UniswapV3Factory.getPool(AUSDT,WALL,3000) resolves to pool address; pool has code and liquidity." }, "reserveEvidence": { - "generatedAt": "2026-04-30T06:51:46.495Z", + "generatedAt": "2026-04-30T08:53:07.745Z", "evidenceRef": "reports/status/all-mainnet-required-pool-balances-latest.json#651940-uniswap_v3-wall-ausdt", "baseBalanceRaw": "1000000000001000000", "quoteBalanceRaw": "999999999999003001", @@ -8769,6 +9340,17 @@ "slippageBps": 30, "routerQuoteExecutable": true } + }, + "productionEvidence": { + "generatedAt": "2026-04-30T07:26:09.452Z", + "basis": [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present" + ] } } ] diff --git a/scripts/status/build-all-mainnet-deployment-funding-packet.mjs b/scripts/status/build-all-mainnet-deployment-funding-packet.mjs index 2dc9a00b..aa7f5b91 100644 --- a/scripts/status/build-all-mainnet-deployment-funding-packet.mjs +++ b/scripts/status/build-all-mainnet-deployment-funding-packet.mjs @@ -16,6 +16,7 @@ const readinessPath = resolve(repoRoot, "reports/status/all-mainnet-deployment-r const reservePath = resolve(repoRoot, "reports/status/all-mainnet-required-pool-balances-latest.json"); const canaryPath = resolve(repoRoot, "reports/status/all-mainnet-canary-preflight-latest.json"); const rebalancePath = resolve(repoRoot, "reports/status/all-mainnet-rebalance-plan-latest.json"); +const dodoFundingPath = resolve(repoRoot, "reports/status/all-mainnet-dodo-funding-preflight-latest.json"); const jsonOut = resolve(repoRoot, "reports/status/all-mainnet-full-deployment-funding-packet-latest.json"); const mdOut = resolve(repoRoot, "reports/status/all-mainnet-full-deployment-funding-packet-latest.md"); @@ -49,17 +50,20 @@ const readiness = readJson(readinessPath, { blockers: [] }); const reserve = readJson(reservePath, { results: [] }); const canary = readJson(canaryPath, { results: [] }); const rebalance = readJson(rebalancePath, { intents: [] }); +const dodoFunding = readJson(dodoFundingPath, { results: [] }); const generatedAt = new Date().toISOString(); const reserveByPoolId = new Map(reserve.results.map((row) => [row.poolId, row])); const canaryByPoolId = new Map(canary.results.map((row) => [row.poolId, row])); const rebalanceByPoolId = new Map(rebalance.intents.map((row) => [row.poolId, row])); +const dodoFundingByPoolId = new Map(dodoFunding.results.map((row) => [row.poolId, row])); const requiredRows = matrix.rows.filter((row) => row.requiredForSpend === true); const rows = requiredRows.map((row) => { const reserveRow = reserveByPoolId.get(row.poolId); const canaryRow = canaryByPoolId.get(row.poolId); const rebalanceRow = rebalanceByPoolId.get(row.poolId); + const dodoFundingRow = dodoFundingByPoolId.get(row.poolId); const blockers = new Set(poolBlockers(row)); const productionBlockers = new Set(); const actions = []; @@ -67,11 +71,26 @@ const rows = requiredRows.map((row) => { if (row.status === "planned") { actions.push(row.protocol === "dodo_pmm" ? "create_or_import_dodo_pool" : "create_or_import_pool"); } - if (reserveRow?.liveReadStatus === "zero_balances") actions.push("fund_base_and_quote"); - if (reserveRow?.liveReadStatus === "partial_balance") actions.push("fund_low_side"); + if (reserveRow?.liveReadStatus === "zero_balances") { + if (row.protocol === "dodo_pmm" && dodoFundingRow?.status !== "ready") { + for (const blocker of dodoFundingRow?.blockers || ["dodo_funding_preflight_missing"]) blockers.add(`funding_${blocker}`); + } else { + actions.push("fund_base_and_quote"); + } + } + if (reserveRow?.liveReadStatus === "partial_balance") { + if (row.protocol === "dodo_pmm" && dodoFundingRow?.status !== "ready") { + for (const blocker of dodoFundingRow?.blockers || ["dodo_funding_preflight_missing"]) blockers.add(`funding_${blocker}`); + } else { + actions.push("fund_low_side"); + } + } if (["live_read"].includes(row.status)) actions.push("run_canary"); if (canaryRow?.canaryPreflight === "ready") actions.push("execute_canary_swap"); - if (rebalanceRow?.executionStatus === "operator_review_required") actions.push(...(rebalanceRow.actions || [])); + if (rebalanceRow?.executionStatus === "operator_review_required") { + actions.push(...(rebalanceRow.actions || [])); + blockers.add("rebalance_operator_review_required"); + } for (const blocker of canaryRow?.blockers || []) blockers.add(blocker); if (["live_read", "canary_passed", "production"].includes(row.status)) { @@ -90,6 +109,7 @@ const rows = requiredRows.map((row) => { publicRoutingEnabled: Boolean(row.publicRoutingEnabled), reserveStatus: reserveRow?.liveReadStatus || "not_checked", canaryPreflight: canaryRow?.canaryPreflight || "not_checked", + dodoFundingPreflight: dodoFundingRow?.status || "not_checked", rebalanceStatus: rebalanceRow?.executionStatus || "not_planned", actions: [...new Set(actions)], blockers: [...blockers], diff --git a/scripts/status/plan-all-mainnet-rebalance.mjs b/scripts/status/plan-all-mainnet-rebalance.mjs index dc5d8664..7bbc3e7b 100644 --- a/scripts/status/plan-all-mainnet-rebalance.mjs +++ b/scripts/status/plan-all-mainnet-rebalance.mjs @@ -38,6 +38,29 @@ function ratioBps(a, b) { return Number(((high - low) * 10_000n) / high); } +function rebalanceHint(row, base, quote, imbalanceBps) { + if (base === 0n && quote === 0n) return null; + const highSide = base > quote ? "base" : quote > base ? "quote" : "balanced"; + const lowSide = base > quote ? "quote" : quote > base ? "base" : "balanced"; + const highSymbol = highSide === "base" ? row.baseToken?.symbol : row.quoteToken?.symbol; + const lowSymbol = lowSide === "base" ? row.baseToken?.symbol : row.quoteToken?.symbol; + return { + highSide, + lowSide, + highSymbol, + lowSymbol, + imbalanceBps, + conservativeAction: + highSide === "balanced" + ? "monitor_no_rebalance_required" + : `add_or_swap_into_${lowSide}_side`, + note: + highSide === "balanced" + ? "Reserves are balanced in raw units." + : `Reserve skew is ${imbalanceBps} bps by raw token units; correct toward ${lowSymbol} before increasing ${highSymbol} exposure.`, + }; +} + function reserveEvidenceFor(row, reserveByPoolId) { const live = reserveByPoolId.get(row.poolId); if (live) { @@ -78,6 +101,7 @@ function planForRow(row, evidence) { const base = asBigInt(evidence?.baseBalanceRaw); const quote = asBigInt(evidence?.quoteBalanceRaw); const imbalanceBps = ratioBps(base, quote); + const hint = rebalanceHint(row, base, quote, imbalanceBps); if (evidence) { if (evidence.poolHasCode !== true) blockers.push("pool_code_not_confirmed"); @@ -113,6 +137,7 @@ function planForRow(row, evidence) { }, reserveEvidence: evidence, imbalanceBps, + rebalanceHint: hint, actions: [...new Set(actions)], blockers: [...new Set(blockers)], executionStatus: blockers.length ? "blocked" : actions.includes("monitor_no_rebalance_required") ? "no_action" : "operator_review_required", diff --git a/scripts/status/preflight-all-mainnet-canaries.mjs b/scripts/status/preflight-all-mainnet-canaries.mjs index 44d0923a..f2e1dcb5 100644 --- a/scripts/status/preflight-all-mainnet-canaries.mjs +++ b/scripts/status/preflight-all-mainnet-canaries.mjs @@ -7,7 +7,8 @@ * promoted to live_read. */ -import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { homedir } from "node:os"; import { resolve } from "node:path"; import { ethers } from "ethers"; @@ -16,17 +17,45 @@ const matrixPath = resolve(repoRoot, "config/all-mainnet-pool-creation-matrix.js const outDir = resolve(repoRoot, "reports/status"); const reportPath = resolve(outDir, "all-mainnet-canary-preflight-latest.json"); +function loadDotenvFile(path) { + if (!existsSync(path)) return; + const content = readFileSync(path, "utf8"); + for (const line of content.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const match = trimmed.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/); + if (!match) continue; + const [, key, rawValue] = match; + if (process.env[key] !== undefined) continue; + let value = rawValue.trim(); + if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1); + } else { + value = value.replace(/\s+#.*$/, ""); + } + if (value.includes("${")) continue; + process.env[key] = value.trim(); + } +} + +loadDotenvFile(resolve(repoRoot, ".env")); +loadDotenvFile(resolve(repoRoot, "smom-dbis-138/.env")); +loadDotenvFile(resolve(homedir(), ".secure-secrets/private-keys.env")); +if (!process.env.PRIVATE_KEY && process.env.DEPLOYER_PRIVATE_KEY) { + process.env.PRIVATE_KEY = process.env.DEPLOYER_PRIVATE_KEY; +} + 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", + 10: process.env.OPTIMISM_RPC || process.env.OPTIMISM_MAINNET_RPC || process.env.RPC_URL_10 || "https://optimism.publicnode.com", + 25: process.env.CRONOS_RPC || process.env.CRONOS_RPC_URL || process.env.RPC_URL_25 || "https://cronos-evm-rpc.publicnode.com", + 56: process.env.BSC_RPC || process.env.BSC_RPC_URL || process.env.RPC_URL_56 || "https://bsc-rpc.publicnode.com", + 100: process.env.GNOSIS_RPC || process.env.GNOSIS_MAINNET_RPC || process.env.RPC_URL_100 || "https://gnosis.publicnode.com", + 137: process.env.POLYGON_RPC || process.env.POLYGON_MAINNET_RPC || process.env.RPC_URL_137 || "https://polygon-bor-rpc.publicnode.com", + 8453: process.env.BASE_RPC || process.env.BASE_MAINNET_RPC || process.env.RPC_URL_8453 || "https://base-rpc.publicnode.com", + 42161: process.env.ARBITRUM_RPC || process.env.ARBITRUM_MAINNET_RPC || process.env.RPC_URL_42161 || "https://arbitrum-one-rpc.publicnode.com", + 42220: process.env.CELO_RPC || process.env.CELO_MAINNET_RPC || process.env.RPC_URL_42220 || "https://celo-rpc.publicnode.com", + 43114: process.env.AVALANCHE_RPC || process.env.AVALANCHE_RPC_URL || 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", }; @@ -39,8 +68,13 @@ 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 querySellBase(address,uint256) view returns (uint256,uint256)", + "function querySellQuote(address,uint256) view returns (uint256,uint256)", + "function getMidPrice() view returns (uint256)", + "function getPMMStateForCall() view returns (uint256,uint256,uint256,uint256,uint256,uint256,uint256)", + "function getVaultReserve() view returns (uint256,uint256)", + "function _BASE_RESERVE_() view returns (uint112)", + "function _QUOTE_RESERVE_() view returns (uint112)", ]; function operatorAddress() { @@ -123,19 +157,57 @@ 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([ + const [sellBase, sellQuote, midPrice, pmmState, vaultReserve, baseReserve, quoteReserve] = await Promise.all([ callOrError(() => pool.querySellBase(operator, baseAmount)), callOrError(() => pool.querySellQuote(operator, quoteAmount)), + callOrError(() => pool.getMidPrice()), + callOrError(() => pool.getPMMStateForCall()), + callOrError(() => pool.getVaultReserve()), + callOrError(() => pool._BASE_RESERVE_()), + callOrError(() => pool._QUOTE_RESERVE_()), ]); return { supported: sellBase.ok || sellQuote.ok, poolAddress: row.poolAddress, - sellBaseOutRaw: sellBase.ok ? sellBase.value.toString() : null, - sellQuoteOutRaw: sellQuote.ok ? sellQuote.value.toString() : null, + sampleAmounts: { + baseRaw: baseAmount.toString(), + quoteRaw: quoteAmount.toString(), + }, + midPriceRaw: midPrice.ok ? midPrice.value.toString() : null, + pmmState: pmmState.ok + ? { + iRaw: pmmState.value[0].toString(), + kRaw: pmmState.value[1].toString(), + baseReserveRaw: pmmState.value[2].toString(), + quoteReserveRaw: pmmState.value[3].toString(), + baseTargetRaw: pmmState.value[4].toString(), + quoteTargetRaw: pmmState.value[5].toString(), + rState: pmmState.value[6].toString(), + } + : null, + vaultReserve: vaultReserve.ok + ? { + baseRaw: vaultReserve.value[0].toString(), + quoteRaw: vaultReserve.value[1].toString(), + } + : null, + storedReserve: { + baseRaw: baseReserve.ok ? baseReserve.value.toString() : null, + quoteRaw: quoteReserve.ok ? quoteReserve.value.toString() : null, + }, + sellBaseOutRaw: sellBase.ok ? sellBase.value[0].toString() : null, + sellBaseFeeRaw: sellBase.ok ? sellBase.value[1].toString() : null, + sellQuoteOutRaw: sellQuote.ok ? sellQuote.value[0].toString() : null, + sellQuoteFeeRaw: sellQuote.ok ? sellQuote.value[1].toString() : null, errors: [ ...(sellBase.ok ? [] : [`query_sell_base:${sellBase.error}`]), ...(sellQuote.ok ? [] : [`query_sell_quote:${sellQuote.error}`]), + ...(midPrice.ok ? [] : [`get_mid_price:${midPrice.error}`]), + ...(pmmState.ok ? [] : [`get_pmm_state:${pmmState.error}`]), + ...(vaultReserve.ok ? [] : [`get_vault_reserve:${vaultReserve.error}`]), + ...(baseReserve.ok ? [] : [`get_base_reserve:${baseReserve.error}`]), + ...(quoteReserve.ok ? [] : [`get_quote_reserve:${quoteReserve.error}`]), ], }; } diff --git a/scripts/status/preflight-all-mainnet-dodo-funding.mjs b/scripts/status/preflight-all-mainnet-dodo-funding.mjs new file mode 100644 index 00000000..5a5625ad --- /dev/null +++ b/scripts/status/preflight-all-mainnet-dodo-funding.mjs @@ -0,0 +1,182 @@ +#!/usr/bin/env node +/** + * Read-only funding preflight for required ALL Mainnet DODO rows. + * + * It checks whether created zero-reserve DODO pools can be seeded safely with + * the operator's current base/quote inventory. No transactions are executed. + */ + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { homedir } from "node:os"; +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 outPath = resolve(outDir, "all-mainnet-dodo-funding-preflight-latest.json"); + +function loadDotenvFile(path) { + if (!existsSync(path)) return; + for (const line of readFileSync(path, "utf8").split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const match = trimmed.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/); + if (!match) continue; + const [, key, rawValue] = match; + if (process.env[key] !== undefined) continue; + let value = rawValue.trim(); + if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1); + } else { + value = value.replace(/\s+#.*$/, ""); + } + if (value.includes("${")) continue; + process.env[key] = value.trim(); + } +} + +loadDotenvFile(resolve(repoRoot, ".env")); +loadDotenvFile(resolve(repoRoot, "smom-dbis-138/.env")); +loadDotenvFile(resolve(homedir(), ".secure-secrets/private-keys.env")); +if (!process.env.PRIVATE_KEY && process.env.DEPLOYER_PRIVATE_KEY) process.env.PRIVATE_KEY = process.env.DEPLOYER_PRIVATE_KEY; + +const rpcByChain = { + 10: process.env.OPTIMISM_RPC || process.env.OPTIMISM_MAINNET_RPC || "https://optimism.publicnode.com", + 25: process.env.CRONOS_RPC || process.env.CRONOS_RPC_URL || "https://cronos-evm-rpc.publicnode.com", + 56: process.env.BSC_RPC || process.env.BSC_RPC_URL || "https://bsc-rpc.publicnode.com", + 100: process.env.GNOSIS_RPC || process.env.GNOSIS_MAINNET_RPC || "https://gnosis.publicnode.com", + 8453: process.env.BASE_RPC || process.env.BASE_MAINNET_RPC || "https://base-rpc.publicnode.com", + 42161: process.env.ARBITRUM_RPC || process.env.ARBITRUM_MAINNET_RPC || "https://arbitrum-one-rpc.publicnode.com", + 42220: process.env.CELO_RPC || process.env.CELO_MAINNET_RPC || "https://celo-rpc.publicnode.com", + 43114: process.env.AVALANCHE_RPC || process.env.AVALANCHE_RPC_URL || "https://avalanche-c-chain-rpc.publicnode.com", +}; + +const erc20Abi = [ + "function balanceOf(address) view returns (uint256)", + "function decimals() view returns (uint8)", +]; +const dvmAbi = [ + "function totalSupply() view returns (uint256)", + "function getVaultReserve() view returns (uint256,uint256)", + "function _BASE_TOKEN_() view returns (address)", + "function _QUOTE_TOKEN_() view returns (address)", + "function buyShares(address) returns (uint256,uint256,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 DODO funding preflight."); +} + +function normalized(address) { + return ethers.getAddress(String(address).toLowerCase()); +} + +function seedAmount(decimals) { + return 10n ** BigInt(Math.min(Number(decimals ?? 18), 6)); +} + +async function callOrError(fn) { + try { + return { ok: true, value: await fn() }; + } catch (error) { + return { ok: false, error: error.shortMessage || error.message }; + } +} + +const matrix = JSON.parse(readFileSync(matrixPath, "utf8")); +const operator = operatorAddress(); +const rows = matrix.rows.filter((row) => row.requiredForSpend === true && row.protocol === "dodo_pmm" && row.status === "created"); +const results = []; + +for (const row of rows) { + const result = { + poolId: row.poolId, + chainId: row.chainId, + network: row.network, + poolAddress: row.poolAddress, + operator, + baseToken: row.baseToken, + quoteToken: row.quoteToken, + status: "blocked", + fundingPlan: null, + blockers: [], + }; + + const rpcUrl = rpcByChain[row.chainId]; + if (!rpcUrl) result.blockers.push("missing_rpc"); + if (!row.poolAddress) result.blockers.push("missing_pool_address"); + if (!row.baseToken?.address) result.blockers.push(`missing_base_address:${row.baseToken?.symbol || "unknown"}`); + if (!row.quoteToken?.address) result.blockers.push(`missing_quote_address:${row.quoteToken?.symbol || "unknown"}`); + if (result.blockers.length) { + results.push(result); + continue; + } + + const provider = new ethers.JsonRpcProvider(rpcUrl, row.chainId, { staticNetwork: true }); + const base = new ethers.Contract(normalized(row.baseToken.address), erc20Abi, provider); + const quote = new ethers.Contract(normalized(row.quoteToken.address), erc20Abi, provider); + const pool = new ethers.Contract(normalized(row.poolAddress), dvmAbi, provider); + + const [baseDecimals, quoteDecimals, baseBalance, quoteBalance, totalSupply, reserves, actualBase, actualQuote, dryRunBuyShares] = await Promise.all([ + callOrError(() => base.decimals()), + callOrError(() => quote.decimals()), + callOrError(() => base.balanceOf(operator)), + callOrError(() => quote.balanceOf(operator)), + callOrError(() => pool.totalSupply()), + callOrError(() => pool.getVaultReserve()), + callOrError(() => pool._BASE_TOKEN_()), + callOrError(() => pool._QUOTE_TOKEN_()), + callOrError(() => pool.buyShares.staticCall(operator)), + ]); + + if (!baseDecimals.ok) result.blockers.push(`base_decimals:${baseDecimals.error}`); + if (!quoteDecimals.ok) result.blockers.push(`quote_decimals:${quoteDecimals.error}`); + if (!baseBalance.ok) result.blockers.push(`base_balance:${baseBalance.error}`); + if (!quoteBalance.ok) result.blockers.push(`quote_balance:${quoteBalance.error}`); + if (!totalSupply.ok) result.blockers.push(`dvm_total_supply:${totalSupply.error}`); + if (!reserves.ok) result.blockers.push(`dvm_reserves:${reserves.error}`); + if (!actualBase.ok || normalized(actualBase.value) !== normalized(row.baseToken.address)) result.blockers.push("dvm_base_token_mismatch"); + if (!actualQuote.ok || normalized(actualQuote.value) !== normalized(row.quoteToken.address)) result.blockers.push("dvm_quote_token_mismatch"); + + const baseSeed = baseDecimals.ok ? seedAmount(baseDecimals.value) : 0n; + const quoteSeed = quoteDecimals.ok ? seedAmount(quoteDecimals.value) : 0n; + if (baseBalance.ok && baseBalance.value < baseSeed) result.blockers.push(`insufficient_operator_base:${row.baseToken.symbol}`); + if (quoteBalance.ok && quoteBalance.value < quoteSeed) result.blockers.push(`insufficient_operator_quote:${row.quoteToken.symbol}`); + + result.fundingPlan = { + method: "transfer_base_and_quote_then_buyShares", + baseSeedRaw: baseSeed.toString(), + quoteSeedRaw: quoteSeed.toString(), + operatorBaseRaw: baseBalance.ok ? baseBalance.value.toString() : null, + operatorQuoteRaw: quoteBalance.ok ? quoteBalance.value.toString() : null, + totalSupplyRaw: totalSupply.ok ? totalSupply.value.toString() : null, + reserveBaseRaw: reserves.ok ? reserves.value[0].toString() : null, + reserveQuoteRaw: reserves.ok ? reserves.value[1].toString() : null, + buySharesBeforeTransferStaticCall: dryRunBuyShares.ok + ? dryRunBuyShares.value.map((value) => value.toString()) + : null, + buySharesBeforeTransferError: dryRunBuyShares.ok ? null : dryRunBuyShares.error, + }; + result.status = result.blockers.length === 0 ? "ready" : "blocked"; + results.push(result); +} + +const statusCounts = results.reduce((counts, result) => { + counts[result.status] = (counts[result.status] || 0) + 1; + return counts; +}, {}); + +mkdirSync(outDir, { recursive: true }); +writeFileSync(outPath, `${JSON.stringify({ + generatedAt: new Date().toISOString(), + sourceMatrix: "config/all-mainnet-pool-creation-matrix.json", + mode: "read_only_funding_preflight", + operator, + statusCounts, + results, +}, null, 2)}\n`); +console.log(`[OK] ALL Mainnet DODO funding preflight written: ${statusCounts.ready || 0} ready, ${statusCounts.blocked || 0} blocked.`); diff --git a/scripts/status/promote-all-mainnet-production-ready.mjs b/scripts/status/promote-all-mainnet-production-ready.mjs new file mode 100644 index 00000000..7300b3f7 --- /dev/null +++ b/scripts/status/promote-all-mainnet-production-ready.mjs @@ -0,0 +1,73 @@ +#!/usr/bin/env node +/** + * Promote already-proven ALL Mainnet required rows to production. + * + * This script does not execute transactions. It only advances rows that already + * have a pool address, live nonzero reserves, complete vault assignments, public + * routing enabled, and recorded canary evidence. + */ + +import { readFileSync, writeFileSync } from "node:fs"; +import { resolve } from "node:path"; + +const repoRoot = resolve(new URL("../..", import.meta.url).pathname); +const matrixPath = resolve(repoRoot, "config/all-mainnet-pool-creation-matrix.json"); +const dryRun = process.argv.includes("--dry-run"); + +function eligible(row) { + const reserve = row.reserveEvidence || {}; + return ( + row.requiredForSpend === true && + row.status === "canary_passed" && + row.publicRoutingEnabled === true && + Boolean(row.poolAddress) && + Boolean(row.canaryEvidence) && + (row.missingRequiredVaultRoles || []).length === 0 && + row.vaultAssignmentStatus === "ready" && + reserve.poolHasCode === true && + reserve.liveReadStatus === "nonzero_base_and_quote" && + BigInt(reserve.baseBalanceRaw || "0") > 0n && + BigInt(reserve.quoteBalanceRaw || "0") > 0n + ); +} + +const matrix = JSON.parse(readFileSync(matrixPath, "utf8")); +const promoted = []; +const generatedAt = new Date().toISOString(); + +for (const row of matrix.rows) { + if (!eligible(row)) continue; + row.status = "production"; + row.productionEvidence = { + generatedAt, + basis: [ + "requiredForSpend=true", + "publicRoutingEnabled=true", + "poolAddress present", + "vaultAssignmentStatus=ready", + "reserveEvidence.liveReadStatus=nonzero_base_and_quote", + "canaryEvidence present", + ], + }; + if (!row.notes.includes("Promoted to production after reserve and canary evidence checks.")) { + row.notes.push("Promoted to production after reserve and canary evidence checks."); + } + promoted.push(row.poolId); +} + +matrix.generatedAt = generatedAt; +matrix.statusCounts = matrix.rows.reduce((counts, row) => { + counts[row.status] = (counts[row.status] || 0) + 1; + return counts; +}, {}); +matrix.protocolCounts = matrix.rows.reduce((counts, row) => { + counts[row.protocol] = (counts[row.protocol] || 0) + 1; + return counts; +}, {}); + +if (!dryRun) { + writeFileSync(matrixPath, `${JSON.stringify(matrix, null, 2)}\n`); +} + +console.log(`[OK] ALL Mainnet production promotion ${dryRun ? "dry run" : "complete"}: ${promoted.length} row(s) promoted.`); +for (const poolId of promoted) console.log(` - ${poolId}`);