From ad9f63076abcfe0de38dba5c2f9d865cfbb0a36f Mon Sep 17 00:00:00 2001 From: defiQUG Date: Thu, 16 Apr 2026 12:22:01 -0700 Subject: [PATCH] Refresh explorer verification runbooks --- docs/03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md | 28 + ...ION_AND_PUBLICATION_MATRIX_ALL_NETWORKS.md | 50 +- .../EXPLORER_TOKEN_LIST_CROSSCHECK.md | 17 +- docs/11-references/PMM_DEX_ROUTING_STATUS.md | 2 +- forge-verification-proxy/server.js | 45 +- .../contract_verification_publish_matrix.json | 1719 ++++++++++++++++- ...blockscout-smart-contract-verifier-5000.sh | 171 ++ .../verify-chain138-native-v2-blockscout.sh | 224 +++ ...ain138-route-execution-stack-blockscout.sh | 545 ++++++ .../verify-dodo-v3-chain138-blockscout.sh | 17 +- 10 files changed, 2769 insertions(+), 49 deletions(-) create mode 100755 scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh create mode 100755 scripts/verify/verify-chain138-native-v2-blockscout.sh create mode 100755 scripts/verify/verify-chain138-route-execution-stack-blockscout.sh diff --git a/docs/03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md b/docs/03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md index c480640b..034b3eda 100644 --- a/docs/03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md +++ b/docs/03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md @@ -59,6 +59,32 @@ pct exec 5000 -- bash -c 'cd /opt/blockscout && docker-compose up -d blockscout' --- +## Fix: Smart-Contract Verifier Sidecar Missing + +**Symptom:** verification endpoints exist and submissions appear accepted, but deployed contracts remain `bytecode-only` and never promote into full source metadata. + +**Root cause:** CT `5000` is running only `blockscout` and `postgres`, without the upstream `smart-contract-verifier` sidecar and without the required verifier wiring env: + +- `MICROSERVICE_SC_VERIFIER_ENABLED=true` +- `MICROSERVICE_SC_VERIFIER_TYPE=sc_verifier` +- `MICROSERVICE_SC_VERIFIER_URL=http://smart-contract-verifier:8050/` + +**Recommended fix:** + +```bash +bash scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh --dry-run +bash scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh --apply +``` + +The script: +1. Backs up `/opt/blockscout/docker-compose.yml` +2. Adds the upstream `smart-contract-verifier` sidecar +3. Wires Blockscout to the sidecar with `MICROSERVICE_SC_VERIFIER_*` +4. Restarts the stack cleanly +5. Verifies `/api/v2/smart-contracts/verification/config` + +--- + ## Fix: Migrate VM 5000 to thin5 (has free space) **Run on Proxmox host r630-02 (192.168.11.12):** @@ -109,6 +135,8 @@ source smom-dbis-138/.env 2>/dev/null ./scripts/verify/run-contract-verification-with-proxy.sh ``` +**Important:** native `Uniswap v2` / `SushiSwap` verification should pin the exact historical compiler version. The repo submitter now does that explicitly so Forge defaults do not silently downgrade the verification attempt. + --- ## Forge Verification Compatibility diff --git a/docs/11-references/CONTRACT_VERIFICATION_AND_PUBLICATION_MATRIX_ALL_NETWORKS.md b/docs/11-references/CONTRACT_VERIFICATION_AND_PUBLICATION_MATRIX_ALL_NETWORKS.md index 83825abc..cce54a08 100644 --- a/docs/11-references/CONTRACT_VERIFICATION_AND_PUBLICATION_MATRIX_ALL_NETWORKS.md +++ b/docs/11-references/CONTRACT_VERIFICATION_AND_PUBLICATION_MATRIX_ALL_NETWORKS.md @@ -1,6 +1,6 @@ # Contract Verification And Publication Matrix (All Networks) -**Generated:** 2026-04-11T21:10:30.092Z +**Generated:** 2026-04-16T19:20:09.634Z **Authoritative sources:** `config/smart-contracts-master.json`, `cross-chain-pmm-lps/config/deployment-status.json` This matrix is the canonical repo-level inventory for **what still needs explorer verification and publication coverage across every network currently tracked in the workspace**. @@ -15,18 +15,18 @@ This matrix is the canonical repo-level inventory for **what still needs explore | Chain ID | Chain | Total Entries | Canonical Contracts | cW / Gas Mirrors | PMM Pools | Explorer | | --- | --- | ---: | ---: | ---: | ---: | --- | -| 1 | Ethereum Mainnet | 36 | 3 | 14 | 13 | https://etherscan.io | -| 10 | Optimism | 21 | 0 | 14 | 2 | https://optimistic.etherscan.io | -| 25 | Cronos | 19 | 0 | 14 | 2 | https://cronoscan.com | -| 56 | BSC | 18 | 0 | 16 | 0 | https://bscscan.com | -| 100 | Gnosis | 18 | 0 | 14 | 0 | https://gnosisscan.io | -| 137 | Polygon | 22 | 0 | 15 | 2 | https://polygonscan.com | +| 1 | Ethereum Mainnet | 40 | 3 | 14 | 17 | https://etherscan.io | +| 10 | Optimism | 31 | 0 | 14 | 12 | https://optimistic.etherscan.io | +| 25 | Cronos | 29 | 0 | 14 | 12 | https://cronoscan.com | +| 56 | BSC | 28 | 0 | 16 | 10 | https://bscscan.com | +| 100 | Gnosis | 28 | 0 | 14 | 10 | https://gnosisscan.io | +| 137 | Polygon | 32 | 0 | 15 | 12 | https://polygonscan.com | | 138 | Chain 138 | 115 | 115 | 0 | 0 | https://blockscout.defi-oracle.io | | 1111 | Wemix | 4 | 0 | 2 | 0 | https://explorer.wemix.com | -| 8453 | Base | 19 | 0 | 14 | 0 | https://basescan.org | -| 42161 | Arbitrum | 19 | 0 | 14 | 0 | https://arbiscan.io | -| 42220 | Celo | 19 | 0 | 16 | 0 | https://celoscan.io | -| 43114 | Avalanche | 19 | 0 | 16 | 0 | https://snowtrace.io | +| 8453 | Base | 29 | 0 | 14 | 10 | https://basescan.org | +| 42161 | Arbitrum | 29 | 0 | 14 | 10 | https://arbiscan.io | +| 42220 | Celo | 29 | 0 | 16 | 10 | https://celoscan.io | +| 43114 | Avalanche | 29 | 0 | 16 | 10 | https://snowtrace.io | ## Required operator path @@ -71,13 +71,17 @@ The JSON report in `reports/status/contract_verification_publish_matrix.json` co | 1 | Ethereum Mainnet | pmm_pool | cWCADC/USDC | `0xE0F35b5736FDd0a2F4B618621b0A08F8D8A3f92A` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWCHFC/USDC | `0x776Ca556deD3245984F504F4bef8Eeec55C50190` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWEURC/USDC | `0x0bC750F9c6DbDcd76B205695A356491b1B9ef098` | etherscan | inventory-only | https://etherscan.io | pending | pending | +| 1 | Ethereum Mainnet | pmm_pool | cWEURT/USDC | `0x9cF3DeDAaC0984c530801b9b4881c8f99Bb329c3` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWGBPC/USDC | `0x5488042dF882893a3e7074453E2005CaDE4101b0` | etherscan | inventory-only | https://etherscan.io | pending | pending | +| 1 | Ethereum Mainnet | pmm_pool | cWGBPT/USDC | `0xA42566bb730AD6D551Db32d50c0877132fc07c32` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWJPYC/USDC | `0x8A4187dF0A8FE855cC53A4F7B2D8346588Ee9794` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWUSDC/USDC | `0x69776fc607e9edA8042e320e7e43f54d06c68f0E` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWUSDC/USDT | `0xCC0fd27A40775c9AfcD2BBd3f7c902b0192c247A` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWUSDT/cWUSDC | `0xe944b7Cb012A0820c07f54D51e92f0e1C74168DB` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWUSDT/USDC | `0x27f3aE7EE71Be3d77bAf17d4435cF8B895DD25D2` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool | cWUSDT/USDT | `0x79156F6B7bf71a1B72D78189B540A89A6C13F6FC` | etherscan | inventory-only | https://etherscan.io | pending | pending | +| 1 | Ethereum Mainnet | pmm_pool | cWXAUC/USDC | `0xf6470219ce7749f8860dEABe9c347Ef2c1075E08` | etherscan | inventory-only | https://etherscan.io | pending | pending | +| 1 | Ethereum Mainnet | pmm_pool | cWXAUT/USDC | `0x1D51a38C924382287d770AbB61deb9C39ACa96E9` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool_volatile | cWUSDC/TRUU | `0x9A632F35078b6A4A9bf27806Bb7aFfAA2F16C846` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | pmm_pool_volatile | cWUSDT/TRUU | `0x508E5e80B66204b8CD9869323Fdd3A289ea50993` | etherscan | inventory-only | https://etherscan.io | pending | pending | | 1 | Ethereum Mainnet | reference_venue | balancer:cWETH/USDC | `0xba11000000000000000000000000000000000001` | etherscan | inventory-only | https://etherscan.io | pending | pending | @@ -99,8 +103,18 @@ The JSON report in `reports/status/contract_verification_publish_matrix.json` co | 10 | Optimism | cw_token | cWXAUC | `0xddc4063f770f7c49d00b5a10fb552e922aa39b2c` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | cw_token | cWXAUT | `0x145e8e8c49b6a021969dd9d2c01c8fea44374f61` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | gas_mirror | cWETHL2 | `0x95007ec50d0766162f77848edf7bdc4eba147fb4` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWAUDC/USDC | `0x4B452800f6cD50326F14a6f089f4bB04e8079250` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWCADC/USDC | `0x19e1fdd037F1651AcEE11c5A5Aa246b85FA63f8e` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWCHFC/USDC | `0xA97D7dfB93CBf0C10243931d93FFEda745222ec6` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWEURC/USDC | `0x78C6aC6D7CbFcd85A3291D656F2154979a92c00B` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWEURT/USDC | `0x631DfC86A03cB05319d7165198f8099dacF78e56` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWGBPC/USDC | `0x79BE2b70A94E954d095f9F537FAf0741D15dfA31` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWGBPT/USDC | `0x5D6b5d7CA165c39c350083255774DdBf1c858e12` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWJPYC/USDC | `0x68C1c8a945ddCF3482b73aC09b6B5D4177D564AF` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | pmm_pool | cWUSDC/USDC | `0x8F1038dE06d799a30D16d8B0b0ADEe629e7d4547` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | pmm_pool | cWUSDT/USDT | `0xFCB0b0Ac36d67EDBA91100c75C27De945357CD62` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWXAUC/USDC | `0xCE25c324e41049D75abfB81c23257984A2A97a79` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | +| 10 | Optimism | pmm_pool | cWXAUT/USDC | `0xb3Ee650019d7F756ce0F79b69614Fa2761871775` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | reference_venue | balancer:cWETHL2/USDC | `0xba2100000000000000000000000000000000000a` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | reference_venue | curve:cWETHL2/USDC | `0xc72100000000000000000000000000000000000a` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | | 10 | Optimism | reference_venue | uniswap_v3:cWETHL2/WETH | `0x712100000000000000000000000000000000000a` | etherscan-family | inventory-only | https://optimistic.etherscan.io | pending | pending | @@ -113,20 +127,6 @@ The JSON report in `reports/status/contract_verification_publish_matrix.json` co | 25 | Cronos | cw_token | cWEURC | `0x7574d37F42528B47c88962931e48FC61608a4050` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | | 25 | Cronos | cw_token | cWEURT | `0x9f833b4f1012F52eb3317b09922a79c6EdFca77D` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | | 25 | Cronos | cw_token | cWGBPC | `0xe5c65A76A541368d3061fe9E7A2140cABB903dbF` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | cw_token | cWGBPT | `0xBb58fa16bAc8E789f09C14243adEE6480D8213A2` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | cw_token | cWJPYC | `0x52aD62B8bD01154e2A4E067F8Dc4144C9988d203` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | cw_token | cWUSDC | `0x932566E5bB6BEBF6B035B94f3DE1f75f126304Ec` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | cw_token | cWUSDT | `0x72948a7a813B60b37Cd0c920C4657DbFF54312b8` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | cw_token | cWXAUC | `0xf1B771c95573113E993374c0c7cB2dc1a7908B12` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | cw_token | cWXAUT | `0xD517C0cF7013f988946A468c880Cc9F8e2A4BCbE` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | gas_mirror | cWCRO | `0x9b10eb0f77c45322dbd1fcb07176fd9a7609c164` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | pmm_pool | cWUSDC/USDC | `0x8F1038dE06d799a30D16d8B0b0ADEe629e7d4547` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | pmm_pool | cWUSDT/USDT | `0xFCB0b0Ac36d67EDBA91100c75C27De945357CD62` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 25 | Cronos | reference_venue | uniswap_v3:cWCRO/WCRO | `0x7161000000000000000000000000000000000019` | etherscan-family | inventory-only | https://cronoscan.com | pending | pending | -| 56 | BSC | anchor_token | USDT | `0x55d398326f99059fF775485246999027B3197955` | etherscan-family | reference-only | https://bscscan.com | pending | pending | -| 56 | BSC | cw_token | cWAUDC | `0x7062f35567BBAb4d98dc33af03B0d14Df42294D5` | etherscan-family | inventory-only | https://bscscan.com | pending | pending | -| 56 | BSC | cw_token | cWAUSDT | `0xe1a51Bc037a79AB36767561B147eb41780124934` | etherscan-family | inventory-only | https://bscscan.com | pending | pending | -| 56 | BSC | cw_token | cWBTC | `0xcb7c000000000000000000000000000000000038` | etherscan-family | inventory-only | https://bscscan.com | pending | pending | ## Notes diff --git a/docs/11-references/EXPLORER_TOKEN_LIST_CROSSCHECK.md b/docs/11-references/EXPLORER_TOKEN_LIST_CROSSCHECK.md index 464ad6ea..d320e870 100644 --- a/docs/11-references/EXPLORER_TOKEN_LIST_CROSSCHECK.md +++ b/docs/11-references/EXPLORER_TOKEN_LIST_CROSSCHECK.md @@ -1,6 +1,6 @@ # Explorer Token List Cross-Check -**Last Updated:** 2026-04-02 +**Last Updated:** 2026-04-14 **Purpose:** Cross-check the token list shown at [https://explorer.d-bis.org/tokens](https://explorer.d-bis.org/tokens) against repo token lists, canonical addresses, and CONTRACT_ADDRESSES_REFERENCE. --- @@ -89,6 +89,7 @@ and use `dbis-138.tokenlist.json` as the curated source. See §9. | LINK (0xb7721d…) | Yes | Match | | cUSDT (0x93E6…) | Yes | Match | | cUSDC (0xf22258…) | Yes | Match | +| cUSDT V2, cUSDC V2, mirror USDT/USDC | Yes | Match §5; list uses tag **`fwdcanon`** (Uniswap schema tag length); gas rows use **`gasnative`** | | cEURC (0x808596…) | Yes | Match | **Historical gap (closed 2026-02-28):** @@ -96,7 +97,7 @@ cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT were initially mis ### 3.2 `explorer-monorepo/backend/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json` -Chain 138 entries were originally the same 7 as `dbis-138`, but the additional compliant tokens were added on 2026-02-28. Keep this file focused on live Explorer cross-checks rather than the closed token-list gap. +Chain 138 entries were originally the same 7 as `dbis-138`, but the additional compliant tokens were added on 2026-02-28. **cUSDT/cUSDC V2** and **official mirror USDT/USDC** (D3) are now part of the canonical set in **§5** and appear in `DUAL_CHAIN_TOKEN_LIST`; keep `dbis-138.tokenlist.json` aligned with §5 for packaging parity. Keep this file focused on live Explorer cross-checks rather than the closed token-list gap. ### 3.3 `ADDRESS_MATRIX_AND_STATUS.md` / `CONTRACT_ADDRESSES_REFERENCE.md` @@ -110,9 +111,9 @@ All **canonical** Chain 138 token addresses (WETH, WETH10, LINK, cUSDT, cUSDC, c |------|--------|----------------| | **Explorer token list source** | Confirmed: Blockscout `GET /api/v2/tokens` | No change; document only. | | **WETH9 on Blockscout** | First token has `decimals: "0"`, `name`/`symbol`: null | Verify WETH9 contract metadata on-chain; fix in contract or in Blockscout indexing if needed. | -| **dbis-138.tokenlist.json** | Done (2026-02-28) | Added cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT. | -| **DUAL_CHAIN_TOKEN_LIST (MetaMask)** | Done (2026-02-28) | Added same 9 tokens to backend and api/rest copies. | -| **ADDRESS_MATRIX / docs** | Done | cEURT and all 16 tokens in §1.1; TransactionMirror 0x7131…; summary updated. | +| **dbis-138.tokenlist.json** | Done (2026-02-28; mirrors 2026-04-14) | Added cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT; **official mirror USDT/USDC** per §5. | +| **DUAL_CHAIN_TOKEN_LIST (MetaMask)** | Done (2026-02-28) | Added same 9 tokens to backend and api/rest copies; **V2 + mirrors** tracked in §5 / DUAL. | +| **ADDRESS_MATRIX / docs** | Done | cEURT and **§1.1 / §5** token inventory; TransactionMirror 0x7131…; summary updated. | | **Extra LINK/cUSDT/cUSDC on Blockscout** | 6 additional contracts | Non-canonical; use §5 canonical addresses only. | --- @@ -128,6 +129,10 @@ Use this table to align token lists and docs with the Explorer (Blockscout) and | LINK | `0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03` | 18 | | cUSDT | `0x93E66202A11B1772E55407B32B44e5Cd8eda7f22` | 6 | | cUSDC | `0xf22258f57794CC8E06237084b353Ab30fFfa640b` | 6 | +| cUSDT V2 | `0x9FBfab33882Efe0038DAa608185718b772EE5660` | 6 | +| cUSDC V2 | `0x219522c60e83dEe01FC5b0329d6fA8fD84b9D13d` | 6 | +| USDT (official mirror, D3) | `0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1` | 6 | +| USDC (official mirror, D3) | `0x71D6687F38b93CCad569Fa6352c876eea967201b` | 6 | | cEURC | `0x8085961F9cF02b4d800A3c6d386D31da4B34266a` | 6 | | cEURT | `0xdf4b71c61E5912712C1Bdd451416B9aC26949d72` | 6 | | cGBPC | `0x003960f16D9d34F2e98d62723B6721Fb92074aD2` | 6 | @@ -154,7 +159,7 @@ Use this table to align token lists and docs with the Explorer (Blockscout) and | `explorer-monorepo/backend/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json` | Multi-chain token list (138, 1, 651940, 25) for MetaMask | | `token-lists/lists/dbis-138.tokenlist.json` | Chain 138 curated token list (Uniswap-style) | | `smom-dbis-138/services/token-aggregation/src/config/canonical-tokens.ts` | Canonical addresses and env overrides for indexing/reporting | -| `docs/11-references/ADDRESS_MATRIX_AND_STATUS.md` | Correlated address matrix; §1.1 includes all 16 tokens; TransactionMirror and summary updated | +| `docs/11-references/ADDRESS_MATRIX_AND_STATUS.md` | Correlated address matrix; §1.1 aligned with **§5** canonical rows; TransactionMirror and summary updated | --- diff --git a/docs/11-references/PMM_DEX_ROUTING_STATUS.md b/docs/11-references/PMM_DEX_ROUTING_STATUS.md index 0cd35ee5..05de4c98 100644 --- a/docs/11-references/PMM_DEX_ROUTING_STATUS.md +++ b/docs/11-references/PMM_DEX_ROUTING_STATUS.md @@ -76,7 +76,7 @@ | **DODO Vending Machine / Adapter** | Deployed | `0xb6D9EF3575bc48De3f011C310DC24d87bEC6087C` — adapter used by `DODOPMMIntegration`. | | **PMM pools (current canonical stack)** | 3 created | Public pools are `0x9e89bAe009adf128782E19e8341996c596ac40dC` (cUSDT/cUSDC), `0x866Cb44b59303d8dc5f4F9E3E7A8e8b0bf238d66` (cUSDT/USDT), `0xc39B7D0F40838cbFb54649d327f49a6DAC964062` (cUSDC/USDC). | | **DODOPMMProvider** | **Deployed** | `0x3f729632E9553EBacCdE2e9b4c8F2B285b014F2e`; supports the three canonical stable pools above. | -| **D3Oracle** | Deployed (private pilot) | `0xD7459aEa8bB53C83a1e90262777D730539A326F0`; `WETH10` now uses live `Oracle_Aggregator=0x99b3511a2d315a497c8112c1fdd8d508d4b1e506`, and the stable assets use dedicated managed USD feeds. | +| **D3Oracle** | Deployed (private pilot) | `0xD7459aEa8bB53C83a1e90262777D730539A326F0`; `WETH10` uses keeper-synced **MockPriceFeed** `0x3e8725b8De386feF3eFE5678c92eA6aDB41992B2` (avoids managed-aggregator staleness on Besu). Legacy slot `0x99b3511a2d315a497c8112c1fdd8d508d4b1e506` remains for audits. Stables use managed USD feeds. | | **D3Vault / D3Proxy / D3MMFactory** | Deployed (private pilot) | `D3Vault=0x42b6867260Fb9eE6d09B7E0233A1fAD65D0133D1`, `D3Proxy=0xc9a11abB7C63d88546Be24D58a6d95e3762cB843`, `D3MMFactory=0x78470C7d2925B6738544E2DD4FE7c07CcA21AC31`. | | **D3MM pools** | 2 created | `0xE71Bc2cCb62dA5B18F88647db2b4a721Db416fc5` is a superseded bootstrap pool on the placeholder `WETH9` path. `0x6550A3a59070061a262a893A1D6F3F490afFDBDA` is the canonical private `WETH10` pilot pool. | | **EnhancedSwapRouterV2 + public venue layer** | Live | Router-v2 is deployed and the canonical upstream-native `Uniswap_v3` lane plus the funded pilot-compatible `Balancer`, `Curve_3`, and `1inch` venues are publicly exposed for the canonical Chain 138 routing asset lanes. | diff --git a/forge-verification-proxy/server.js b/forge-verification-proxy/server.js index 843e478a..02aab990 100644 --- a/forge-verification-proxy/server.js +++ b/forge-verification-proxy/server.js @@ -17,6 +17,25 @@ import http from 'node:http'; const PORT = parseInt(process.env.PORT || '3080', 10); const BLOCKSCOUT_URL = (process.env.BLOCKSCOUT_URL || 'http://192.168.11.140:4000').replace(/\/$/, ''); +function parseOptimizationRuns(payload) { + const raw = payload.runs ?? payload.optimization_runs ?? '200'; + return parseInt(raw, 10) || 200; +} + +function inferOptimizationEnabled(payload) { + const explicit = payload.optimizationUsed ?? payload.optimization_used; + if (explicit !== undefined && explicit !== null && explicit !== '') { + return [true, '1', 1, 'true'].includes(explicit); + } + // Forge often supplies runs without optimizationUsed for legacy compiler paths. + // When runs is positive, assume optimization was intentionally enabled. + return parseOptimizationRuns(payload) > 0; +} + +function inferEvmVersion(payload) { + return payload.evmversion || payload.evm_version || 'default'; +} + /** Parse body as JSON or application/x-www-form-urlencoded (Forge/Etherscan style). */ function parseBody(req) { return new Promise((resolve, reject) => { @@ -123,9 +142,9 @@ async function forwardV2Flattened(payload) { compiler_version: payload.compilerversion || payload.compilerVersion || 'v0.8.20+commit.a1b79de6', contract_name: payload.contractname || payload.contractName || 'Contract', license_type: payload.licensetype || payload.licenseType || 'mit', - is_optimization_enabled: [true, '1', 1, 'true'].includes(payload.optimizationUsed ?? payload.optimization_used), - optimization_runs: parseInt(payload.runs ?? payload.optimization_runs ?? '200', 10) || 200, - evm_version: payload.evmversion || payload.evm_version || 'london', + is_optimization_enabled: inferOptimizationEnabled(payload), + optimization_runs: parseOptimizationRuns(payload), + evm_version: inferEvmVersion(payload), autodetect_constructor_args: payload.autodetectConstructorArguments !== false, source_code: typeof sourceCode === 'string' ? sourceCode : JSON.stringify(sourceCode), }; @@ -206,13 +225,9 @@ async function forwardV2StandardInput(payload) { appendField('autodetect_constructor_args', String(payload.autodetectConstructorArguments !== false)); appendField('license_type', licenseType); appendField('constructor_args', constructorArgs); - if (payload.evmversion || payload.evm_version) appendField('evm_version', payload.evmversion || payload.evm_version); - if (payload.optimizationUsed !== undefined || payload.optimization_used !== undefined) { - appendField('is_optimization_enabled', String([true, '1', 1, 'true'].includes(payload.optimizationUsed ?? payload.optimization_used))); - } - if (payload.runs !== undefined || payload.optimization_runs !== undefined) { - appendField('optimization_runs', String(parseInt(payload.runs ?? payload.optimization_runs ?? '200', 10) || 200)); - } + appendField('evm_version', inferEvmVersion(payload)); + appendField('is_optimization_enabled', String(inferOptimizationEnabled(payload))); + appendField('optimization_runs', String(parseOptimizationRuns(payload))); appendFile('files[0]', 'standard-input.json', standardJson, 'application/json'); parts.push(Buffer.from(`--${boundary}--\r\n`)); const body = Buffer.concat(parts); @@ -254,7 +269,15 @@ function toEtherscanResponse(result) { return { status: '1', message: data.message || 'OK', result: data.result ?? 'Verification submitted' }; } if (status >= 200 && status < 300) { - return { status: '1', message: 'OK', result: data?.result ?? 'Verification submitted' }; + const successMessage = typeof data?.message === 'string' ? data.message : ''; + const successResult = typeof data?.result === 'string' ? data.result : ''; + if ( + /verification started/i.test(successMessage) || + /verification submitted/i.test(successMessage) || + /verification submitted/i.test(successResult) + ) { + return { status: '1', message: successMessage || 'OK', result: successResult || 'Verification submitted' }; + } } // Blockscout may return HTML (502/500) or invalid JSON when DB/migrations fail let msg = data?.message || data?.error; diff --git a/reports/status/contract_verification_publish_matrix.json b/reports/status/contract_verification_publish_matrix.json index e9633ee2..46afb0d7 100644 --- a/reports/status/contract_verification_publish_matrix.json +++ b/reports/status/contract_verification_publish_matrix.json @@ -1,10 +1,11 @@ { - "generatedAt": "2026-04-11T21:10:30.092Z", + "generatedAt": "2026-04-16T19:20:09.634Z", "sources": [ "config/smart-contracts-master.json", - "cross-chain-pmm-lps/config/deployment-status.json" + "cross-chain-pmm-lps/config/deployment-status.json", + "config/publication-status-overrides.json" ], - "entryCount": 329, + "entryCount": 423, "entries": [ { "verificationStatus": "pending", @@ -438,6 +439,24 @@ "automation": "inventory-only", "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0x9cF3DeDAaC0984c530801b9b4881c8f99Bb329c3", + "chainId": "1", + "chainName": "Ethereum Mainnet", + "explorer": "https://etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan", + "publishSurface": "Etherscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -456,6 +475,24 @@ "automation": "inventory-only", "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0xA42566bb730AD6D551Db32d50c0877132fc07c32", + "chainId": "1", + "chainName": "Ethereum Mainnet", + "explorer": "https://etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan", + "publishSurface": "Etherscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -564,6 +601,42 @@ "automation": "inventory-only", "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0xf6470219ce7749f8860dEABe9c347Ef2c1075E08", + "chainId": "1", + "chainName": "Ethereum Mainnet", + "explorer": "https://etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan", + "publishSurface": "Etherscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0x1D51a38C924382287d770AbB61deb9C39ACa96E9", + "chainId": "1", + "chainName": "Ethereum Mainnet", + "explorer": "https://etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan", + "publishSurface": "Etherscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -942,6 +1015,150 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0x4B452800f6cD50326F14a6f089f4bB04e8079250", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0x19e1fdd037F1651AcEE11c5A5Aa246b85FA63f8e", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0xA97D7dfB93CBf0C10243931d93FFEda745222ec6", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0x78C6aC6D7CbFcd85A3291D656F2154979a92c00B", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0x631DfC86A03cB05319d7165198f8099dacF78e56", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0x79BE2b70A94E954d095f9F537FAf0741D15dfA31", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0x5D6b5d7CA165c39c350083255774DdBf1c858e12", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0x68C1c8a945ddCF3482b73aC09b6B5D4177D564AF", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -978,6 +1195,42 @@ "automation": "inventory-only", "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0xCE25c324e41049D75abfB81c23257984A2A97a79", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0xb3Ee650019d7F756ce0F79b69614Fa2761871775", + "chainId": "10", + "chainName": "Optimism", + "explorer": "https://optimistic.etherscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Optimism explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -1320,6 +1573,150 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDT", + "address": "0x5b5fA8664FC1eb630b2D76deAf57Dd35ef326eAE", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDT", + "address": "0xFFe56BE4628f2863Cd7c38d3fFa70d6A3255FBD3", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDT", + "address": "0x937E86f21007C15F28081DBD419ea39ef5bc87F2", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDT", + "address": "0xbe68d6ae47049ce0EA5B6a82AB1c388f4023aec8", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDT", + "address": "0xE3bb64f8F05dB65C9bb1103f5D7C445C402161Ec", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDT", + "address": "0xDa60b22cDb3D3Ec67c309457Bd50C4e67D4611a4", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDT", + "address": "0x1935d14D513E158D630488f2D20Cd28CFe23aAe6", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDT", + "address": "0x97fD4E88490D8c4bcbe1930Cece12e8DD22529bE", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -1356,6 +1753,42 @@ "automation": "inventory-only", "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDT", + "address": "0xAA450B4Cf4EEc28C440850665546D85C67b4B2A6", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDT", + "address": "0x8B11f71C0ABF2f8031c47cFd20d22b2ab2799183", + "chainId": "25", + "chainName": "Cronos", + "explorer": "https://cronoscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Cronoscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -1680,6 +2113,186 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDT", + "address": "0x85E2C97a931D1e5Ed31F4D6cb4094fB036AE4ED4", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDT", + "address": "0xE193bd2f602CaC833330c6835f934f3958a7785b", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDT", + "address": "0x02F70D646B57439faF5dF1B16d2B174Ee2A9F373", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDT", + "address": "0xaF1EA2c0105C90C819849FBFE931D61a11De4793", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDT", + "address": "0x6b97090c974eCAf77dC4e390B044F87Ec71f5fA1", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDT", + "address": "0x5e19913eDaAcaB436AbF635e58f2453323cB2CB3", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDT", + "address": "0x439C447b4FDa58fcAF587F0A042662A46029dC7c", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDT", + "address": "0xBEceD3b25448F648a36Fa9dd6D17a68CB6e61f36", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDT", + "address": "0xe9306557758c19cb8FbeEb4777dc7b14f251f67c", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDT", + "address": "0xfB094EC50d932bCD004E4136EfB62119c0f576E1", + "chainId": "56", + "chainName": "BSC", + "explorer": "https://bscscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "BscScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -1968,6 +2581,186 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0xeb5A688dF70be2F790719872Be9Ecc5648aEE460", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0x45177D998F4022aeaa046C60e734aEf8c18aCb70", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0x9ff24E16c5687330c271a52655971c7C2498FaC8", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0x8c8d6cc14111443Ef8572D58Df387a1E497b7C43", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0xB73e4C13757EE99540A1F0e973980E423987De19", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0xf060E1B29FF714f5Ac89F8Bd3869cF300C5b387f", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0x3adB3fB8451727fDEBe3D00617170dAF3725F6B4", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0xe11936EcE13B5f04156898a510B86493F2862042", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0x02BE3C506FD5541c8225dB43C6FFC5a39ADd803E", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0x7069d10A0E4496D0CEa08Ff27EaE9de0BB7D0d23", + "chainId": "100", + "chainName": "Gnosis", + "explorer": "https://gnosisscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Gnosis explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -2328,6 +3121,150 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0xbD34966FE5Eed81AFffF8081e9BB527Fc8066783", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0xc79da1E8B33E580d53C683923685B26FFC653650", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0x30dAeF9a8Dd4aEc2949013Fe18b5Ab3C2505D825", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0x0c6F5D3d8d52cBC52849327F6eC6aE52C8497A8D", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0x36aB6bef2B3335ebf6a762665978bf5e845FDEC0", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0x7a95f67E31f271A6a83219d8368D963Ee2fC106B", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0xC3645c7153b7B72556e322aA1E72D77536d9A3DE", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0x09658d8d81aa8fa7a21eD973787638f245bc3fe0", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -2364,6 +3301,42 @@ "automation": "inventory-only", "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0x3c3b9Bd130fB3aBcC0E0CE6552795DD56BCCc55c", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0x37D5587Bbe17571cDe96DAB7b2e7EA234C87f525", + "chainId": "137", + "chainName": "Polygon", + "explorer": "https://polygonscan.com", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "PolygonScan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -4848,6 +5821,186 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0xE450F94Dc06036aa80055Db298948C6692819545", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0x5E7448AA0e3172AEFE79439E14F7E59bc1C858E0", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0x0673Fa737f813Af2e37A0ae2CBCf7E225498ed6a", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0x72E6D93E9aF317321DF763a34068178c773FdA50", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0x51c2C4Dd1fc54E20207D0732f12802B33e0E2251", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0x5b8B474659A5BA675E74Ef364CcF559C53071B5b", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0xD035e0a6b82cDd9653261DC8259a3dbA1cF02C14", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0x64D91B738026fE1577773F3F36063d16C834F042", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0xb47776505B8E2bFC63197Cf2133857CD91e7abBb", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0xE1C2bC36438B29E3b5092C0cB80531199874080D", + "chainId": "8453", + "chainName": "Base", + "explorer": "https://basescan.org", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Basescan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -5190,6 +6343,186 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0x97f78713f5899a652d955B996BAb99E2CbbEcC5c", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0x6D3b55935F58b9433fc26743cd9E0F8963a4F6D8", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0x88437Cd15CB6b07Fd8cC9830f1b8fFf50275e691", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0x34c3Ae728a985Fd27f1887474bCf4e52847Cbb2c", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0xEEE8C51107aE64824c4a08a502202fA3E6213702", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0xFBa6D6d1471302Bf28CE7d94Be33f034b95d9AD0", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0xDcA29dfa59C8faF90e4437DEAe74474F78735cDe", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0xB6eaF7cEB4A6e9Bc6A57fEb51011B6Bb01632C1F", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0x41e67b8b5929e44C2b7A0D772E151FAD8D5303cd", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0xB6b15Ba233C95d164504e24209C1fAc3304059C7", + "chainId": "42161", + "chainName": "Arbitrum", + "explorer": "https://arbiscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Arbiscan + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -5550,6 +6883,206 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0xA9EC7819a009d05B16907FEC96426ed35D5fa0e3", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0xBB7f2A2360eC02CaFe433d8b6D8BB7a418B2342f", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0xfD8E36E2a4A462A33b5faF18DF927d3FA19daaEa", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0x0Bb6fCd38D5CeB702d4B359159dE7734619c5c32", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0x0d7a90CA1FfFC3Fa6F1A12D38c34F2628D8F6b4e", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0xd0dC102c96AF36f4a99DA435bE4Ee4758E5B3cf2", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0x4f87cf23f503810253fac18aEd5797bE04A88CEC", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0x15Db8FD5bAAb52511c7dF94d793AFe7d1dad06d0", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0xa9d3fdE50A5843682A9477E5DF7643D273ae36C9", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, + { + "verificationStatus": "verified", + "publicationStatus": "published", + "publishRequirement": "Verified on explorer and reconciled in repo inventory", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0x2900a6FA8Cef1bd5e6511172dc8580ECa6eE316b", + "chainId": "42220", + "chainName": "Celo", + "explorer": "https://celoscan.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Celo explorer + repo inventory/token maps", + "verificationScript": "", + "automation": "repo-supported", + "publishNotes": "Wave 1 PMM pool; explorer verified as DVM on Celo and repo deployment inventory is aligned", + "overrideReason": "Explorer-verified Celo Wave 1 pool closure", + "overrideEvidence": "Wave 1 closure report live explorer probe shows DVM verified on Celoscan" + }, { "verificationStatus": "pending", "publicationStatus": "pending", @@ -5892,6 +7425,186 @@ "automation": "inventory-only", "publishNotes": "Gas-family mirror token; verify on explorer and keep gas rollout inventory aligned" }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWAUDC/USDC", + "address": "0x287edaBDA35195592d7CACe2C1A75eC66caF1D70", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCADC/USDC", + "address": "0x75Ec85467927512b01C9e0481Fb1902d2d7210dC", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWCHFC/USDC", + "address": "0x3a224eae91ac813a03E15d0c37B641bC6c2237d7", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURC/USDC", + "address": "0xEE2742Fa6f70A40aB16c9b613c5cF6933bA92Cc3", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWEURT/USDC", + "address": "0x8507F3F3cB121072c1e3f2D912d269CA9829eEF8", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPC/USDC", + "address": "0x73542F7B1CBd4552Eb8FeFEB3D1884527424da58", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWGBPT/USDC", + "address": "0xa07dEe884555f2E9D04d0039FEF0b746987a8441", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWJPYC/USDC", + "address": "0x6175D065c602dab71A03753987D1ebEc99eFcC2e", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUC/USDC", + "address": "0x5d3a4A3Dae9FEcFe979A784F55d994c9a9fBeAfB", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, + { + "verificationStatus": "pending", + "publicationStatus": "pending", + "publishRequirement": "Verify source on chain explorer and keep repo inventories/token maps aligned", + "sourceRegistry": "cross-chain-pmm-lps/config/deployment-status.json", + "contractType": "pmm_pool", + "label": "cWXAUT/USDC", + "address": "0x1392bb9f23F938E6c1cDaAAE5c45d29BE5f8C828", + "chainId": "43114", + "chainName": "Avalanche", + "explorer": "https://snowtrace.io", + "explorerAlt": "", + "verifierKind": "etherscan-family", + "publishSurface": "Snowtrace + repo inventory/token maps", + "verificationScript": "", + "automation": "inventory-only", + "publishNotes": "PMM pool (public_routing); verify source if custom deployment and keep routing inventory aligned" + }, { "verificationStatus": "pending", "publicationStatus": "pending", diff --git a/scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh b/scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh new file mode 100755 index 00000000..ba999837 --- /dev/null +++ b/scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh @@ -0,0 +1,171 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Enable the upstream Blockscout smart-contract verifier sidecar on CT 5000 and +# wire Blockscout to use it. +# +# Usage: +# bash scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh --dry-run +# bash scripts/deployment/ensure-blockscout-smart-contract-verifier-5000.sh --apply + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +if [[ -f "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" ]]; then + # shellcheck source=/dev/null + source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" +fi + +HOST="${PROXMOX_HOST_R630_02:-192.168.11.12}" +VMID="${BLOCKSCOUT_DB_CT_VMID:-5000}" +APPLY=0 + +while [[ $# -gt 0 ]]; do + case "$1" in + --apply) APPLY=1; shift ;; + --dry-run) APPLY=0; shift ;; + *) + echo "Unknown argument: $1" >&2 + exit 1 + ;; + esac +done + +read -r -d '' REMOTE_SCRIPT <<'EOF_REMOTE' || true +set -euo pipefail +cd /opt/blockscout + +stamp="$(date +%Y%m%d_%H%M%S)" +cp docker-compose.yml "docker-compose.yml.bak.${stamp}.pre_verifier" + +cat > smart-contract-verifier.env <<'EOF_VERIFIER' +SMART_CONTRACT_VERIFIER__SERVER__HTTP__ENABLED=true +SMART_CONTRACT_VERIFIER__SERVER__HTTP__ADDR=0.0.0.0:8050 +SMART_CONTRACT_VERIFIER__SERVER__HTTP__MAX_BODY_SIZE=8388608 +SMART_CONTRACT_VERIFIER__SERVER__GRPC__ENABLED=false +SMART_CONTRACT_VERIFIER__SERVER__GRPC__ADDR=0.0.0.0:8051 +SMART_CONTRACT_VERIFIER__SOLIDITY__ENABLED=true +SMART_CONTRACT_VERIFIER__SOLIDITY__COMPILERS_DIR=/tmp/solidity-compilers +SMART_CONTRACT_VERIFIER__SOLIDITY__REFRESH_VERSIONS_SCHEDULE=0 0 * * * * * +SMART_CONTRACT_VERIFIER__SOLIDITY__FETCHER__LIST__LIST_URL=https://binaries.soliditylang.org/linux-amd64/list.json +SMART_CONTRACT_VERIFIER__VYPER__ENABLED=true +SMART_CONTRACT_VERIFIER__VYPER__COMPILERS_DIR=/tmp/vyper-compilers +SMART_CONTRACT_VERIFIER__VYPER__REFRESH_VERSIONS_SCHEDULE=0 0 * * * * * +SMART_CONTRACT_VERIFIER__VYPER__FETCHER__LIST__LIST_URL=https://raw.githubusercontent.com/blockscout/solc-bin/main/vyper.list.json +SMART_CONTRACT_VERIFIER__SOURCIFY__ENABLED=true +SMART_CONTRACT_VERIFIER__SOURCIFY__API_URL=https://sourcify.dev/server/ +SMART_CONTRACT_VERIFIER__SOURCIFY__VERIFICATION_ATTEMPTS=3 +SMART_CONTRACT_VERIFIER__SOURCIFY__REQUEST_TIMEOUT=10 +SMART_CONTRACT_VERIFIER__METRICS__ENABLED=false +SMART_CONTRACT_VERIFIER__JAEGER__ENABLED=false +EOF_VERIFIER + +cat > docker-compose.yml <<'EOF_COMPOSE' +version: "3.8" + +services: + postgres: + image: postgres:15-alpine + container_name: blockscout-postgres + environment: + POSTGRES_USER: blockscout + POSTGRES_PASSWORD: blockscout + POSTGRES_DB: blockscout + volumes: + - postgres-data:/var/lib/postgresql/data + restart: unless-stopped + networks: + - blockscout-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U blockscout"] + interval: 10s + timeout: 5s + retries: 5 + + smart-contract-verifier: + image: ghcr.io/blockscout/smart-contract-verifier:latest + container_name: smart-contract-verifier + env_file: + - ./smart-contract-verifier.env + restart: unless-stopped + networks: + - blockscout-network + + blockscout: + image: blockscout/blockscout:latest + container_name: blockscout + command: bin/blockscout start + depends_on: + postgres: + condition: service_healthy + smart-contract-verifier: + condition: service_started + environment: + - DISABLE_WEBAPP=false + - DISABLE_INDEXER=false + - INDEXER_DISABLE_PENDING_TRANSACTIONS_FETCHER=true + - DATABASE_URL=postgresql://blockscout:blockscout@postgres:5432/blockscout?sslmode=disable + - ETHEREUM_JSONRPC_HTTP_URL=http://192.168.11.221:8545 + - ETHEREUM_JSONRPC_WS_URL=ws://192.168.11.221:8546 + - ETHEREUM_JSONRPC_TRACE_URL=http://192.168.11.221:8545 + - ETHEREUM_JSONRPC_VARIANT=besu + - CHAIN_ID=138 + - COIN=ETH + - BLOCKSCOUT_HOST=explorer.d-bis.org + - BLOCKSCOUT_PROTOCOL=https + - SECRET_KEY_BASE=73159c7d10b9a5a75ddf10710773078c078bf02124d35b72fa2a841b30b4f88c7c43e5caaf7f9f7f87d16dd66e7870931ae11039c428d1dedae187af762531fa + - POOL_SIZE=50 + - POOL_SIZE_API=50 + - DATABASE_QUEUE_TARGET=5s + - ECTO_USE_SSL=false + - MICROSERVICE_SC_VERIFIER_ENABLED=true + - MICROSERVICE_SC_VERIFIER_TYPE=sc_verifier + - MICROSERVICE_SC_VERIFIER_URL=http://smart-contract-verifier:8050/ + ports: + - "4000:4000" + volumes: + - blockscout-data:/app/apps/explorer/priv/static + restart: unless-stopped + networks: + - blockscout-network + +volumes: + postgres-data: + blockscout-data: + +networks: + blockscout-network: + driver: bridge +EOF_COMPOSE + +docker pull ghcr.io/blockscout/smart-contract-verifier:latest +docker rm -f blockscout 2>/dev/null || true +docker rm -f smart-contract-verifier 2>/dev/null || true +# Older docker-compose v1 can leave an orphaned auto-generated verifier container +# that breaks recreation with a `ContainerConfig` KeyError. Clear it first. +docker ps -a --format '{{.Names}}' | grep -E 'smart-contract-verifier$' | xargs -r docker rm -f + +if command -v docker-compose >/dev/null 2>&1; then + docker-compose -f docker-compose.yml up -d +else + docker compose -f docker-compose.yml up -d +fi + +sleep 10 +docker ps --format "table {{.Names}}\t{{.Status}}" +curl -fsS http://127.0.0.1:4000/api/v2/smart-contracts/verification/config >/dev/null +EOF_REMOTE + +echo "Blockscout smart-contract verifier enablement" +echo "Host: ${HOST}" +echo "VMID: ${VMID}" +echo + +if (( APPLY == 0 )); then + echo "[dry-run] Would patch /opt/blockscout/docker-compose.yml on CT ${VMID}, add smart-contract-verifier, and restart Blockscout." + exit 0 +fi + +ssh root@"${HOST}" "pct exec ${VMID} -- bash -lc $(printf '%q' "${REMOTE_SCRIPT}")" +echo +echo "[ok] Blockscout verifier sidecar enabled on CT ${VMID}." diff --git a/scripts/verify/verify-chain138-native-v2-blockscout.sh b/scripts/verify/verify-chain138-native-v2-blockscout.sh new file mode 100755 index 00000000..2201ac6b --- /dev/null +++ b/scripts/verify/verify-chain138-native-v2-blockscout.sh @@ -0,0 +1,224 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Verify the Chain 138 native Uniswap v2 and SushiSwap deployments on Blockscout. +# +# Usage: +# bash scripts/verify/verify-chain138-native-v2-blockscout.sh +# bash scripts/verify/verify-chain138-native-v2-blockscout.sh --status-only +# bash scripts/verify/verify-chain138-native-v2-blockscout.sh --only UniswapV2Factory,SushiSwapRouter + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" +SMOM_ROOT="${PROJECT_ROOT}/smom-dbis-138" + +if [[ -f "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" ]]; then + # shellcheck source=/dev/null + source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" +fi + +command -v forge >/dev/null 2>&1 || { echo "ERROR: forge not found"; exit 1; } +command -v node >/dev/null 2>&1 || { echo "ERROR: node not found"; exit 1; } +command -v cast >/dev/null 2>&1 || { echo "ERROR: cast not found"; exit 1; } +command -v jq >/dev/null 2>&1 || { echo "ERROR: jq not found"; exit 1; } +command -v curl >/dev/null 2>&1 || { echo "ERROR: curl not found"; exit 1; } + +RPC_URL="${RPC_URL_138:-${CHAIN138_RPC_URL:-http://192.168.11.211:8545}}" +BLOCKSCOUT_URL="${CHAIN138_BLOCKSCOUT_INTERNAL_URL:-http://${IP_BLOCKSCOUT:-192.168.11.140}:4000}" +BLOCKSCOUT_API_BASE="${CHAIN138_BLOCKSCOUT_API_BASE:-${BLOCKSCOUT_URL}/api/v2}" +BLOCKSCOUT_PUBLIC_API_BASE="${CHAIN138_BLOCKSCOUT_PUBLIC_API_BASE:-https://explorer.d-bis.org/api/v2}" +VERIFIER_PORT="${FORGE_VERIFIER_PROXY_PORT:-3080}" +FORGE_VERIFIER_URL="${FORGE_VERIFIER_URL:-http://127.0.0.1:${VERIFIER_PORT}/api}" + +UNISWAP_JSON="${SMOM_ROOT}/deployments/chain138/uniswap-v2-native.json" +SUSHI_JSON="${SMOM_ROOT}/deployments/chain138/sushiswap-native.json" + +ONLY_LIST="" +STATUS_ONLY=0 +PROXY_PID="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --only) ONLY_LIST="${2:-}"; shift 2 ;; + --status-only) STATUS_ONLY=1; shift ;; + *) + echo "Unknown argument: $1" >&2 + exit 1 + ;; + esac +done + +cleanup_proxy() { + [[ -n "${PROXY_PID:-}" ]] && kill "${PROXY_PID}" 2>/dev/null || true +} +trap cleanup_proxy EXIT + +should_handle() { + local name="$1" + [[ -n "${ONLY_LIST}" ]] && [[ ",${ONLY_LIST}," != *",${name},"* ]] && return 1 + return 0 +} + +log() { printf '%s\n' "$*"; } +ok() { printf '[ok] %s\n' "$*"; } +warn() { printf '[warn] %s\n' "$*" >&2; } +fail() { printf '[fail] %s\n' "$*" >&2; exit 1; } + +proxy_listening() { + if command -v nc >/dev/null 2>&1; then + nc -z -w 2 127.0.0.1 "${VERIFIER_PORT}" 2>/dev/null + else + timeout 2 bash -c "echo >/dev/tcp/127.0.0.1/${VERIFIER_PORT}" 2>/dev/null + fi +} + +start_proxy_if_needed() { + if proxy_listening; then + ok "Forge verification proxy already listening on ${VERIFIER_PORT}." + return 0 + fi + + log "Starting forge verification proxy on ${VERIFIER_PORT} -> ${BLOCKSCOUT_URL}" + PORT="${VERIFIER_PORT}" BLOCKSCOUT_URL="${BLOCKSCOUT_URL}" node "${PROJECT_ROOT}/forge-verification-proxy/server.js" >/tmp/chain138-native-v2-blockscout-proxy.log 2>&1 & + PROXY_PID=$! + sleep 2 + proxy_listening || fail "Forge verification proxy failed to start. See /tmp/chain138-native-v2-blockscout-proxy.log" +} + +has_contract_bytecode() { + local addr="$1" + local code + code="$(cast code "${addr}" --rpc-url "${RPC_URL}" 2>/dev/null | tr -d '\n\r \t' | tr '[:upper:]' '[:lower:]')" || true + [[ -n "${code}" && "${code}" != "0x" && "${code}" != "0x0" ]] +} + +verification_status_json() { + local addr="$1" + local raw + local base + for base in "${BLOCKSCOUT_API_BASE}" "${BLOCKSCOUT_PUBLIC_API_BASE}"; do + raw="$(curl --max-time 20 -fsS "${base}/smart-contracts/${addr}" 2>/dev/null || true)" + if [[ -n "${raw}" ]] && jq -e 'type == "object"' >/dev/null 2>&1 <<<"${raw}"; then + printf '%s' "${raw}" + return 0 + fi + done + return 1 +} + +is_verified() { + local addr="$1" + local expected_name="$2" + local json name compiler + json="$(verification_status_json "${addr}")" || return 1 + name="$(jq -r '.name // empty' <<<"${json}")" + compiler="$(jq -r '.compiler_version // empty' <<<"${json}")" + [[ -n "${name}" && -n "${compiler}" && "${name}" == "${expected_name}" ]] +} + +submit_verification() { + local label="$1" + local addr="$2" + local path="$3" + local expected_name="$4" + local constructor_sig="$5" + local compiler_version="$6" + local force_flag="${7:-0}" + shift 6 + local constructor_args=("$@") + + start_proxy_if_needed + has_contract_bytecode "${addr}" || fail "${label} has no bytecode at ${addr}" + + if is_verified "${addr}" "${expected_name}"; then + ok "${label} already verified on Blockscout." + return 0 + fi + + local cmd=(forge verify-contract "${addr}" "${path}" --chain-id 138 --verifier blockscout --verifier-url "${FORGE_VERIFIER_URL}" --rpc-url "${RPC_URL}" --flatten) + [[ -n "${compiler_version}" ]] && cmd+=(--compiler-version "${compiler_version}") + if [[ "${force_flag}" == "1" ]]; then + cmd+=(--force) + fi + if [[ -n "${constructor_sig}" ]]; then + local encoded + encoded="$(cast abi-encode "${constructor_sig}" "${constructor_args[@]:1}")" + cmd+=(--constructor-args "${encoded}") + fi + + log "Submitting Blockscout verification for ${label} (${addr})" + if (cd "${SMOM_ROOT}" && "${cmd[@]}" 2>&1); then + ok "${label} verification submission accepted." + else + warn "${label} verification submission did not complete cleanly. Check Blockscout manually." + fi +} + +[[ -f "${UNISWAP_JSON}" ]] || fail "Missing deployment artifact ${UNISWAP_JSON}" +[[ -f "${SUSHI_JSON}" ]] || fail "Missing deployment artifact ${SUSHI_JSON}" + +UNISWAP_FACTORY="$(jq -r '.factory' "${UNISWAP_JSON}")" +UNISWAP_ROUTER="$(jq -r '.router' "${UNISWAP_JSON}")" +UNISWAP_WETH="$(jq -r '.weth' "${UNISWAP_JSON}")" +UNISWAP_DEPLOYER="$(jq -r '.deployer' "${UNISWAP_JSON}")" + +SUSHI_FACTORY="$(jq -r '.factory' "${SUSHI_JSON}")" +SUSHI_ROUTER="$(jq -r '.router' "${SUSHI_JSON}")" +SUSHI_WETH="$(jq -r '.weth' "${SUSHI_JSON}")" +SUSHI_FEE_TO_SETTER="$(jq -r '.feeToSetter // .deployer' "${SUSHI_JSON}")" + +log "Chain 138 native V2 Blockscout verification" +log "RPC: ${RPC_URL}" +log "Explorer API: ${BLOCKSCOUT_API_BASE}" +log + +if (( STATUS_ONLY )); then + should_handle "UniswapV2Factory" && { is_verified "${UNISWAP_FACTORY}" "UniswapV2Factory" && ok "UniswapV2Factory already verified on Blockscout." || warn "UniswapV2Factory not yet verified on Blockscout."; } + should_handle "UniswapV2Router" && { is_verified "${UNISWAP_ROUTER}" "UniswapV2Router02" && ok "UniswapV2Router already verified on Blockscout." || warn "UniswapV2Router not yet verified on Blockscout."; } + should_handle "SushiSwapFactory" && { is_verified "${SUSHI_FACTORY}" "UniswapV2Factory" && ok "SushiSwapFactory already verified on Blockscout." || warn "SushiSwapFactory not yet verified on Blockscout."; } + should_handle "SushiSwapRouter" && { is_verified "${SUSHI_ROUTER}" "UniswapV2Router02" && ok "SushiSwapRouter already verified on Blockscout." || warn "SushiSwapRouter not yet verified on Blockscout."; } + exit 0 +fi + +should_handle "UniswapV2Factory" && submit_verification \ + "UniswapV2Factory" \ + "${UNISWAP_FACTORY}" \ + "contracts/vendor/uniswap-v2-core/UniswapV2Factory.sol:UniswapV2Factory" \ + "UniswapV2Factory" \ + "constructor(address)" \ + "v0.5.16+commit.9c3226ce" \ + "1" \ + "${UNISWAP_DEPLOYER}" + +should_handle "UniswapV2Router" && submit_verification \ + "UniswapV2Router" \ + "${UNISWAP_ROUTER}" \ + "contracts/vendor/uniswap-v2-periphery/UniswapV2Router02.sol:UniswapV2Router02" \ + "UniswapV2Router02" \ + "constructor(address,address)" \ + "v0.6.6+commit.6c089d02" \ + "1" \ + "${UNISWAP_FACTORY}" "${UNISWAP_WETH}" + +should_handle "SushiSwapFactory" && submit_verification \ + "SushiSwapFactory" \ + "${SUSHI_FACTORY}" \ + "contracts/vendor/sushiswap-v2/UniswapV2Factory.sol:UniswapV2Factory" \ + "UniswapV2Factory" \ + "constructor(address)" \ + "v0.6.12+commit.27d51765" \ + "1" \ + "${SUSHI_FEE_TO_SETTER}" + +should_handle "SushiSwapRouter" && submit_verification \ + "SushiSwapRouter" \ + "${SUSHI_ROUTER}" \ + "contracts/vendor/sushiswap-v2/UniswapV2Router02.sol:UniswapV2Router02" \ + "UniswapV2Router02" \ + "constructor(address,address)" \ + "v0.6.12+commit.27d51765" \ + "1" \ + "${SUSHI_FACTORY}" "${SUSHI_WETH}" + +log +ok "Chain 138 native V2 verification flow complete." diff --git a/scripts/verify/verify-chain138-route-execution-stack-blockscout.sh b/scripts/verify/verify-chain138-route-execution-stack-blockscout.sh new file mode 100755 index 00000000..8511abc5 --- /dev/null +++ b/scripts/verify/verify-chain138-route-execution-stack-blockscout.sh @@ -0,0 +1,545 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Verify the deployed Chain 138 route execution stack and pilot venue contracts on Blockscout. +# +# Usage: +# bash scripts/verify/verify-chain138-route-execution-stack-blockscout.sh +# bash scripts/verify/verify-chain138-route-execution-stack-blockscout.sh --status-only +# bash scripts/verify/verify-chain138-route-execution-stack-blockscout.sh --no-wait +# bash scripts/verify/verify-chain138-route-execution-stack-blockscout.sh --only EnhancedSwapRouterV2,Chain138PilotCurve3Pool + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" +SMOM_ROOT="${PROJECT_ROOT}/smom-dbis-138" + +if [[ -f "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" ]]; then + # shellcheck source=/dev/null + source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" +fi + +command -v forge >/dev/null 2>&1 || { echo "ERROR: forge not found"; exit 1; } +command -v node >/dev/null 2>&1 || { echo "ERROR: node not found"; exit 1; } +command -v cast >/dev/null 2>&1 || { echo "ERROR: cast not found"; exit 1; } +command -v jq >/dev/null 2>&1 || { echo "ERROR: jq not found"; exit 1; } +command -v curl >/dev/null 2>&1 || { echo "ERROR: curl not found"; exit 1; } + +RPC_URL="${RPC_URL_138:-${CHAIN138_RPC_URL:-http://192.168.11.211:8545}}" +BLOCKSCOUT_URL="${CHAIN138_BLOCKSCOUT_INTERNAL_URL:-http://${IP_BLOCKSCOUT:-192.168.11.140}:4000}" +BLOCKSCOUT_API_BASE="${CHAIN138_BLOCKSCOUT_API_BASE:-${BLOCKSCOUT_URL}/api/v2}" +BLOCKSCOUT_PUBLIC_API_BASE="${CHAIN138_BLOCKSCOUT_PUBLIC_API_BASE:-https://explorer.d-bis.org/api/v2}" +VERIFIER_PORT="${FORGE_VERIFIER_PROXY_PORT:-3080}" +FORGE_VERIFIER_URL="${FORGE_VERIFIER_URL:-http://127.0.0.1:${VERIFIER_PORT}/api}" +ROUTE_STACK_SOLC_VERSION="${ROUTE_STACK_SOLC_VERSION:-v0.8.20+commit.a1b79de6}" +ROUTE_STACK_EVM_VERSION="${ROUTE_STACK_EVM_VERSION:-shanghai}" +ROUTE_STACK_OPT_RUNS="${ROUTE_STACK_OPT_RUNS:-200}" + +ONLY_LIST="" +STATUS_ONLY=0 +NO_WAIT=0 +PROXY_PID="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --only) ONLY_LIST="${2:-}"; shift 2 ;; + --status-only) STATUS_ONLY=1; shift ;; + --no-wait) NO_WAIT=1; shift ;; + *) + echo "Unknown argument: $1" >&2 + exit 1 + ;; + esac +done + +cleanup_proxy() { + [[ -n "${PROXY_PID:-}" ]] && kill "${PROXY_PID}" 2>/dev/null || true +} +trap cleanup_proxy EXIT + +should_handle() { + local name="$1" + [[ -n "${ONLY_LIST}" ]] && [[ ",${ONLY_LIST}," != *",${name},"* ]] && return 1 + return 0 +} + +log() { printf '%s\n' "$*"; } +ok() { printf '[ok] %s\n' "$*"; } +warn() { printf '[warn] %s\n' "$*" >&2; } +fail() { printf '[fail] %s\n' "$*" >&2; exit 1; } + +proxy_listening() { + if command -v nc >/dev/null 2>&1; then + nc -z -w 2 127.0.0.1 "${VERIFIER_PORT}" 2>/dev/null + else + timeout 2 bash -c "echo >/dev/tcp/127.0.0.1/${VERIFIER_PORT}" 2>/dev/null + fi +} + +start_proxy_if_needed() { + if proxy_listening; then + ok "Forge verification proxy already listening on ${VERIFIER_PORT}." + return 0 + fi + + log "Starting forge verification proxy on ${VERIFIER_PORT} -> ${BLOCKSCOUT_URL}" + PORT="${VERIFIER_PORT}" BLOCKSCOUT_URL="${BLOCKSCOUT_URL}" node "${PROJECT_ROOT}/forge-verification-proxy/server.js" >/tmp/chain138-route-execution-blockscout-proxy.log 2>&1 & + PROXY_PID=$! + sleep 2 + proxy_listening || fail "Forge verification proxy failed to start. See /tmp/chain138-route-execution-blockscout-proxy.log" +} + +has_contract_bytecode() { + local addr="$1" + local code + code="$(cast code "${addr}" --rpc-url "${RPC_URL}" 2>/dev/null | tr -d '\n\r \t' | tr '[:upper:]' '[:lower:]')" || true + [[ -n "${code}" && "${code}" != "0x" && "${code}" != "0x0" ]] +} + +verification_status_json() { + local addr="$1" + local raw + local base + for base in "${BLOCKSCOUT_API_BASE}" "${BLOCKSCOUT_PUBLIC_API_BASE}"; do + raw="$(curl --max-time 20 -fsS "${base}/smart-contracts/${addr}" 2>/dev/null || true)" + if [[ -n "${raw}" ]] && jq -e 'type == "object"' >/dev/null 2>&1 <<<"${raw}"; then + printf '%s' "${raw}" + return 0 + fi + done + return 1 +} + +is_verified() { + local addr="$1" + local expected_name="$2" + local json name compiler + json="$(verification_status_json "${addr}")" || return 1 + name="$(jq -r '.name // empty' <<<"${json}")" + compiler="$(jq -r '.compiler_version // empty' <<<"${json}")" + [[ -n "${name}" && -n "${compiler}" && "${name}" == "${expected_name}" ]] +} + +submit_verification() { + local label="$1" + local addr="$2" + local path="$3" + local expected_name="$4" + local constructor_sig="$5" + shift 5 + local constructor_args=("$@") + + start_proxy_if_needed + has_contract_bytecode "${addr}" || fail "${label} has no bytecode at ${addr}" + + if is_verified "${addr}" "${expected_name}"; then + ok "${label} already verified on Blockscout." + return 0 + fi + + local cmd=(forge verify-contract "${addr}" "${path}" --chain-id 138 --verifier blockscout --verifier-url "${FORGE_VERIFIER_URL}" --rpc-url "${RPC_URL}" --flatten) + if [[ -n "${constructor_sig}" ]]; then + local encoded + encoded="$(cast abi-encode "${constructor_sig}" "${constructor_args[@]}")" + cmd+=(--constructor-args "${encoded}") + fi + + log "Submitting Blockscout verification for ${label} (${addr})" + if (cd "${SMOM_ROOT}" && "${cmd[@]}" 2>&1); then + ok "${label} verification submission accepted." + else + warn "${label} verification submission did not complete cleanly. Check Blockscout manually." + fi +} + +artifact_dbg_path() { + case "$1" in + EnhancedSwapRouterV2) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/EnhancedSwapRouterV2.sol/EnhancedSwapRouterV2.dbg.json" ;; + IntentBridgeCoordinatorV2) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/IntentBridgeCoordinatorV2.sol/IntentBridgeCoordinatorV2.dbg.json" ;; + DodoRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/adapters/DodoRouteExecutorAdapter.sol/DodoRouteExecutorAdapter.dbg.json" ;; + DodoV3RouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol/DodoV3RouteExecutorAdapter.dbg.json" ;; + UniswapV3RouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/adapters/UniswapV3RouteExecutorAdapter.sol/UniswapV3RouteExecutorAdapter.dbg.json" ;; + BalancerRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/adapters/BalancerRouteExecutorAdapter.sol/BalancerRouteExecutorAdapter.dbg.json" ;; + CurveRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/adapters/CurveRouteExecutorAdapter.sol/CurveRouteExecutorAdapter.dbg.json" ;; + OneInchRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/adapters/OneInchRouteExecutorAdapter.sol/OneInchRouteExecutorAdapter.dbg.json" ;; + Chain138PilotUniswapV3Router) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol/Chain138PilotUniswapV3Router.dbg.json" ;; + Chain138PilotBalancerVault) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol/Chain138PilotBalancerVault.dbg.json" ;; + Chain138PilotCurve3Pool) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol/Chain138PilotCurve3Pool.dbg.json" ;; + Chain138PilotOneInchAggregationRouter) printf '%s' "${SMOM_ROOT}/artifacts/contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol/Chain138PilotOneInchAggregationRouter.dbg.json" ;; + *) return 1 ;; + esac +} + +foundry_artifact_json_path() { + case "$1" in + EnhancedSwapRouterV2) printf '%s' "${SMOM_ROOT}/out/EnhancedSwapRouterV2.sol/EnhancedSwapRouterV2.json" ;; + IntentBridgeCoordinatorV2) printf '%s' "${SMOM_ROOT}/out/IntentBridgeCoordinatorV2.sol/IntentBridgeCoordinatorV2.json" ;; + DodoRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/out/DodoRouteExecutorAdapter.sol/DodoRouteExecutorAdapter.json" ;; + DodoV3RouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/out/DodoV3RouteExecutorAdapter.sol/DodoV3RouteExecutorAdapter.json" ;; + UniswapV3RouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/out/UniswapV3RouteExecutorAdapter.sol/UniswapV3RouteExecutorAdapter.json" ;; + BalancerRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/out/BalancerRouteExecutorAdapter.sol/BalancerRouteExecutorAdapter.json" ;; + CurveRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/out/CurveRouteExecutorAdapter.sol/CurveRouteExecutorAdapter.json" ;; + OneInchRouteExecutorAdapter) printf '%s' "${SMOM_ROOT}/out/OneInchRouteExecutorAdapter.sol/OneInchRouteExecutorAdapter.json" ;; + Chain138PilotUniswapV3Router|Chain138PilotBalancerVault|Chain138PilotCurve3Pool|Chain138PilotOneInchAggregationRouter) + printf '%s' "${SMOM_ROOT}/out/Chain138PilotDexVenues.sol/${1}.json" + ;; + *) return 1 ;; + esac +} + +runtime_hash_report() { + local label="$1" + local addr="$2" + local artifact_json artifact_runtime chain_runtime + + artifact_json="$(foundry_artifact_json_path "${label}")" || return 0 + [[ -f "${artifact_json}" ]] || return 0 + + artifact_runtime="$(jq -r '.deployedBytecode.object // empty' "${artifact_json}" | tr '[:upper:]' '[:lower:]')" + chain_runtime="$(cast code "${addr}" --rpc-url "${RPC_URL}" 2>/dev/null | tr -d '\n\r \t' | tr '[:upper:]' '[:lower:]')" || true + + [[ -n "${artifact_runtime}" && -n "${chain_runtime}" && "${chain_runtime}" != "0x" ]] || return 0 + + if [[ "${artifact_runtime}" != "${chain_runtime}" ]]; then + warn "${label}: Foundry artifact runtime bytecode does not match deployed bytecode." + warn "${label}: artifact_keccak=$(cast keccak "${artifact_runtime}") chain_keccak=$(cast keccak "${chain_runtime}")" + fi +} + +submit_standard_input_from_artifact() { + local label="$1" + local addr="$2" + local contract_path="$3" + local constructor_args="$4" + local dbg build input_file compiler_version evm_version optimization_runs optimization_enabled license_type response message + + dbg="$(artifact_dbg_path "${label}")" || fail "${label}: missing dbg path mapping" + [[ -f "${dbg}" ]] || fail "${label}: missing dbg artifact ${dbg}" + build="$(jq -r '.buildInfo // .build_info // empty' "${dbg}")" + [[ -n "${build}" && "${build}" != "null" ]] || fail "${label}: missing build-info reference in ${dbg}" + build="$(cd "$(dirname "${dbg}")" && realpath "${build}")" + [[ -f "${build}" ]] || fail "${label}: missing build-info file ${build}" + + input_file="$(mktemp)" + python3 - "${dbg}" "${build}" "${input_file}" "${contract_path%%:*}" <<'PY' +import json +import os +import posixpath +import re +import sys + +dbg_path, build_path, out_path, fallback_source = sys.argv[1:5] +with open(dbg_path, "r", encoding="utf-8") as fh: + dbg = json.load(fh) +with open(build_path, "r", encoding="utf-8") as fh: + build = json.load(fh) + +source_name = dbg.get("sourceName") or dbg.get("source_name") or fallback_source +if not source_name: + raise SystemExit(f"missing sourceName in {dbg_path}") + +input_data = build["input"] +sources = input_data.get("sources", {}) +if source_name not in sources: + raise SystemExit(f"source {source_name} missing from build-info input") + +import_re = re.compile(r'import\s+(?:[^;]*?\s+from\s+)?["\']([^"\']+)["\']\s*;') + +closure = set() +stack = [source_name] +while stack: + current = stack.pop() + if current in closure or current not in sources: + continue + closure.add(current) + content = sources[current].get("content", "") + for entry in import_re.findall(content): + if entry.startswith("."): + target = posixpath.normpath(posixpath.join(posixpath.dirname(current), entry)) + else: + target = entry + if target in sources and target not in closure: + stack.append(target) + +reduced = json.loads(json.dumps(input_data)) +reduced["sources"] = {name: sources[name] for name in sorted(closure)} + +with open(out_path, "w", encoding="utf-8") as fh: + json.dump(reduced, fh, separators=(",", ":")) +PY + compiler_version="$(jq -r '.solcLongVersion | "v" + .' "${build}")" + evm_version="$(jq -r '.input.settings.evmVersion // "default"' "${build}")" + optimization_runs="$(jq -r '.input.settings.optimizer.runs // 200' "${build}")" + optimization_enabled="$(jq -r '.input.settings.optimizer.enabled // true' "${build}")" + license_type="mit" + + response="$( + curl --max-time 180 -fsS -X POST \ + -F "compiler_version=${compiler_version}" \ + -F "contract_name=${contract_path}" \ + -F "autodetect_constructor_args=false" \ + -F "constructor_args=${constructor_args}" \ + -F "optimization_runs=${optimization_runs}" \ + -F "is_optimization_enabled=${optimization_enabled}" \ + -F "evm_version=${evm_version}" \ + -F "license_type=${license_type}" \ + -F "files[0]=@${input_file};type=application/json" \ + "${BLOCKSCOUT_URL}/api/v2/smart-contracts/${addr}/verification/via/standard-input" + )" || { + rm -f "${input_file}" + fail "${label}: Blockscout standard-input submission failed." + } + rm -f "${input_file}" + + message="$(jq -r '.message // empty' <<<"${response}")" + if [[ "${message}" == "Smart-contract verification started" ]]; then + ok "${label} standard-input verification submission accepted." + return 0 + fi + + warn "${label} standard-input verification returned: ${response}" + return 1 +} + +submit_standard_input_from_forge() { + local label="$1" + local addr="$2" + local contract_path="$3" + local constructor_args="$4" + local input_file response message + local compiler_version evm_version optimization_runs via_ir_flag artifact_json + + compiler_version="${ROUTE_STACK_SOLC_VERSION}" + evm_version="${ROUTE_STACK_EVM_VERSION}" + optimization_runs="${ROUTE_STACK_OPT_RUNS}" + via_ir_flag=(--via-ir) + + artifact_json="$(foundry_artifact_json_path "${label}" || true)" + if [[ -n "${artifact_json}" && -f "${artifact_json}" ]]; then + compiler_version="v$(jq -r '.metadata.compiler.version // empty' "${artifact_json}")" + evm_version="$(jq -r '.metadata.settings.evmVersion // "default"' "${artifact_json}")" + optimization_runs="$(jq -r '.metadata.settings.optimizer.runs // 200' "${artifact_json}")" + if [[ "$(jq -r '.metadata.settings.viaIR // false' "${artifact_json}")" != "true" ]]; then + via_ir_flag=() + fi + fi + + runtime_hash_report "${label}" "${addr}" + input_file="$(mktemp)" + ( + cd "${SMOM_ROOT}" + forge verify-contract "${addr}" "${contract_path}" \ + --chain-id 138 \ + --root . \ + --compiler-version "${compiler_version}" \ + --num-of-optimizations "${optimization_runs}" \ + "${via_ir_flag[@]}" \ + --evm-version "${evm_version}" \ + --show-standard-json-input >"${input_file}" + ) || { + rm -f "${input_file}" + fail "${label}: failed to render Foundry standard-input from deployment sources." + } + + response="$( + curl --max-time 180 -fsS -X POST \ + -F "compiler_version=${compiler_version}" \ + -F "contract_name=${contract_path}" \ + -F "autodetect_constructor_args=false" \ + -F "constructor_args=${constructor_args}" \ + -F "optimization_runs=${optimization_runs}" \ + -F "is_optimization_enabled=true" \ + -F "evm_version=${evm_version}" \ + -F "license_type=mit" \ + -F "files[0]=@${input_file};type=application/json" \ + "${BLOCKSCOUT_URL}/api/v2/smart-contracts/${addr}/verification/via/standard-input" + )" || { + rm -f "${input_file}" + fail "${label}: Blockscout Foundry standard-input submission failed." + } + rm -f "${input_file}" + + message="$(jq -r '.message // empty' <<<"${response}")" + if [[ "${message}" == "Smart-contract verification started" ]]; then + ok "${label} Foundry standard-input verification submission accepted." + return 0 + fi + + warn "${label} Foundry standard-input verification returned: ${response}" + return 1 +} + +submit_best_verification() { + local label="$1" + local addr="$2" + local path="$3" + local expected_name="$4" + local constructor_sig="$5" + shift 5 + local constructor_args=("$@") + local encoded="" + + if [[ -n "${constructor_sig}" ]]; then + encoded="$(cast abi-encode "${constructor_sig}" "${constructor_args[@]}")" + fi + + # Prefer the Foundry deployment lineage for the route stack. The earlier + # Hardhat dbg/build-info path drifted away from the actual deployed compiler/EVM + # settings and is kept only as a compatibility fallback. + if submit_standard_input_from_forge "${label}" "${addr}" "${path}" "${encoded}"; then + return 0 + fi + + if artifact_dbg_path "${label}" >/dev/null 2>&1; then + warn "${label}: falling back to artifact-derived standard-input after Foundry mismatch." + submit_standard_input_from_artifact "${label}" "${addr}" "${path}" "${encoded}" || return 1 + return 0 + fi + + warn "${label}: falling back to legacy Forge flattened verification path." + submit_verification "${label}" "${addr}" "${path}" "${expected_name}" "${constructor_sig}" "${constructor_args[@]}" +} + +WETH="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" +USDT="0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1" +USDC="0x71D6687F38b93CCad569Fa6352c876eea967201b" +DAI_PLACEHOLDER="0x6B175474E89094C44Da98b954EedeAC495271d0F" + +ROUTER_V2="$(jq -r '.chains["138"].contracts.EnhancedSwapRouterV2' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +COORDINATOR_V2="$(jq -r '.chains["138"].contracts.IntentBridgeCoordinatorV2' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +DODO_ADAPTER="$(jq -r '.chains["138"].contracts.DodoRouteExecutorAdapter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +DODO_V3_ADAPTER="$(jq -r '.chains["138"].contracts.DodoV3RouteExecutorAdapter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +UNISWAP_V3_ADAPTER="$(jq -r '.chains["138"].contracts.UniswapV3RouteExecutorAdapter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +BALANCER_ADAPTER="$(jq -r '.chains["138"].contracts.BalancerRouteExecutorAdapter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +CURVE_ADAPTER="$(jq -r '.chains["138"].contracts.CurveRouteExecutorAdapter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +ONEINCH_ADAPTER="$(jq -r '.chains["138"].contracts.OneInchRouteExecutorAdapter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +PILOT_UNISWAP="$(jq -r '.chains["138"].contracts.PilotUniswapV3Router' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +PILOT_BALANCER="$(jq -r '.chains["138"].contracts.PilotBalancerVault' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +PILOT_CURVE="$(jq -r '.chains["138"].contracts.PilotCurve3Pool' "${PROJECT_ROOT}/config/smart-contracts-master.json")" +PILOT_ONEINCH="$(jq -r '.chains["138"].contracts.PilotOneInchRouter' "${PROJECT_ROOT}/config/smart-contracts-master.json")" + +log "Chain 138 route execution stack Blockscout verification" +log "RPC: ${RPC_URL}" +log "Explorer API: ${BLOCKSCOUT_API_BASE}" +log + +if (( STATUS_ONLY )); then + for pair in \ + "EnhancedSwapRouterV2:${ROUTER_V2}:EnhancedSwapRouterV2" \ + "IntentBridgeCoordinatorV2:${COORDINATOR_V2}:IntentBridgeCoordinatorV2" \ + "DodoRouteExecutorAdapter:${DODO_ADAPTER}:DodoRouteExecutorAdapter" \ + "DodoV3RouteExecutorAdapter:${DODO_V3_ADAPTER}:DodoV3RouteExecutorAdapter" \ + "UniswapV3RouteExecutorAdapter:${UNISWAP_V3_ADAPTER}:UniswapV3RouteExecutorAdapter" \ + "BalancerRouteExecutorAdapter:${BALANCER_ADAPTER}:BalancerRouteExecutorAdapter" \ + "CurveRouteExecutorAdapter:${CURVE_ADAPTER}:CurveRouteExecutorAdapter" \ + "OneInchRouteExecutorAdapter:${ONEINCH_ADAPTER}:OneInchRouteExecutorAdapter" \ + "Chain138PilotUniswapV3Router:${PILOT_UNISWAP}:Chain138PilotUniswapV3Router" \ + "Chain138PilotBalancerVault:${PILOT_BALANCER}:Chain138PilotBalancerVault" \ + "Chain138PilotCurve3Pool:${PILOT_CURVE}:Chain138PilotCurve3Pool" \ + "Chain138PilotOneInchAggregationRouter:${PILOT_ONEINCH}:Chain138PilotOneInchAggregationRouter" + do + IFS=":" read -r label addr expected <<<"${pair}" + should_handle "${label}" || continue + if is_verified "${addr}" "${expected}"; then + ok "${label} already verified on Blockscout." + else + warn "${label} not yet verified on Blockscout." + fi + done + exit 0 +fi + +should_handle "EnhancedSwapRouterV2" && submit_best_verification \ + "EnhancedSwapRouterV2" \ + "${ROUTER_V2}" \ + "contracts/bridge/trustless/EnhancedSwapRouterV2.sol:EnhancedSwapRouterV2" \ + "EnhancedSwapRouterV2" \ + "constructor(address,address,address,address)" \ + "${WETH}" "${USDT}" "${USDC}" "${DAI_PLACEHOLDER}" + +should_handle "IntentBridgeCoordinatorV2" && submit_best_verification \ + "IntentBridgeCoordinatorV2" \ + "${COORDINATOR_V2}" \ + "contracts/bridge/trustless/IntentBridgeCoordinatorV2.sol:IntentBridgeCoordinatorV2" \ + "IntentBridgeCoordinatorV2" \ + "constructor(address)" \ + "${ROUTER_V2}" + +should_handle "DodoRouteExecutorAdapter" && submit_best_verification \ + "DodoRouteExecutorAdapter" \ + "${DODO_ADAPTER}" \ + "contracts/bridge/trustless/adapters/DodoRouteExecutorAdapter.sol:DodoRouteExecutorAdapter" \ + "DodoRouteExecutorAdapter" \ + "" + +should_handle "DodoV3RouteExecutorAdapter" && submit_best_verification \ + "DodoV3RouteExecutorAdapter" \ + "${DODO_V3_ADAPTER}" \ + "contracts/bridge/trustless/adapters/DodoV3RouteExecutorAdapter.sol:DodoV3RouteExecutorAdapter" \ + "DodoV3RouteExecutorAdapter" \ + "" + +should_handle "UniswapV3RouteExecutorAdapter" && submit_best_verification \ + "UniswapV3RouteExecutorAdapter" \ + "${UNISWAP_V3_ADAPTER}" \ + "contracts/bridge/trustless/adapters/UniswapV3RouteExecutorAdapter.sol:UniswapV3RouteExecutorAdapter" \ + "UniswapV3RouteExecutorAdapter" \ + "" + +should_handle "BalancerRouteExecutorAdapter" && submit_best_verification \ + "BalancerRouteExecutorAdapter" \ + "${BALANCER_ADAPTER}" \ + "contracts/bridge/trustless/adapters/BalancerRouteExecutorAdapter.sol:BalancerRouteExecutorAdapter" \ + "BalancerRouteExecutorAdapter" \ + "" + +should_handle "CurveRouteExecutorAdapter" && submit_best_verification \ + "CurveRouteExecutorAdapter" \ + "${CURVE_ADAPTER}" \ + "contracts/bridge/trustless/adapters/CurveRouteExecutorAdapter.sol:CurveRouteExecutorAdapter" \ + "CurveRouteExecutorAdapter" \ + "" + +should_handle "OneInchRouteExecutorAdapter" && submit_best_verification \ + "OneInchRouteExecutorAdapter" \ + "${ONEINCH_ADAPTER}" \ + "contracts/bridge/trustless/adapters/OneInchRouteExecutorAdapter.sol:OneInchRouteExecutorAdapter" \ + "OneInchRouteExecutorAdapter" \ + "" + +should_handle "Chain138PilotUniswapV3Router" && submit_best_verification \ + "Chain138PilotUniswapV3Router" \ + "${PILOT_UNISWAP}" \ + "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol:Chain138PilotUniswapV3Router" \ + "Chain138PilotUniswapV3Router" \ + "" + +should_handle "Chain138PilotBalancerVault" && submit_best_verification \ + "Chain138PilotBalancerVault" \ + "${PILOT_BALANCER}" \ + "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol:Chain138PilotBalancerVault" \ + "Chain138PilotBalancerVault" \ + "" + +should_handle "Chain138PilotCurve3Pool" && submit_best_verification \ + "Chain138PilotCurve3Pool" \ + "${PILOT_CURVE}" \ + "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol:Chain138PilotCurve3Pool" \ + "Chain138PilotCurve3Pool" \ + "constructor(address,address,address,uint256)" \ + "${USDT}" "${USDC}" "0x0000000000000000000000000000000000000000" "4" + +should_handle "Chain138PilotOneInchAggregationRouter" && submit_best_verification \ + "Chain138PilotOneInchAggregationRouter" \ + "${PILOT_ONEINCH}" \ + "contracts/bridge/trustless/pilot/Chain138PilotDexVenues.sol:Chain138PilotOneInchAggregationRouter" \ + "Chain138PilotOneInchAggregationRouter" \ + "" + +if (( NO_WAIT )); then + log + ok "Chain 138 route execution stack verification submissions complete." + exit 0 +fi + +log +ok "Chain 138 route execution stack verification flow complete." diff --git a/scripts/verify/verify-dodo-v3-chain138-blockscout.sh b/scripts/verify/verify-dodo-v3-chain138-blockscout.sh index e914e4e3..282a4b15 100644 --- a/scripts/verify/verify-dodo-v3-chain138-blockscout.sh +++ b/scripts/verify/verify-dodo-v3-chain138-blockscout.sh @@ -273,9 +273,16 @@ submit_v2_standard_input() { compiler_version="v0.8.16+commit.07a7930e" license_type="busl_1_1" + input_file="$(mktemp)" + + jq ' + del(.settings.libraries[""].__CACHE_BREAKER__) + | if (.settings.libraries[""]? == {}) then del(.settings.libraries[""]) else . end + | if (.settings.libraries? == {}) then del(.settings.libraries) else . end + ' "${input}" > "${input_file}" response="$( - curl --max-time 30 -fsS -X POST \ + curl --max-time 120 -fsS -X POST \ -F "compiler_version=${compiler_version}" \ -F "contract_name=${path}" \ -F "autodetect_constructor_args=false" \ @@ -283,9 +290,13 @@ submit_v2_standard_input() { -F "optimization_runs=200" \ -F "is_optimization_enabled=true" \ -F "license_type=${license_type}" \ - -F "files[0]=@${input};type=application/json" \ + -F "files[0]=@${input_file};type=application/json" \ "${BLOCKSCOUT_URL}/api/v2/smart-contracts/${addr}/verification/via/standard-input" - )" || fail "${label}: Blockscout standard-input submission failed." + )" || { + rm -f "${input_file}" + fail "${label}: Blockscout standard-input submission failed." + } + rm -f "${input_file}" message="$(jq -r '.message // empty' <<<"${response}")" if [[ "${message}" == "Smart-contract verification started" ]]; then