diff --git a/docs/03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md b/docs/03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md index 689947ae..fd711f82 100644 --- a/docs/03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md +++ b/docs/03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md @@ -2,9 +2,11 @@ > Historical note (2026-03-26): this status tracker includes earlier PMM-address snapshots. The current canonical Chain 138 PMM stack is `DODOPMMIntegration=0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d` and `DODOPMMProvider=0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381`. -**Last Updated:** 2026-03-04 +**Last Updated:** 2026-04-19 **Purpose:** Ordered list of remaining deployments to achieve **maximum effective execution across all networks** (13-chain hub model: Chain 138 + 12 edge/alt). Use after [REQUIRED_FIXES_GAPS_AND_DEPLOYMENTS_LIST](../00-meta/REQUIRED_FIXES_GAPS_AND_DEPLOYMENTS_LIST.md) and [DEPLOYMENT_ORDER_OF_OPERATIONS](DEPLOYMENT_ORDER_OF_OPERATIONS.md). +**Status vocabulary:** `✅ / ⏳ / 📋` below are summary symbols; precise axis values (`deployed / wired / funded / explorer-verified / healthy`) are defined in [`docs/11-references/STATUS_VOCABULARY.md`](../11-references/STATUS_VOCABULARY.md). Canonical per-chain cW* + bridge inventory lives in [`cross-chain-pmm-lps/config/deployment-status.json`](../../cross-chain-pmm-lps/config/deployment-status.json) (submodule pin) — consult it before re-stating addresses here. + **Routing context:** [routing-matrix-13x13.json](../../smom-dbis-138/real-robinhood/data/routing-matrix-13x13.json) — 138↔Celo (42220) **B/SBS** (CCIP bridges deployed 2026-03-04); 138↔Wemix (1111) **Tabled** (see below). Full coverage = all 13 chains with bridge + liquidity where designed. **Wemix (1111) tabled:** There is no in-repo route (aggregator/DEX integration) to swap ETH, BNB, or Polygon to WEMIX. Deployer needs ~0.4 WEMIX for gas to deploy CCIP bridges on Wemix. Until an automated route exists or WEMIX is acquired manually (e.g. [SwapSpace](https://swapspace.co/exchange-pairs/wemix-bnb), [ChangeNOW](https://changenow.io/currencies/wemix-main/polygon-matic)), **all Wemix network deployments are tabled**. See [WEMIX_ACQUISITION_TABLED.md](WEMIX_ACQUISITION_TABLED.md). @@ -19,7 +21,7 @@ | A | A.2 Add liquidity PMM (138) | ⚠️ Historical snapshot (2026-03-04) | Earlier run referenced cUSDT/cUSDC pool `0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8` on a superseded stack; use [LIQUIDITY_POOLS_MASTER_MAP.md](../11-references/LIQUIDITY_POOLS_MASTER_MAP.md) for current live pools. | | B | B.1 Celo CCIP bridges | ✅ Done | Deployed; 0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04 (WETH9), 0xa4B9DD039565AeD9641D45b57061f99d9cA6Df08 (WETH10); .env updated; complete-config Celo→138 OK. | | B | **B.2a Add Cronos (25)** | ⏳ Pending | Fund deployer with ~15 CRO ([acquire-cro-and-wemix-gas.sh](../../scripts/deployment/acquire-cro-and-wemix-gas.sh)); set CRONOS_RPC, CCIP_ROUTER_CRONOS, WETH9_CRONOS, WETH10_CRONOS in .env; run `deploy-bridges-config-ready-chains.sh cronos` then `complete-config-ready-chains.sh`. | -| B | B.2b Wemix CCIP bridges | 📋 Tabled | No route to acquire WEMIX from ETH/BNB/POLY in-repo; tabled until route exists or manual acquisition. Fund ~0.4 WEMIX ([acquire-cro-and-wemix-gas.sh](../../scripts/deployment/acquire-cro-and-wemix-gas.sh)); then `deploy-bridges-config-ready-chains.sh wemix` + complete-config. See [WEMIX_ACQUISITION_TABLED.md](WEMIX_ACQUISITION_TABLED.md). | +| B | B.2b Wemix CCIP bridges | 📋 Tabled — `deployed:? / wired:N / funded:N / verified:? / healthy:N` | `deployment-status.json` records `bridgeAvailable=false` and `cwTokens={}` for chain 1111. Blocker is `funded:N` — no route to acquire WEMIX from ETH/BNB/POLY in-repo. Before flipping `deployed` or `verified`: run `eth_getCode` on candidate addresses on Wemix (do not assume cross-chain from Celo — see [../11-references/CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md](../11-references/CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md)). To un-table: fund ~0.4 WEMIX via [acquire-cro-and-wemix-gas.sh](../../scripts/deployment/acquire-cro-and-wemix-gas.sh), then `deploy-bridges-config-ready-chains.sh wemix` + complete-config. See [WEMIX_ACQUISITION_TABLED.md](WEMIX_ACQUISITION_TABLED.md). | | B | **Gnosis CCIP bridges** | ✅ Done (2026-03-04) | Deployed: WETH9 `0x4ab39b5BaB7b463435209A9039bd40Cf241F5a82`, WETH10 `0xC15ACdBAC59B3C7Cb4Ea4B3D58334A4b143B4b44`; .env updated. | | B | B.3 Fund CCIP with LINK | ⏳ Blocked | `scripts/deployment/fund-ccip-bridges-with-link.sh` run (2026-03-04): many lanes failing with insufficient LINK or gas, Chain 138 Invalid params; top up LINK balances and gas on each chain before retry. | | C | C.1–C.2 cW* + edge pools | 📋 Runbook | [PHASE_C_CW_AND_EDGE_POOLS_RUNBOOK.md](PHASE_C_CW_AND_EDGE_POOLS_RUNBOOK.md). | @@ -50,7 +52,7 @@ | Chain 138 liquidity | **Re-verify required** — prior run reported cUSDT/cUSDC liquidity add; this checklist previously showed zero liquidity. Treat liquidity state as unknown until reconfirmed on-chain. | | CCIP 138 → 1, 56, 137, 10, 42161, 43114, 8453, 100, 25, **42220 (Celo)** | Configured (B/SBS). Celo CCIP bridges deployed 2026-03-04; Gnosis, Cronos config-ready; Wemix (1111) **Tabled** (no ETH/BNB/POLY→WEMIX route; see [WEMIX_ACQUISITION_TABLED.md](WEMIX_ACQUISITION_TABLED.md)). | | Alltra 138 ↔ 651940 | ALT path live. | -| cW* on public chains | Addresses in .env / design; **deployment-status.json empty** — no cW* pool addresses. | +| cW* on public chains | cW* **tokens** present on 9 chains per [`deployment-status.json`](../../cross-chain-pmm-lps/config/deployment-status.json) (`1, 10, 25, 56, 100, 137, 8453, 42161, 43114`); `42220` and `1111` still empty. `pmmPools` arrays are empty for every chain — edge pool addresses not captured. `deployed:Y / wired:? / funded:N / verified:? / healthy:?`. | | LINK for CCIP | Fund bridges per lane so cross-chain messages execute. | --- diff --git a/docs/11-references/CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md b/docs/11-references/CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md new file mode 100644 index 00000000..0eb80628 --- /dev/null +++ b/docs/11-references/CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md @@ -0,0 +1,58 @@ +# Cross-chain CREATE address coincidence + +**Last Updated:** 2026-04-19 +**Purpose:** Explain why one address can legitimately appear as different contracts on different chains in this deployer's inventory, so future operators do not treat it as a documentation bug. + +--- + +## Mechanism + +A contract address produced by the EVM `CREATE` opcode is `keccak256(rlp([sender, nonce]))[12:]`. The function inputs are **chain-independent**: the chain ID is not part of the preimage. + +Consequence: if the deployer EOA `0x4A666F96fC8764181194447A7dFdb7d471b301C8` broadcasts transactions with matching nonces on two different chains, `CREATE` yields the *same* address on both. The deployed bytecode can be completely different. + +`CREATE2` (`keccak256(0xff ++ sender ++ salt ++ keccak256(initCode))[12:]`) is also chain-independent but salts can differ per chain. This explains why some deterministic deployments across chains land on *different* addresses — they used different salts, not because CREATE2 itself injects chain info. + +## Concrete coincidence registered in this repo + +The addresses below appear with different roles on different chains; all three claims are simultaneously true. + +| Address | Chain 138 role | Celo (42220) role | Wemix (1111) role | +|---------|----------------|-------------------|-------------------| +| `0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04` | `PRICE_FEED_KEEPER_ADDRESS` — see [`smom-dbis-138/config/address-inventory.chain138.json`](../../smom-dbis-138/config/address-inventory.chain138.json) and [`ORACLE_AND_KEEPER_CHAIN138.md`](../../smom-dbis-138/docs/integration/ORACLE_AND_KEEPER_CHAIN138.md). | `CCIPWETH9Bridge` — see [`REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md`](../03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md) Phase B.1 row and [`DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md`](DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md) §1 line 14. | Candidate `CCIPWETH9Bridge` target if the deployer eventually funds Wemix gas. Deployment status on 1111 is **not assumed** from the Celo deployment — run an `eth_getCode` probe on Wemix before claiming `deployed:Y`. | +| `0xa4B9DD039565AeD9641D45b57061f99d9cA6Df08` | (no code) | `CCIPWETH10Bridge` — see [`REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md`](../03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md) Phase B.1 row. | Candidate `CCIPWETH10Bridge` target — same caveat as above. | + +## What this means for status docs + +1. **Address identity ≠ contract identity.** A line like "the CCIP WETH9 bridge is `0xD3AD…6f04`" is ambiguous without the chain ID. Always qualify with chain ID. +2. **Do not assume cross-chain deployment from a single-chain probe.** A successful `eth_getCode` on Celo proves only that Celo has a contract at that address. Wemix must be probed separately. +3. **When a single address appears in more than one status table with different roles, link to this doc.** That removes the "which one is right?" noise — all are right, for their own chain. + +## Verification commands + +```bash +# Chain 138 +cast code 0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04 --rpc-url https://138.rpc.thirdweb.com | wc -c + +# Celo +cast code 0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04 --rpc-url https://forno.celo.org | wc -c + +# Wemix +cast code 0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04 --rpc-url https://api.wemix.com | wc -c +``` + +Reference bytecode lengths observed 2026-04-19 (character count including `0x` prefix): + +| Chain | `0xD3AD…6f04` | `0xa4B9…Df08` | +|-------|---------------|---------------| +| 138 | 10 748 (PriceFeedKeeper) | 2 (no code) | +| Celo (42220) | 13 718 (CCIPWETH9Bridge) | 13 048 (CCIPWETH10Bridge) | +| Wemix (1111) | probe before relying on | probe before relying on | + +If a future probe shows Chain 138's bytecode at `0xD3AD…6f04` matches Celo's 13 718 char bytecode rather than the 10 748 char keeper, something has changed — do not proceed. Route to an operator. + +## Related + +- [STATUS_VOCABULARY.md](STATUS_VOCABULARY.md) — `deployed` axis depends on an `eth_getCode` probe per chain, not cross-chain inference. +- [ADDRESS_MATRIX_AND_STATUS.md](ADDRESS_MATRIX_AND_STATUS.md) — per-chain address registry. Keep entries chain-scoped. +- [DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md](DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md) §1 — CCIP bridge inventory, must cite chain ID next to any shared address. diff --git a/docs/11-references/DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md b/docs/11-references/DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md index 43dd84df..bc47b0a6 100644 --- a/docs/11-references/DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md +++ b/docs/11-references/DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md @@ -1,8 +1,10 @@ # Deployed Tokens, Bridges, DODO/Uniswap LPs — Status & Complete Routing Map -**Last Updated:** 2026-03-26 +**Last Updated:** 2026-04-19 **Purpose:** Single reference for (1) deployed tokens/coins and bridges per destination network, (2) DODO and Uniswap LPs with addresses, and (3) a complete mapping of all possible routes for routing **to** and **from** each chain. +**Status vocabulary:** All `✅ / ⚠️ / ❌` cells below map to the 5-axis grid defined in [STATUS_VOCABULARY.md](STATUS_VOCABULARY.md) (`deployed / wired / funded / explorer-verified / healthy`). When an address appears in more than one table with different roles, see [CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md](CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md) — this is an EVM-CREATE property, not a documentation conflict. + --- ## 1. Executive summary @@ -12,8 +14,8 @@ | **Chain 138 tokens** | ✅ Live | cUSDT, cUSDC, WETH, WETH10, LINK; 10 more compliant tokens deployable (cEURC, cEURT, cGBP*, cAUD*, cJPY*, cCHF*, cCAD*, cAUSDT). | | **Chain 138 DODO PMM** | ✅ Live | DODOPMMIntegration + 6 public pools are live on Chain 138: stable pairs plus the three public XAU pools. Official mirror `USDT/USDC` pools were corrected and funded locally. DODOPMMProvider remains deployed; routing cUSDT↔cUSDC and the live local direct/ XAU paths are active. | | **Chain 138 → destination bridges** | ✅ CCIP + Alltra | CCIP WETH9/WETH10 to Ethereum, BSC, Polygon, Arbitrum, Optimism, Avalanche, Cronos, **Celo + Gnosis (2026-03-04)**. Gnosis: 0x4ab39b5BaB7b463435209A9039bd40Cf241F5a82 (WETH9), 0xC15ACdBAC59B3C7Cb4Ea4B3D58334A4b143B4b44 (WETH10). AlltraAdapter 138↔651940. Wemix pending (need 0.4 WEMIX). | -| **Destination tokens (cW\*)** | ⚠️ Design / partial | cWUSDT, cWUSDC deployed on 9 chains (1, 25, 56, 137, 100, 43114, 8453, 42161, 10); cWEURC and others partial. Addresses in .env; **deployment-status.json** empty (design-only). | -| **Destination DODO/Uniswap LPs** | ⚠️ Partial graph / pools not live | cross-chain-pmm-lps **pool-matrix** defines cW*/USDC, cW*/USDT per chain; **deployment-status.json** now records deployed cW* token addresses and bridge availability, but PMM pool addresses are still empty. Public-chain edge pools and bot not live. | +| **Destination tokens (cW\*)** | ⚠️ `deployed:Y / wired:Y / funded:? / verified:? / healthy:?` on 9 chains; `deployed:N` on Celo + Wemix | cWUSDT + cWUSDC deployed on 9 chains (1, 10, 25, 56, 100, 137, 8453, 42161, 43114). cWEURC / cWEURT additionally deployed on 10, 56, 100, 137, 42161, 8453, 43114. cWAUSDT + cWUSDW deployed on 56 + 43114. Source of truth: [`cross-chain-pmm-lps/config/deployment-status.json`](../../cross-chain-pmm-lps/config/deployment-status.json) at submodule pin — `42220` and `1111` have `cwTokens={}` and `bridgeAvailable=false`. Healthy status per chain depends on operator-held mesh matrix (not committed). | +| **Destination DODO/Uniswap LPs** | ⚠️ `deployed:N` on public chains | cross-chain-pmm-lps **pool-matrix** defines cW*/USDC and cW*/USDT per chain; `pmmPools` arrays in [`deployment-status.json`](../../cross-chain-pmm-lps/config/deployment-status.json) are empty for every chain. Public-chain edge pools + bot not wired. | | **Uniswap on 138** | ❌ | No Uniswap V2/V3 factory on Chain 138. | | **Uniswap on ALL Mainnet (651940)** | ⚠️ Env placeholders | HYDX DEX present; Uniswap V2/V3 and DODO env vars in dex-factories; no pool addresses in repo. | diff --git a/docs/11-references/STATUS_VOCABULARY.md b/docs/11-references/STATUS_VOCABULARY.md new file mode 100644 index 00000000..dbed78f6 --- /dev/null +++ b/docs/11-references/STATUS_VOCABULARY.md @@ -0,0 +1,67 @@ +# Deployment Status Vocabulary (5-axis) + +**Last Updated:** 2026-04-19 +**Purpose:** Replace the ad-hoc mix of "live", "deferred", "tabled", "complete", and "done" used across deployment docs with a single five-axis grid so a reader can see *which* sense of "done" applies. + +--- + +## Why + +Earlier docs conflated five independent conditions under single adjectives. The wave-1 completion artifact ([`reports/extraction/promod-uniswap-v2-phase2-wave1-completion-status-latest.json`](../../reports/extraction/promod-uniswap-v2-phase2-wave1-completion-status-latest.json)) shows the canonical example: `overall_status = "complete"` for deployment + liquidity on 10 chains, but explorer publication is blocked. Both facts are true; neither is useful on its own without the axis label. + +## The five axes + +Apply each axis independently. An item is "complete" only if every axis it needs to satisfy is `✅`. + +| Axis | Meaning | Ground truth / how to check | +|------|---------|---------| +| **deployed** | Contract or token bytecode exists at the expected address on the expected chain. | On-chain `eth_getCode(addr)` returns non-`0x`. | +| **wired** | Counter-party / peer address has been registered and the destination is reachable end-to-end. | Contract-specific: e.g. CCIP `addDestination(selector, receiver)` applied + matching registration on destination; token registry entry present; DEX pool registered with router. | +| **funded** | Resources required for live operation are above threshold. | Specific to the component: native gas on deployer, LINK on bridges, initial liquidity in PMM pools, oracle-feed balances, etc. | +| **explorer-verified** | Source code published on the chain's block explorer (Etherscan / Blockscout / Celoscan / etc.). | Explorer shows verified-source badge; matches runtime bytecode. | +| **healthy** | Smoke test / monitoring probe passes under current conditions. | Chain-specific operator check: price tick, bridge round-trip, swap round-trip, etc. | + +## Canonical shorthand + +When inlining in a table, use a single-line 5-axis shorthand: `deployed:Y / wired:Y / funded:N / verified:N / healthy:?`. Order is fixed so the shorthand is scannable. + +## Mapping from legacy adjectives + +Old narrative docs used any of the following; use this table to translate when reading legacy text, and prefer the 5-axis form when editing: + +| Legacy term | Means (historically) | Preferred 5-axis equivalent | +|-------------|----------------------|-----------------------------| +| "live" | contract bytecode on-chain, possibly unwired | `deployed:Y` plus whichever of wired / funded / healthy actually apply | +| "deployed" | same as "live" — bytecode present | `deployed:Y` | +| "wired" | counter-party registered | `wired:Y` | +| "done" / "complete" | usually covers deployed + wired, rarely verified or healthy | state all five axes explicitly | +| "tabled" | a specific axis is unmet and blocks progress | state which axis blocks (usually `funded:N` or external dependency) | +| "deferred" | synonym of tabled | same | +| "design-only" / "placeholder" | nothing deployed | all five axes `N` | +| "partial" | some subset satisfied, ambiguous which | replace with explicit 5-axis line | + +## Scope of application + +Apply this vocabulary to: + +- [`docs/11-references/DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md`](DEPLOYED_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md) +- [`docs/03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md`](../03-deployment/REMAINING_DEPLOYMENTS_FOR_FULL_NETWORK_COVERAGE.md) +- [`docs/03-deployment/WEMIX_ACQUISITION_TABLED.md`](../03-deployment/WEMIX_ACQUISITION_TABLED.md) +- [`docs/07-ccip/CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md`](../07-ccip/CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING.md) when refreshed +- Any new or updated status tracker + +Generated artifact reports in `reports/extraction/` and `reports/status/` are the source of truth for axis values; narrative docs should cite the relevant artifact and not re-state per-chain data that the artifact already captures. + +## Example + +Wemix (Chain 1111) CCIP bridges, on 2026-04-19: + +> `deployed:? / wired:N / funded:N / verified:? / healthy:N` — `deployment-status.json` at pin [`cross-chain-pmm-lps/config/deployment-status.json`](../../cross-chain-pmm-lps/config/deployment-status.json) reports `bridgeAvailable=false` and no cW* tokens on Chain 1111; [`WEMIX_ACQUISITION_TABLED.md`](../03-deployment/WEMIX_ACQUISITION_TABLED.md) records the funding gap (~0.4 WEMIX) that blocks further steps. On-chain `eth_getCode` against candidate bridge addresses on Chain 1111 is required before flipping `deployed` or `verified` from `?` — see [CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md](CROSS_CHAIN_CREATE_ADDRESS_COINCIDENCE.md) for why deterministic-CREATE addresses on Celo/Wemix/138 cannot be assumed equivalent. + +--- + +## Maintenance + +- When an axis changes, update the relevant narrative doc and cite the commit / artifact that changed the axis. +- Do not introduce new legacy terms ("done", "complete", "live" with no qualifier). If a term is unavoidable for flow, add the 5-axis shorthand in parentheses. +- If a new axis is genuinely needed (e.g., `audited`), propose it in a PR against this doc first, not inline in a status table.