From 2a6d3cfc7f765252f92066b511c898e957ebc546 Mon Sep 17 00:00:00 2001 From: defiQUG Date: Tue, 24 Mar 2026 22:50:52 -0700 Subject: [PATCH] Update submodule references and improve CI workflow - Update submodule references for explorer-monorepo and smom-dbis-138 to latest commits. - Modify CI workflow to include shellcheck installation and enforce error severity for script checks. - Update contract addresses in configuration and documentation to reflect the new canonical addresses for CCIPWETH9Bridge and CCIP Router. - Revise integration test documentation to align with updated contract addresses and deployment statuses. Made-with: Cursor --- .github/workflows/validate-omnl-rail.yml | 13 +- config/contract-addresses.conf | 4 +- config/routing-registry.json | 22 +-- .../ADDITIONAL_RECOMMENDATIONS_TABLE.md | 2 +- .../ALL_RECOMMENDATIONS_OPERATOR_ONLY.md | 2 +- docs/00-meta/ALL_TASKS_DETAILED_STEPS.md | 2 +- ...ETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md | 2 +- ...MARKDOWN_AUDIT_GAPS_AND_RECOMMENDATIONS.md | 6 +- .../E2E_COMPLETION_TASKS_DETAILED_LIST.md | 2 +- docs/00-meta/NEXT_STEPS_MASTER.md | 2 +- docs/00-meta/NEXT_STEPS_OPERATOR.md | 2 +- docs/00-meta/OPERATOR_READY_CHECKLIST.md | 2 +- .../REMAINING_ITEMS_FULL_PARALLEL_LIST.md | 2 +- .../REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md | 2 +- ...EMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md | 2 +- docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md | 2 +- docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md | 2 +- .../STILL_NOT_DONE_EXECUTION_CHECKLIST.md | 2 +- .../EXPLORER_METAMASK_TECHNICAL_RESPONSE.md | 6 +- .../MASTER_SECRETS_INVENTORY.md | 2 +- .../METAMASK_CONFIGURATION.md | 18 +- ...CKAGE_SCORE_ATTESTATION_4_995.EXAMPLE.json | 2 +- ...IONAL_PACKAGE_SCORE_ATTESTATION_4_995.json | 11 +- .../BSCSCAN_SUPPORT_DD_0xe0E932_BSC.md | 183 ++++++++++++++++++ docs/07-ccip/CCIP_SECURITY_DOCUMENTATION.md | 7 +- .../07-ccip/CCIP_SENDER_CONTRACT_REFERENCE.md | 9 +- .../NON_PREFUNDED_AVAX_MIGRATION_RUNBOOK.md | 2 +- .../BLOCKSCOUT_START_INSTRUCTIONS.md | 3 +- .../BLOCKSCOUT_VERIFICATION_GUIDE.md | 3 +- .../ADDRESS_MATRIX_AND_STATUS.md | 6 +- docs/11-references/CONTRACTS_TO_DEPLOY.md | 2 +- .../CONTRACT_ADDRESSES_REFERENCE.md | 13 +- ...NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md | 6 +- ...D_TOKENS_BRIDGES_LPS_AND_ROUTING_STATUS.md | 2 +- ...RACTS_INVENTORY_AND_VERIFICATION_STATUS.md | 6 +- .../DEPLOYER_TO_PUBLIC_STABLECOIN_ROUTES.md | 2 +- .../LINK_TOKEN_ADDRESSES_REFERENCE.md | 2 +- .../SMART_CONTRACTS_INVENTORY_ALL_CHAINS.md | 6 +- .../SMART_CONTRACTS_INVENTORY_SIMPLE.md | 8 +- docs/INTEGRATION_TEST_SUMMARY.md | 6 +- explorer-monorepo | 2 +- smom-dbis-138 | 2 +- transaction-package-HYBX-BATCH-001.zip | Bin 3467473 -> 3467557 bytes 43 files changed, 281 insertions(+), 101 deletions(-) create mode 100644 docs/07-ccip/BSCSCAN_SUPPORT_DD_0xe0E932_BSC.md diff --git a/.github/workflows/validate-omnl-rail.yml b/.github/workflows/validate-omnl-rail.yml index 5cbb779..10b3f42 100644 --- a/.github/workflows/validate-omnl-rail.yml +++ b/.github/workflows/validate-omnl-rail.yml @@ -13,6 +13,7 @@ on: paths: - 'scripts/omnl/**' - 'docs/04-configuration/mifos-omnl-central-bank/**' + - '.gitignore' - '.github/workflows/validate-omnl-rail.yml' jobs: @@ -29,10 +30,8 @@ jobs: - name: Transaction package CI smoke (fast ledger fixture) run: bash scripts/omnl/run-transaction-package-ci-smoke.sh - - name: Shellcheck (optional) - run: | - if command -v shellcheck >/dev/null 2>&1; then - shellcheck -x scripts/omnl/*.sh || true - else - echo "Shellcheck not installed; skipping." - fi + - name: Install shellcheck + run: sudo apt-get update -qq && sudo apt-get install -y shellcheck + + - name: Shellcheck scripts/omnl (severity error) + run: shellcheck -S error -x scripts/omnl/*.sh diff --git a/config/contract-addresses.conf b/config/contract-addresses.conf index c678e70..eea2039 100644 --- a/config/contract-addresses.conf +++ b/config/contract-addresses.conf @@ -11,8 +11,8 @@ ADDR_CCIP_RECEIVER="0xC12236C03b28e675d376774FCE2C2C052488430F" ADDR_VOTING="0x022267b26400114aF01BaCcb92456Fe36cfccD93" ADDR_CCIP_SENDER="0x105F8A15b819948a89153505762444Ee9f324684" -ADDR_CCIPWETH10_BRIDGE="0xF5a87528cEb72312979DB0C51509489caF940721" -ADDR_CCIPWETH9_BRIDGE="${CCIPWETH9_BRIDGE_CHAIN138:-0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5}" +ADDR_CCIPWETH10_BRIDGE="0xe0E93247376aa097dB308B92e6Ba36bA015535D0" +ADDR_CCIPWETH9_BRIDGE="${CCIPWETH9_BRIDGE_CHAIN138:-0xcacfd227A040002e49e2e01626363071324f820a}" # alltra-lifi-settlement ADDR_MERCHANT_SETTLEMENT="0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800" diff --git a/config/routing-registry.json b/config/routing-registry.json index 6a550c5..47f1b83 100644 --- a/config/routing-registry.json +++ b/config/routing-registry.json @@ -26,7 +26,7 @@ "toChain": 1, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -45,7 +45,7 @@ "toChain": 56, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -64,7 +64,7 @@ "toChain": 137, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -83,7 +83,7 @@ "toChain": 10, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -102,7 +102,7 @@ "toChain": 42161, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -121,7 +121,7 @@ "toChain": 43114, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -140,7 +140,7 @@ "toChain": 8453, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -159,7 +159,7 @@ "toChain": 100, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -178,7 +178,7 @@ "toChain": 25, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -197,7 +197,7 @@ "toChain": 42220, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, @@ -216,7 +216,7 @@ "toChain": 1111, "asset": "WETH", "pathType": "CCIP", - "bridgeAddress": "0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5", + "bridgeAddress": "0xcacfd227A040002e49e2e01626363071324f820a", "bridgeChainId": 138, "label": "CCIPWETH9Bridge" }, diff --git a/docs/00-meta/ADDITIONAL_RECOMMENDATIONS_TABLE.md b/docs/00-meta/ADDITIONAL_RECOMMENDATIONS_TABLE.md index 9837b6e..e45f74f 100644 --- a/docs/00-meta/ADDITIONAL_RECOMMENDATIONS_TABLE.md +++ b/docs/00-meta/ADDITIONAL_RECOMMENDATIONS_TABLE.md @@ -106,7 +106,7 @@ | R1 | Verify every deployed contract on Blockscout | After each deployment | | R2 | Keep CONTRACT_ADDRESSES_REFERENCE and ADDRESS_MATRIX_AND_STATUS updated | When new contracts deployed/deprecated | | R3 | Run check-contracts-on-chain-138.sh; fix MISSING/EMPTY | Periodically or after deploy | -| R4 | Use canonical CCIPWETH9Bridge (0x971c...); do not use deprecated | Always | +| R4 | Use canonical CCIPWETH9Bridge (`0xcacfd227A040002e49e2e01626363071324f820a`); do not use deprecated | Always | | R5 | Never commit .env or private keys; rotate if exposed | Always | | R6–R7 | API keys in .env; restrict deployer and RPC admin | Access review | | R8–R9 | Set RPC_URL_138; use GAS_PRICE on Chain 138 | Before deploy / every forge script | diff --git a/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md b/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md index ca33ebf..b1aad39 100644 --- a/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md +++ b/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md @@ -50,7 +50,7 @@ | # | Action | Notes | |---|--------|-------| -| R4 | Do not use deprecated CCIPWETH9Bridge; use 0x971c... and set env | Always | +| R4 | Do not use deprecated CCIPWETH9Bridge; use `0xcacfd227A040002e49e2e01626363071324f820a` and set env | Always | | R5 | Never commit .env or private keys; rotate exposed keys | Always | | R6 | API keys in .env.example placeholders | — | | R7 | Restrict deployer key and RPC admin access | Access review | diff --git a/docs/00-meta/ALL_TASKS_DETAILED_STEPS.md b/docs/00-meta/ALL_TASKS_DETAILED_STEPS.md index e9b569d..ba4cf9b 100644 --- a/docs/00-meta/ALL_TASKS_DETAILED_STEPS.md +++ b/docs/00-meta/ALL_TASKS_DETAILED_STEPS.md @@ -72,7 +72,7 @@ ### W0-2: sendCrossChain (real) -**Blocker:** `PRIVATE_KEY` and LINK approved in `.env`; bridge `0x971cD9D156f193df8051E48043C476e53ECd4693`. +**Blocker:** `PRIVATE_KEY` and LINK approved in `.env`; bridge `0xcacfd227A040002e49e2e01626363071324f820a`. **Steps:** diff --git a/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md b/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md index 845b3f5..e237b51 100644 --- a/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md +++ b/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md @@ -11,7 +11,7 @@ | Task | Blocker | Command / doc | |------|---------|----------------| | W0-1 NPMplus RPC fix (405) | Host on LAN (192.168.11.x) | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-1. `bash scripts/run-wave0-from-lan.sh` or `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh`. | -| W0-2 sendCrossChain (real) | PRIVATE_KEY, LINK approved | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-2. `bash scripts/bridge/run-send-cross-chain.sh [recipient]`. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. | +| W0-2 sendCrossChain (real) | PRIVATE_KEY, LINK approved | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-2. `bash scripts/bridge/run-send-cross-chain.sh [recipient]`. Bridge: `0xcacfd227A040002e49e2e01626363071324f820a`. | | W0-3 NPMplus backup | NPM_PASSWORD in .env | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-3. `bash scripts/verify/backup-npmplus.sh` or `scripts/run-wave0-from-lan.sh`. | --- diff --git a/docs/00-meta/DOTENV_AND_MARKDOWN_AUDIT_GAPS_AND_RECOMMENDATIONS.md b/docs/00-meta/DOTENV_AND_MARKDOWN_AUDIT_GAPS_AND_RECOMMENDATIONS.md index a796fb7..3bef5fb 100644 --- a/docs/00-meta/DOTENV_AND_MARKDOWN_AUDIT_GAPS_AND_RECOMMENDATIONS.md +++ b/docs/00-meta/DOTENV_AND_MARKDOWN_AUDIT_GAPS_AND_RECOMMENDATIONS.md @@ -27,7 +27,7 @@ | **PRIVATE_KEY** | Deploy, bridge send, forge script | 64-char hex; same wallet holds LINK for CCIP fees | | **RPC_URL_138** | Deploy, verify, on-chain checks | Use IP:port for deploy: `http://192.168.11.211:8545` | | **ETH_MAINNET_RPC_URL** / **ETHEREUM_MAINNET_RPC** | Mainnet verify, CCIP, relay | Infura/Alchemy | -| **CCIPWETH9_BRIDGE_CHAIN138**, **CCIPWETH10_BRIDGE_CHAIN138** | Bridge scripts, token-aggregation, routing | Canonical: WETH9 `0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5`; WETH10 see §3 gap | +| **CCIPWETH9_BRIDGE_CHAIN138**, **CCIPWETH10_BRIDGE_CHAIN138** | Bridge scripts, token-aggregation, routing | Canonical: WETH9 `0xcacfd227A040002e49e2e01626363071324f820a`; WETH10 `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | | **CHAIN_138_DODO_PMM_INTEGRATION** | Token-aggregation indexer, quotes | `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` | | **CUSDT_ADDRESS_138**, **CUSDC_ADDRESS_138** | Scripts, token-aggregation | Canonical in EXPLORER_TOKEN_LIST_CROSSCHECK §5 | | **DATABASE_URL** | Token-aggregation DB, migrations | When using PostgreSQL (e.g. VMID 5000) | @@ -83,8 +83,8 @@ | Gap | Location | Recommendation | |-----|----------|----------------| -| **CCIPWETH10 on Chain 138** | CONTRACT_ADDRESSES_REFERENCE.md: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0`. Reconcile script / some code may output `0xF5a87528cEb72312979DB0C51509489caF940721`. routing-registry.json and cross-chain-bridges use `0xe0E932...`. | Verify on Blockscout which contract is the active CCIP WETH10 bridge; align reconcile script and env.additions.example to that address. | -| **CCIPWETH9 on Chain 138** | Docs mention both `0x971cD9...` and `0x9cba0D04...`. On-chain check and routing-registry use `0x9cba0D04...`. | Treat `0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5` as canonical for “working” WETH9 bridge; document the other in CONTRACT_ADDRESSES_REFERENCE as alternate/deploy if applicable. | +| **CCIPWETH10 on Chain 138** | CONTRACT_ADDRESSES_REFERENCE.md: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0`. Older bootstrap defaults may still mention `0xF5a87528cEb72312979DB0C51509489caF940721`, but the active routing registry and env-backed defaults now use `0xe0E932...`. | Keep `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` as the canonical WETH10 bridge and update any remaining legacy bootstrap references if they resurface. | +| **CCIPWETH9 on Chain 138** | Docs mention both `0x971cD9...` and `0xcacfd227...`. On-chain check and routing-registry use `0xcacfd227...`. | Treat `0xcacfd227A040002e49e2e01626363071324f820a` as canonical for “working” WETH9 bridge; document the other in CONTRACT_ADDRESSES_REFERENCE as alternate/deploy if applicable. | ### 4.2 Missing or placeholder env diff --git a/docs/00-meta/E2E_COMPLETION_TASKS_DETAILED_LIST.md b/docs/00-meta/E2E_COMPLETION_TASKS_DETAILED_LIST.md index c1c9096..a023fb3 100644 --- a/docs/00-meta/E2E_COMPLETION_TASKS_DETAILED_LIST.md +++ b/docs/00-meta/E2E_COMPLETION_TASKS_DETAILED_LIST.md @@ -53,7 +53,7 @@ Tasks below do **not** depend on obtaining API keys (Li.Fi, CoinGecko, etc.). Th | ID | Task | Type | Prerequisite | Command / note | |----|------|------|--------------|----------------| | **W0-1** | NPMplus RPC fix (405) | Op | Host on LAN | `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh` — or `bash scripts/run-wave0-from-lan.sh` (omit `--skip-rpc-fix`). | -| **W0-2** | sendCrossChain (real) | Op | PRIVATE_KEY, LINK approved for fee | `scripts/bridge/run-send-cross-chain.sh [recipient]` — omit `--dry-run`. Bridge: 0x971cD9D156f193df8051E48043C476e53ECd4693. | +| **W0-2** | sendCrossChain (real) | Op | PRIVATE_KEY, LINK approved for fee | `scripts/bridge/run-send-cross-chain.sh [recipient]` — omit `--dry-run`. Bridge: `0xcacfd227A040002e49e2e01626363071324f820a`. | | **W0-3** | NPMplus backup | Op | NPM_PASSWORD in .env, NPMplus up | `bash scripts/verify/backup-npmplus.sh`. Or `scripts/run-wave0-from-lan.sh` (omit `--skip-backup`). | **Combined (W0-1 + W0-3):** `bash scripts/run-wave0-from-lan.sh` from LAN (options: `--dry-run`, `--skip-backup`, `--skip-rpc-fix`). diff --git a/docs/00-meta/NEXT_STEPS_MASTER.md b/docs/00-meta/NEXT_STEPS_MASTER.md index 290b581..236ca25 100644 --- a/docs/00-meta/NEXT_STEPS_MASTER.md +++ b/docs/00-meta/NEXT_STEPS_MASTER.md @@ -28,7 +28,7 @@ This document is the **single source of truth** for all next steps and remaining | Step | Task | Status | Notes | |------|------|--------|-------| -| 1 | Run `./scripts/deploy-and-configure-weth9-bridge-chain138.sh` (requires PRIVATE_KEY) | ✅ Done | Bridge at 0x971cD9D156f193df8051E48043C476e53ECd4693 | +| 1 | Run `./scripts/deploy-and-configure-weth9-bridge-chain138.sh` (requires PRIVATE_KEY) | ✅ Done | Bridge at `0xcacfd227A040002e49e2e01626363071324f820a` | | 2 | Set `export CCIPWETH9_BRIDGE_CHAIN138=` in shell and .env | ✅ Done | Set in smom-dbis-138/.env | | 3 | Execute sendCrossChain and verify transfer | ⏳ Pending | Ready for bridge operations | diff --git a/docs/00-meta/NEXT_STEPS_OPERATOR.md b/docs/00-meta/NEXT_STEPS_OPERATOR.md index e2fe5ca..632a097 100644 --- a/docs/00-meta/NEXT_STEPS_OPERATOR.md +++ b/docs/00-meta/NEXT_STEPS_OPERATOR.md @@ -65,7 +65,7 @@ bash scripts/bridge/run-send-cross-chain.sh 0.01 bash scripts/bridge/run-send-cross-chain.sh 0.01 0xYourRecipientAddress ``` -Bridge contract (reference): `0x971cD9D156f193df8051E48043C476e53ECd4693`. Ensure `CCIPWETH9_BRIDGE_CHAIN138` and `RPC_URL_138`/`CHAIN138_RPC` in `.env`. +Bridge contract (reference): `0xcacfd227A040002e49e2e01626363071324f820a`. Ensure `CCIPWETH9_BRIDGE_CHAIN138` and `RPC_URL_138`/`CHAIN138_RPC` in `.env`. ### W0-3: NPMplus backup (re-run anytime) diff --git a/docs/00-meta/OPERATOR_READY_CHECKLIST.md b/docs/00-meta/OPERATOR_READY_CHECKLIST.md index f8d2358..ddf536e 100644 --- a/docs/00-meta/OPERATOR_READY_CHECKLIST.md +++ b/docs/00-meta/OPERATOR_READY_CHECKLIST.md @@ -195,7 +195,7 @@ forge script script/bridge/trustless/DeployTrustlessBridge.s.sol:DeployTrustless ## 8. Wave 0: sendCrossChain (real) and NPMplus backup -**sendCrossChain (real):** Requires `PRIVATE_KEY` and LINK approved in `.env`. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. +**sendCrossChain (real):** Requires `PRIVATE_KEY` and LINK approved in `.env`. Bridge: `0xcacfd227A040002e49e2e01626363071324f820a`. ```bash bash scripts/bridge/run-send-cross-chain.sh 0.01 [recipient_address] diff --git a/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md b/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md index e0c0a36..c29e6b7 100644 --- a/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md +++ b/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md @@ -21,7 +21,7 @@ | ID | Task | Command / note | |----|------|------------------| | W0-1 | Apply NPMplus RPC fix (405) | From LAN: `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh` | -| W0-2 | Execute sendCrossChain (real) | Omit `--dry-run` in `run-send-cross-chain.sh`; LINK approved; bridge 0x971cD9D156f193df8051E48043C476e53ECd4693 | +| W0-2 | Execute sendCrossChain (real) | Omit `--dry-run` in `run-send-cross-chain.sh`; LINK approved; bridge `0xcacfd227A040002e49e2e01626363071324f820a` | | W0-3 | NPMplus backup (export/config) | NPM_PASSWORD in .env; `./scripts/backup/automated-backup.sh [--with-npmplus]` | --- diff --git a/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md b/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md index a5c36f2..d472760 100644 --- a/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md +++ b/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md @@ -29,7 +29,7 @@ | | Detail | |---|--------| -| **Needed** | `PRIVATE_KEY` in `.env` (wallet with gas + LINK for fees); bridge `0x971cD9D156f193df8051E48043C476e53ECd4693`; recipient address. | +| **Needed** | `PRIVATE_KEY` in `.env` (wallet with gas + LINK for fees); bridge `0xcacfd227A040002e49e2e01626363071324f820a`; recipient address. | | **Missing** | 1) A wallet private key you control. 2) LINK approved for the bridge fee (if the bridge charges LINK). 3) Optional: recipient address (script may have default). | | **Where to get** | **PRIVATE_KEY:** Create or use an existing funded wallet; set in root or `smom-dbis-138/.env`. **LINK:** On Chain 138, approve LINK for the bridge contract (amount depends on fee). **Recipient:** Any valid address on the destination chain. | | **Doc** | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-2; [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) §8. | diff --git a/docs/00-meta/REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md b/docs/00-meta/REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md index 7373754..2ff0fdf 100644 --- a/docs/00-meta/REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md +++ b/docs/00-meta/REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md @@ -26,7 +26,7 @@ Within each wave there are **no ordering requirements** between items; run them | Item | Status | Action | |------|--------|--------| -| **Execute sendCrossChain (real)** | ⏳ Pending | Remove `--dry-run` from `run-send-cross-chain.sh`; ensure LINK approved for fee token. Bridge at 0x971cD9D156f193df8051E48043C476e53ECd4693. | +| **Execute sendCrossChain (real)** | ⏳ Pending | Remove `--dry-run` from `run-send-cross-chain.sh`; ensure LINK approved for fee token. Bridge at 0xcacfd227A040002e49e2e01626363071324f820a. | | **Apply NPMplus RPC fix (405)** | ⏳ If RPC 405 | From a host on LAN: `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh` (sets block_exploits false for RPC). | | **CT 2301** | ✅ Resolved | Recreated 2026-02-04; Besu config may need reinstall (copy from 2101/2201). | diff --git a/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md b/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md index 58cb91d..8283efc 100644 --- a/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md +++ b/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md @@ -71,7 +71,7 @@ These can be done from your current environment (e.g. dev machine, WSL, CI) with ### W0-2: sendCrossChain (real) -**Blocker:** `PRIVATE_KEY` and LINK approved for fee in `.env`; bridge contract: `0x971cD9D156f193df8051E48043C476e53ECd4693`. +**Blocker:** `PRIVATE_KEY` and LINK approved for fee in `.env`; bridge contract: `0xcacfd227A040002e49e2e01626363071324f820a`. **Detailed steps:** diff --git a/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md b/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md index a677c1e..bfda385 100644 --- a/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md +++ b/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md @@ -10,7 +10,7 @@ | ID | Task | Detailed steps | |----|------|-----------------| | **W0-1** | NPMplus RPC fix (405) | ✅ Done (2026-02-06 run). Re-run from host on LAN if needed: `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh` | -| **W0-2** | Execute sendCrossChain (real) | 1) Ensure `PRIVATE_KEY` and LINK/fee token approved in `.env`. 2) Run `./scripts/bridge/run-send-cross-chain.sh [recipient]` **without** `--dry-run`. 3) Example: `./scripts/bridge/run-send-cross-chain.sh 0.01` or with recipient: `./scripts/bridge/run-send-cross-chain.sh 0.01 0xYourAddress`. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. | +| **W0-2** | Execute sendCrossChain (real) | 1) Ensure `PRIVATE_KEY` and LINK/fee token approved in `.env`. 2) Run `./scripts/bridge/run-send-cross-chain.sh [recipient]` **without** `--dry-run`. 3) Example: `./scripts/bridge/run-send-cross-chain.sh 0.01` or with recipient: `./scripts/bridge/run-send-cross-chain.sh 0.01 0xYourAddress`. Bridge: `0xcacfd227A040002e49e2e01626363071324f820a`. | | **W0-3** | NPMplus backup | 1) Set `NPM_PASSWORD` in `.env`. 2) When NPMplus container is up, run: `bash scripts/verify/backup-npmplus.sh` or `./scripts/backup/automated-backup.sh [--with-npmplus]`. 3) Re-run if previous backup had API/auth warnings. | --- diff --git a/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md b/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md index ad2d026..1a3e768 100644 --- a/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md +++ b/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md @@ -13,7 +13,7 @@ | # | Task | Command / doc | |---|------|----------------| | 1 | **W0-1 NPMplus RPC fix (405)** | From LAN: `bash scripts/run-wave0-from-lan.sh` or `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh`. Verify: `bash scripts/verify/verify-end-to-end-routing.sh`. | -| 2 | **W0-2 sendCrossChain (real)** | `bash scripts/bridge/run-send-cross-chain.sh [recipient]` (omit `--dry-run`). Requires PRIVATE_KEY and LINK approved. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. | +| 2 | **W0-2 sendCrossChain (real)** | `bash scripts/bridge/run-send-cross-chain.sh [recipient]` (omit `--dry-run`). Requires PRIVATE_KEY and LINK approved. Bridge: `0xcacfd227A040002e49e2e01626363071324f820a`. | | 3 | **W0-3 NPMplus backup** | `bash scripts/verify/backup-npmplus.sh` or `bash scripts/run-wave0-from-lan.sh` (no `--skip-backup`). Requires NPM_PASSWORD. | | 4 | **Blockscout verification** | `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh`. Retry one: `--only ContractName`. | | 5 | **Fix E2E 502s** | `./scripts/maintenance/run-all-maintenance-via-proxmox-ssh.sh --e2e` or `./scripts/maintenance/address-all-remaining-502s.sh --run-besu-fix --e2e`. Runbook: [502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md](502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md). | diff --git a/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md b/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md index e2694fc..afb89bb 100644 --- a/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md +++ b/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md @@ -29,7 +29,7 @@ - WETH9: `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` (same as Ethereum mainnet **by design**; canonical bytecode verified on 138) - WETH10: `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` - Bridges: - - WETH9 Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693` + - WETH9 Bridge: `0xcacfd227A040002e49e2e01626363071324f820a` - WETH10 Bridge: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` **5) EIP-1559** @@ -103,7 +103,7 @@ Chain 138 intentionally uses the **same addresses as Ethereum mainnet** for WETH |-----------------------|---------------------|--------| | **WETH9** (wrapped-native) | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` | Same as mainnet; canonical WETH9 bytecode verified on 138 (see `smom-dbis-138/scripts/verify-weth9-canonical.js`). | | **WETH10** | `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` | Same as mainnet. | -| **WETH9 Bridge** (CCIP) | `0x971cD9D156f193df8051E48043C476e53ECd4693` | In `config/contract-addresses.conf` as `ADDR_CCIPWETH9_BRIDGE`. | +| **WETH9 Bridge** (CCIP) | `0xcacfd227A040002e49e2e01626363071324f820a` | In `config/contract-addresses.conf` as `ADDR_CCIPWETH9_BRIDGE`. | | **WETH10 Bridge** (CCIP) | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | In `config/contract-addresses.conf` as `ADDR_CCIPWETH10_BRIDGE`. | So the **intended wrapped-native (WETH9-equivalent) address** on Chain 138 is **`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`**. The explorer is correct to show it; the chain is not “mainnet” but uses that address by design. @@ -155,7 +155,7 @@ Verification run: config and live endpoints checked against the values above. | RPC URL (HTTPS/WS) | `explorer-monorepo/frontend/public/explorer-spa.js` | `RPC_FQDN` = `https://rpc-http-pub.d-bis.org`, `RPC_WS_FQDN` = `wss://rpc-ws-pub.d-bis.org`, `RPC_IP` = `http://192.168.11.221:8545` | | ChainId | same file | `CHAIN_ID = 138`, MetaMask `chainId: '0x8A'` | | WETH9 / WETH10 | same file | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`, `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` | -| WETH9/WETH10 bridges | same file | `0x971cD9D156f193df8051E48043C476e53ECd4693`, `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | +| WETH9/WETH10 bridges | same file | `0xcacfd227A040002e49e2e01626363071324f820a`, `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | | Blockscout env | `scripts/run-blockscout-config-direct.sh` | `ETHEREUM_JSONRPC_HTTP_URL=http://192.168.11.221:8545`, `CHAIN_ID=138`, `ETHEREUM_JSONRPC_VARIANT=besu` | | API proxy | `explorer-monorepo/scripts/fix-nginx-serve-custom-frontend.sh` | `location /api/` → `proxy_pass http://127.0.0.1:4000` | diff --git a/docs/04-configuration/MASTER_SECRETS_INVENTORY.md b/docs/04-configuration/MASTER_SECRETS_INVENTORY.md index 6f52320..9b6467b 100644 --- a/docs/04-configuration/MASTER_SECRETS_INVENTORY.md +++ b/docs/04-configuration/MASTER_SECRETS_INVENTORY.md @@ -66,7 +66,7 @@ This document provides a comprehensive master list of all secrets discovered acr | Secret Name | Location | Value | Status | |------------|----------|-------|--------| | `LINK_TOKEN` | Multiple `.env` files | `0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03` | ✅ Public | -| `CCIP_ROUTER` | Multiple `.env` files | `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` | ✅ Public | +| `CCIP_ROUTER` | Multiple `.env` files | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | ✅ Public | | `CCIP_FEE_TOKEN` | Multiple `.env` files | `0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03` | ✅ Public | | `TOKEN_FACTORY` | `proxmox/smom-dbis-138/.env` | `0xEBFb5C60dE5f7C4baae180CA328D3BB39E1a5133` | ✅ Public | | `TOKEN_REGISTRY_ADDRESS` | `proxmox/smom-dbis-138/.env` | `0x91Efe92229dbf7C5B38D422621300956B55870Fa` | ✅ Public | diff --git a/docs/04-configuration/METAMASK_CONFIGURATION.md b/docs/04-configuration/METAMASK_CONFIGURATION.md index 2d657c2..62a0c9e 100644 --- a/docs/04-configuration/METAMASK_CONFIGURATION.md +++ b/docs/04-configuration/METAMASK_CONFIGURATION.md @@ -21,18 +21,15 @@ Since transactions sent via MetaMask (like nonce 25) work successfully, configur ### WETH9 Bridge Configuration -**Contract Address**: `0x89dd12025bfCD38A168455A44B400e913ED33BE2` +**Contract Address**: `0xcacfd227A040002e49e2e01626363071324f820a` **Function**: `addDestination(uint64,address)` **Parameters**: - `chainSelector`: `5009297550715157269` (Ethereum Mainnet) -- `destination`: `0x8078a09637e47fa5ed34f626046ea2094a5cde5e` +- `destination`: `0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6` -**Calldata** (for reference): -``` -0x4c4c4c4c5009297550715157269000000000000000000000008078a09637e47fa5ed34f626046ea2094a5cde5e -``` +**Calldata**: Generate it with `cast calldata "addDestination(uint64,address)" 5009297550715157269 0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6` ### WETH10 Bridge Configuration @@ -42,7 +39,7 @@ Since transactions sent via MetaMask (like nonce 25) work successfully, configur **Parameters**: - `chainSelector`: `5009297550715157269` (Ethereum Mainnet) -- `destination`: `0x105f8a15b819948a89153505762444ee9f324684` +- `destination`: `0x04E1e22B0D41e99f4275bd40A50480219bc9A223` --- @@ -51,15 +48,15 @@ Since transactions sent via MetaMask (like nonce 25) work successfully, configur 1. **Connect to ChainID 138** in MetaMask 2. **Go to "Send" or use a dApp interface** 3. **For WETH9**: - - To: `0x89dd12025bfCD38A168455A44B400e913ED33BE2` + - To: `0xcacfd227A040002e49e2e01626363071324f820a` - Data: Use function `addDestination(uint64,address)` with parameters: - `5009297550715157269` - - `0x8078a09637e47fa5ed34f626046ea2094a5cde5e` + - `0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6` 4. **For WETH10**: - To: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` - Data: Use function `addDestination(uint64,address)` with parameters: - `5009297550715157269` - - `0x105f8a15b819948a89153505762444ee9f324684` + - `0x04E1e22B0D41e99f4275bd40A50480219bc9A223` --- @@ -77,4 +74,3 @@ Expected: 7/7 networks configured ✅ --- **Last Updated**: $(date) - diff --git a/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.EXAMPLE.json b/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.EXAMPLE.json index 8054fb9..2d760ba 100644 --- a/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.EXAMPLE.json +++ b/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.EXAMPLE.json @@ -24,7 +24,7 @@ "dateUtc": "REPLACE_ISO_UTC" }, { - "role": "General Counsel", + "role": "Chief Legal Officer", "name": "REPLACE_NAME", "dateUtc": "REPLACE_ISO_UTC" } diff --git a/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.json b/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.json index 2d18916..6d3a40e 100644 --- a/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.json +++ b/docs/04-configuration/mifos-omnl-central-bank/INSTITUTIONAL_PACKAGE_SCORE_ATTESTATION_4_995.json @@ -24,12 +24,17 @@ "dateUtc": "2026-03-25T21:00:00Z" }, { - "role": "General Counsel", + "role": "Chief Legal Officer", "name": "TRH. Pandora C. Walker, Esq.", "dateUtc": "2026-03-25T21:00:00Z" + }, + { + "role": "Director", + "name": "Mr. Romeo L. Miles", + "dateUtc": "2026-03-25T21:00:00Z" } ], - "rosterCrossReference": "Mr. Romeo L. Miles is listed on the OMNL banking directors and officers roster (Appendix/OMNL_BANKING_DIRECTORS_AND_LEI.md).", + "rosterCrossReference": "All three signatories appear on the OMNL banking directors and officers roster (Appendix/OMNL_BANKING_DIRECTORS_AND_LEI.md). Adjust formal titles in board resolutions and SUBREG if they differ from the roles listed here.", "provenance": { "hybxLedgerSource": "215k-row hybx_batch_001_ledger.csv generated by scripts/omnl/generate-transaction-package-evidence.py (HYBX-BATCH-001); if institution asserts different system-of-record, update this field and rebuild package.", "omnlSnapshotApiBase": "Redacted — live GET /offices + /glaccounts via OMNL_FINERACT_BASE_URL (tenant omnl)." @@ -45,5 +50,5 @@ "reportPdfSha256": "4129431831deaf7602e782c31bf851c4443386d0760742fceb438132c74f5dac", "reportBindingNote": "SHA-256 of Appendix/INDEPENDENT_AUDIT_4_995_REQUIREMENTS_HYBX-BATCH-001.md (requirements exhibit). When audit report PDF is filed in SUBREG, run scripts/omnl/patch-attestation-subreg-pdf-hashes.sh and rebuild the zip." }, - "assertion": "OMNL certifies that the criteria in Appendix/INDONESIA_PACKAGE_4_995_EVIDENCE_STANDARD.md are satisfied for this package and that category scores are fair. Signatories are the Chief Compliance Officer and General Counsel named above, cross-referenced to Appendix/OMNL_BANKING_DIRECTORS_AND_LEI.md. Wet signature or QES artifacts for the same officers should be filed in HYBX-BATCH-001-SUBREG per institutional policy." + "assertion": "OMNL certifies that the criteria in Appendix/INDONESIA_PACKAGE_4_995_EVIDENCE_STANDARD.md are satisfied for this package and that category scores are fair. Signatories are the Chief Compliance Officer, Chief Legal Officer, and Director named above, cross-referenced to Appendix/OMNL_BANKING_DIRECTORS_AND_LEI.md. Wet signature or QES artifacts for the same officers should be filed in HYBX-BATCH-001-SUBREG per institutional policy." } diff --git a/docs/07-ccip/BSCSCAN_SUPPORT_DD_0xe0E932_BSC.md b/docs/07-ccip/BSCSCAN_SUPPORT_DD_0xe0E932_BSC.md new file mode 100644 index 0000000..fd117c9 --- /dev/null +++ b/docs/07-ccip/BSCSCAN_SUPPORT_DD_0xe0E932_BSC.md @@ -0,0 +1,183 @@ +# BscScan support package — due diligence + +**Contract (BNB Smart Chain, chain id 56):** `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` +**Explorer:** [bscscan.com/address/0xe0e93247376aa097db308b92e6ba36ba015535d0](https://bscscan.com/address/0xe0e93247376aa097db308b92e6ba36ba015535d0) +**Purpose:** Evidence and narrative for BscScan support / token update review (impersonation warning, `# Suspicious`, `Suspicious_Token20774`). + +**Prepared:** 2026-03-25 (repo snapshot). Refresh on-chain dates and balances when submitting. + +--- + +## 1. Executive summary + +- The contract on **BSC** is a **verified** `WETH` token: standard **WETH9-style** wrap/unwrap of **native BNB** (deposit/withdraw), **not** a honeypot masquerading as unrelated bytecode. +- **Name/symbol** on-chain are `Wrapped Ether` / `WETH`, which triggers BscScan’s **impersonation** heuristics because the **commonly expected “WETH” on BSC** is the **Binance-Peg / canonical bridged ETH** token at a **different** address (see section 5). +- The **deployer** is the project’s known deployment key: `0x4A666F96fC8764181194447A7dFdb7d471b301C8` (used across this repository for Chain 138 and CCIP-related deployments). +- **Important nuance:** The **same 0x address** on **another chain** can be a **different contract**. On **Chain 138** and **Ethereum mainnet**, `0xe0E932…` is documented in this project as **CCIPWETH10Bridge** (different bytecode than the BSC `WETH.sol` instance). BscScan’s page reflects **BSC bytecode only** — verified as `WETH.sol`. + +**Ask to BscScan (suggested):** Review for **false positive** impersonation; consider **official nametag** or **token profile** clarifying “project-deployed wrapped native for CCIP/relay — not Binance-Peg WETH”; optionally suggest **distinct display name** if policy allows (on-chain strings may remain unchanged unless redeployed). + +--- + +## 2. On-chain facts (BSC) — verify before sending + +| Item | Value / action | +|------|----------------| +| **Address** | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | +| **Verification** | Contract source verified (exact match). Compiler **v0.8.20+commit.a1b79de6**, optimizer **200** runs, **london**. | +| **Contract name (verification)** | `WETH` | +| **Token strings** | `name` = Wrapped Ether, `symbol` = WETH, `decimals` = 18 | +| **Creator** | `0x4A666F96fC8764181194447A7dFdb7d471b301C8` | +| **Creation tx** | `0xf98a95e8c8399aeee513f874780e9896759124e9be3bfe5fd3a3882c67208d71` (confirm on BscScan) | +| **BscScan UI** | Impersonation banner; tags e.g. `Suspicious_Token20774`, `# Suspicious` | + +Re-check **holder count**, **liquidity**, and **recent transfers** on BscScan before submission; paste screenshots into the ticket if useful. + +--- + +## 3. Source code provenance (repository) + +The verified source matches the project’s `WETH.sol` (WETH9-style wrapper). Reference copy: + +- **File:** `smom-dbis-138/contracts/tokens/WETH.sol` +- **NatSpec** states intent for **ChainID 138** in the comment; on **BSC** the same artifact was deployed for **wrapped native** interoperability (comment is chain-specific wording, deployment is multi-chain). + +**Behavior (high level):** + +- `deposit()` / `receive()` credit `balanceOf` with `msg.value` (wrap native). +- `withdraw(uint256)` sends native back (unwrap). +- `totalSupply()` returns `address(this).balance`. +- Standard `transfer` / `transferFrom` / `approve` with allowance handling. + +No admin mint, no proxy upgrade hooks in this file — ordinary **non-upgradeable** wrapper pattern. + +--- + +## 4. Same address, different chains (clarification for reviewers) + +EVM addresses are **per-chain**. **Equal hex** across chains does **not** imply equal bytecode. + +| Network | Role of `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` in project docs | +|---------|---------------------------------------------------------------------| +| **BSC (56)** | `WETH.sol`-style token (BscScan verification). Relay config references this address on BSC as destination wrapped asset (see section 6). | +| **Chain 138** | **CCIPWETH10Bridge** — `contracts/ccip/CCIPWETH10Bridge.sol` (different contract than BSC bytecode). See `docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md`. | +| **Ethereum (1)** | **CCIPWETH10Bridge** at same hex per `smom-dbis-138/docs/deployment/CONTRACT_OWNERSHIP_VERIFICATION.md`. | + +**Polygon (137):** Project docs list **WETH9** at the **same** `0xe0e932…` address (another chain, wrapper deployment — confirm on Polygonscan if cited to BscScan). + +This explains why **Etherscan** may show a **bridge** at `0xe0…` while **BscScan** shows **WETH**: different chains, different deployed bytecode at the colliding address. + +--- + +## 5. Canonical “WETH” on BSC (contrast) + +Widely used **Binance-Peg Ethereum / BSC WETH** (bridged ETH representation) is **not** this contract. Example reference used in this repo’s routing/config context: + +- **BSC WETH (canonical / widely listed):** `0x2170Ed0880ac9A755fd29B2688956BD959F933F8` (verify against your token lists and BscScan’s official listings). + +**Our position:** `0xe0E932…` on BSC is a **separate**, **project-deployed** wrapper using **WETH9-like** `name`/`symbol` for **cross-chain naming parity**, **not** a claim to be the official Binance-Peg WETH contract. + +--- + +## 6. Internal configuration (evidence of legitimate use) + +**Relay / destination asset (BSC)** — `smom-dbis-138/services/relay/.env.bsc` (template in repo): + +- `DEST_CHAIN_ID=56` +- `DEST_WETH9_ADDRESS=0xe0E93247376aa097dB308B92e6Ba36bA015535D0` +- `RELAYER_ADDRESS=0x4A666F96fC8764181194447A7dFdb7d471b301C8` + +**Canonical project config:** + +- `config/contract-addresses.conf`: `ADDR_CCIPWETH10_BRIDGE="0xe0E93247376aa097dB308B92e6Ba36bA015535D0"` (Chain **138** bridge address — same hex, different chain than BSC token). + +**Public-facing / operator docs (non-exhaustive):** + +- `docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md` — CCIPWETH10Bridge on 138 +- `docs/11-references/ADDRESS_MATRIX_AND_STATUS.md` +- `docs/07-ccip/CCIP_SECURITY_DOCUMENTATION.md`, `CCIP_SENDER_CONTRACT_REFERENCE.md` +- `docs/04-configuration/METAMASK_CONFIGURATION.md` — bridge interactions on **138** (same hex as bridge, not BSC token) + +--- + +## 7. Ownership and control + +- **`WETH.sol`** has **no** owner/admin in code (see `CONTRACT_OWNERSHIP_VERIFICATION.md` pattern for other chains: “No ownership (standard ERC20)” for WETH9 deployments). +- **Deployer** `0x4A66…` is the consistent project deployer across CCIP and token scripts (see workspace operator docs). + +If BscScan requests **proof of control**: sign a message or complete **contract ownership** flows they specify; verified source already ties bytecode to published Solidity. + +--- + +## 8. Risk and honesty (for support and users) + +- **Users** must **never** trust **symbol “WETH”** alone on BSC — **always** verify **contract address** against the project’s published lists. +- The team **acknowledges** the **naming collision** with widely known WETH branding; ideal long-term mitigation is **distinct on-chain name/symbol** on **future** deployments (requires **new contract**, migration, and integrator updates). +- **This DD is not legal or investment advice** and does not guarantee BscScan will remove any flag. + +--- + +## 9. Suggested token profile text (token update form) + +Adapt to BscScan character limits and policies: + +> **Project:** [Your legal/project name] +> **Description:** Project-deployed WETH9-style wrapped **native BNB** for CCIP/relay and cross-chain testing. **Not** Binance-Peg Ethereum (`0x2170…933F8`). Do not confuse with official BSC bridged WETH. +> **Website / docs:** [Link to public doc listing this BSC address explicitly] +> **Social:** [Official channels] + +Link directly to this file or a **public** mirror that lists **BSC `0xe0E932…`** as **intentional**. + +--- + +## 10. Evidence checklist (attach to ticket) + +- [ ] Link to **BscScan** contract + **Read Contract** `name`/`symbol`/`decimals` +- [ ] **Creation transaction** link +- [ ] **Verified source** screenshot or link +- [ ] **Deployer** address and short bio (same as Chain 138 / CCIP docs) +- [ ] **Contrast:** canonical BSC WETH `0x2170…` vs this address (table) +- [ ] **Optional:** GitHub or public repo path to `smom-dbis-138/contracts/tokens/WETH.sol` (if repository is public) +- [ ] **Optional:** Signed message from deployer per BscScan instructions + +--- + +## 11. Draft message to BscScan support (template) + +Subject: **Token review — impersonation false positive — `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` (BSC)** + +Body (edit placeholders): + +> Hello BscScan team, +> +> We request review of the **impersonation / suspicious** flags on contract **`0xe0E93247376aa097dB308B92e6Ba36bA015535D0`** (BSC). +> +> **Facts:** +> - Contract is **verified** as a standard **WETH9-style** wrapper (`deposit`/`withdraw` native BNB); source matches our published `WETH.sol`. +> - **Deployer:** `0x4A666F96fC8764181194447A7dFdb7d471b301C8` (consistent across our CCIP deployments). +> - We are **not** claiming to be **Binance-Peg WETH** (`0x2170Ed0880ac9A755fd29B2688956BD959F933F8`). The on-chain **name/symbol** reuse is for cross-chain parity; we understand this collides with user expectations on BSC. +> - Note: the **same hex address** on **Ethereum/Chain 138** points to **different bytecode** (our CCIP bridge). BSC shows **only** the WETH wrapper. +> +> **Ask:** Reassess the **impersonation** classification; if appropriate, add an **official nametag** or allow an updated **token profile** clarifying “project wrapped BNB — not official BSC WETH.” +> +> Evidence: [links + attachments]. +> +> Thank you. + +--- + +## 12. References in this repository + +| Document | Relevance | +|----------|-----------| +| `smom-dbis-138/contracts/tokens/WETH.sol` | BSC-verified source match | +| `smom-dbis-138/contracts/ccip/CCIPWETH10Bridge.sol` | Bridge **on other chains** at same hex | +| `config/contract-addresses.conf` | Chain 138 bridge hex | +| `smom-dbis-138/services/relay/.env.bsc` | BSC destination wrapped asset | +| `docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md` | Chain 138 address matrix | +| `smom-dbis-138/docs/deployment/CONTRACT_OWNERSHIP_VERIFICATION.md` | Deployer / multi-chain table | +| `docs/11-references/TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md` | Deploy-all / WETH deploy behavior | + +--- + +**Document maintainer:** Update after any redeploy, rename, or BscScan decision; keep public-facing address list in sync. diff --git a/docs/07-ccip/CCIP_SECURITY_DOCUMENTATION.md b/docs/07-ccip/CCIP_SECURITY_DOCUMENTATION.md index 43c04e7..af503bb 100644 --- a/docs/07-ccip/CCIP_SECURITY_DOCUMENTATION.md +++ b/docs/07-ccip/CCIP_SECURITY_DOCUMENTATION.md @@ -15,7 +15,7 @@ ## 🔐 Contract Access Control ### CCIP Router -- **Address**: `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` +- **Address**: `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` - **Access Control**: Standard CCIP Router implementation - **Owner Function**: `owner()` function not available (may use different access control pattern) - **Admin Functions**: Standard CCIP Router admin functions @@ -27,12 +27,12 @@ - **Address**: `0x105F8A15b819948a89153505762444Ee9f324684` - **Access Control**: Standard CCIP Sender implementation - **Owner Function**: `owner()` function not available -- **Router Reference**: `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` +- **Router Reference**: `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` **Note**: Access control details need to be retrieved from contract source code or deployment logs. ### CCIPWETH9Bridge -- **Address**: Use env `CCIPWETH9_BRIDGE_CHAIN138` (set after `scripts/deploy-and-configure-weth9-bridge-chain138.sh`); canonical: `0x971cD9D156f193df8051E48043C476e53ECd4693`. **Deprecated (do not use):** `0x89dd12025bfCD38A168455A44B400e913ED33BE2` — old bridge with router mismatch. See [CONTRACT_INVENTORY_AND_VERIFICATION.md](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md). +- **Address**: Use env `CCIPWETH9_BRIDGE_CHAIN138` (set after `scripts/deploy-and-configure-weth9-bridge-chain138.sh`); canonical: `0xcacfd227A040002e49e2e01626363071324f820a`. **Deprecated (do not use):** `0x89dd12025bfCD38A168455A44B400e913ED33BE2` — old bridge with router mismatch. See [CONTRACT_INVENTORY_AND_VERIFICATION.md](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md). - **Access Control**: Bridge contract access control - **Owner Function**: `owner()` function not available - **Admin Functions**: Bridge-specific admin functions @@ -138,4 +138,3 @@ If contracts are verified on Blockscout, check the source code for: **Last Updated**: $(date) **Status**: ⚠️ **INCOMPLETE** - Owner addresses need to be retrieved - diff --git a/docs/07-ccip/CCIP_SENDER_CONTRACT_REFERENCE.md b/docs/07-ccip/CCIP_SENDER_CONTRACT_REFERENCE.md index ec31b7b..ff3d974 100644 --- a/docs/07-ccip/CCIP_SENDER_CONTRACT_REFERENCE.md +++ b/docs/07-ccip/CCIP_SENDER_CONTRACT_REFERENCE.md @@ -41,14 +41,14 @@ This is why this address appears in CCIP transfers - it's the **destination brid ## 🔗 Related Contracts ### CCIP Router -- **Address**: `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` +- **Address**: `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` - **Relationship**: The CCIP Sender interacts with the CCIP Router to send messages - **Fee Token**: `0x514910771AF9Ca656af840dff83E8264EcF986CA` (LINK) - **Base Fee**: 1000000000000000 wei - **Data Fee Per Byte**: 100000000 wei ### Bridge Contracts -- **CCIPWETH9Bridge**: Use env CCIPWETH9_BRIDGE_CHAIN138 or address `0x971cD9D156f193df8051E48043C476e53ECd4693`. **Deprecated (do not use):** `0x89dd12025bfCD38A168455A44B400e913ED33BE2` — old bridge, router mismatch. See [CONTRACT_INVENTORY_AND_VERIFICATION.md](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md). +- **CCIPWETH9Bridge**: Use env CCIPWETH9_BRIDGE_CHAIN138 or address `0xcacfd227A040002e49e2e01626363071324f820a`. **Deprecated (do not use):** `0x89dd12025bfCD38A168455A44B400e913ED33BE2` — old bridge, router mismatch. See [CONTRACT_INVENTORY_AND_VERIFICATION.md](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md). - **CCIPWETH10Bridge**: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` --- @@ -89,7 +89,7 @@ This is why this address appears in CCIP transfers - it's the **destination brid The CCIP Sender contract is used by the CCIP Monitor service. Configuration in `/opt/ccip-monitor/.env`: ```bash -CCIP_ROUTER_ADDRESS=0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e +CCIP_ROUTER_ADDRESS=0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817 CCIP_SENDER_ADDRESS=0x105F8A15b819948a89153505762444Ee9f324684 RPC_URL_138=http://192.168.11.211:8545 CHAIN_ID=138 @@ -270,7 +270,7 @@ The CCIP Monitor service (VMID 3501) listens to these events and tracks: CCIP_SENDER=0x105F8A15b819948a89153505762444Ee9f324684 # Related Contracts -CCIP_ROUTER=0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e +CCIP_ROUTER=0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817 LINK_TOKEN=0x514910771AF9Ca656af840dff83E8264EcF986CA # RPC Endpoint (admin/deployment) — use standard RPC_URL_138 @@ -286,4 +286,3 @@ EXPLORER_URL=https://explorer.d-bis.org/address/0x105F8A15b819948a89153505762444 **Last Updated**: $(date) **Status**: ✅ Contract deployed and operational on Chain 138 - diff --git a/docs/07-ccip/NON_PREFUNDED_AVAX_MIGRATION_RUNBOOK.md b/docs/07-ccip/NON_PREFUNDED_AVAX_MIGRATION_RUNBOOK.md index 402f2c6..0db8429 100644 --- a/docs/07-ccip/NON_PREFUNDED_AVAX_MIGRATION_RUNBOOK.md +++ b/docs/07-ccip/NON_PREFUNDED_AVAX_MIGRATION_RUNBOOK.md @@ -84,7 +84,7 @@ cast call 0xa4B9DD039565AeD9641D45b57061f99d9cA6Df08 "balanceOf(address)(uint256 Check source escrow: ```bash -cast call 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 "balanceOf(address)(uint256)" 0x9cba0D04Ae5f6f16e3C599025aB97a05c4A593d5 --rpc-url https://rpc-http-pub.d-bis.org +cast call 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 "balanceOf(address)(uint256)" 0xcacfd227A040002e49e2e01626363071324f820a --rpc-url https://rpc-http-pub.d-bis.org ``` ## 6. Related Files diff --git a/docs/08-monitoring/BLOCKSCOUT_START_INSTRUCTIONS.md b/docs/08-monitoring/BLOCKSCOUT_START_INSTRUCTIONS.md index aa26385..f68efd8 100644 --- a/docs/08-monitoring/BLOCKSCOUT_START_INSTRUCTIONS.md +++ b/docs/08-monitoring/BLOCKSCOUT_START_INSTRUCTIONS.md @@ -189,7 +189,7 @@ Or manually: Navigate to contract on Blockscout: - Oracle Proxy: https://explorer.d-bis.org/address/0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6 -- CCIP Router: https://explorer.d-bis.org/address/0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e +- CCIP Router: https://explorer.d-bis.org/address/0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817 ### 3. Check Verification Status @@ -208,4 +208,3 @@ Navigate to contract on Blockscout: --- **Last Updated**: $(date) - diff --git a/docs/08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md b/docs/08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md index 2241a5e..64004bf 100644 --- a/docs/08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md +++ b/docs/08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md @@ -172,7 +172,7 @@ forge verify-contract 0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6 \ --chain-id 138 --rpc-url "$RPC" --verifier blockscout --verifier-url "$VERIFIER" --flatten # CCIPWETH9Bridge -forge verify-contract 0x971cD9D156f193df8051E48043C476e53ECd4693 \ +forge verify-contract 0xcacfd227A040002e49e2e01626363071324f820a \ contracts/ccip/CCIPWETH9Bridge.sol:CCIPWETH9Bridge \ --chain-id 138 --rpc-url "$RPC" --verifier blockscout --verifier-url "$VERIFIER" --flatten @@ -286,4 +286,3 @@ If automated verification fails, you can verify contracts manually through the B **Last Updated**: 2026-02-23 **Status**: ✅ Ready for use with ChainID 138 - diff --git a/docs/11-references/ADDRESS_MATRIX_AND_STATUS.md b/docs/11-references/ADDRESS_MATRIX_AND_STATUS.md index cae4091..58a9407 100644 --- a/docs/11-references/ADDRESS_MATRIX_AND_STATUS.md +++ b/docs/11-references/ADDRESS_MATRIX_AND_STATUS.md @@ -62,9 +62,9 @@ | Contract | Address | Status | Notes | |----------|---------|--------|-------| -| CCIP Router | `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` | ✅ | | +| CCIP Router | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | ✅ | | | CCIP Sender | `0x105F8A15b819948a89153505762444Ee9f324684` | ✅ | | -| CCIPWETH9Bridge | `0x971cD9D156f193df8051E48043C476e53ECd4693` | ✅ | Use for sendCrossChain | +| CCIPWETH9Bridge | `0xcacfd227A040002e49e2e01626363071324f820a` | ✅ | Use for sendCrossChain | | CCIPWETH10Bridge | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | ✅ | | | CCIPWETH9Bridge (old) | `0x89dd12025bfCD38A168455A44B400e913ED33BE2` | ⛔ | Deprecated | @@ -188,7 +188,7 @@ Bridges (CCIPWETH9 / CCIPWETH10) and LINK funding per runbook. Addresses in `smo | POOL_CUSDTCUSDC | `0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8` | | POOL_CUSDTUSDT | `0xa3Ee6091696B28e5497b6F491fA1e99047250c59` | | POOL_CUSDCUSDC | `0x90bd9Bf18Daa26Af3e814ea224032d015db58Ea5` | -| CCIPWETH9_BRIDGE_CHAIN138 | `0x971cD9D156f193df8051E48043C476e53ECd4693` | +| CCIPWETH9_BRIDGE_CHAIN138 | `0xcacfd227A040002e49e2e01626363071324f820a` | | CCIPWETH10_BRIDGE_CHAIN138 | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | | LINK_TOKEN | `0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03` | | COMPLIANT_USDT_ADDRESS / cUSDT | `0x93E66202A11B1772E55407B32B44e5Cd8eda7f22` | diff --git a/docs/11-references/CONTRACTS_TO_DEPLOY.md b/docs/11-references/CONTRACTS_TO_DEPLOY.md index aa99c7a..a9f40ce 100644 --- a/docs/11-references/CONTRACTS_TO_DEPLOY.md +++ b/docs/11-references/CONTRACTS_TO_DEPLOY.md @@ -20,7 +20,7 @@ This document lists all contracts that have deployment scripts, grouped by repo | Contract | Script | Status | |----------|--------|--------| -| **CCIPWETH9Bridge** | `script/DeployCCIPWETH9Bridge.s.sol` | ✅ `0x971cD9D156f193df8051E48043C476e53ECd4693` | +| **CCIPWETH9Bridge** | `script/DeployCCIPWETH9Bridge.s.sol` | ✅ `0xcacfd227A040002e49e2e01626363071324f820a` | | **WETH9** (optional) | — | Pre-deployed in genesis | **Deploy (if needed):** `GAS_PRICE=1000000000 ./scripts/deploy-and-configure-weth9-bridge-chain138.sh` diff --git a/docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md b/docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md index da8f6a7..dc3ab5a 100644 --- a/docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md +++ b/docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md @@ -45,9 +45,9 @@ Contracts deployed after chain initialization: |----------|---------|--------|---------| | **Oracle Aggregator** | `0x99b3511a2d315a497c8112c1fdd8d508d4b1e506` | ✅ Deployed | Price feed aggregator (same address as Multicall — operator to confirm which contract is at this slot on explorer) | | **Oracle Proxy** | `0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6` | ✅ Deployed | **MetaMask price feed** | -| **CCIP Router** | `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` | ✅ Deployed | Cross-chain router | +| **CCIP Router** | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | ✅ Deployed | Cross-chain router | | **CCIP Sender** | `0x105F8A15b819948a89153505762444Ee9f324684` | ✅ Deployed | Cross-chain sender | [📄 Details](../07-ccip/CCIP_SENDER_CONTRACT_REFERENCE.md) | -| **CCIPWETH9Bridge** | `0x971cD9D156f193df8051E48043C476e53ECd4693` | ✅ Deployed | WETH9 cross-chain (working router) | **Use for sendCrossChain** | +| **CCIPWETH9Bridge** | `0xcacfd227A040002e49e2e01626363071324f820a` | ✅ Deployed | WETH9 cross-chain (working router) | **Use for sendCrossChain** | | **CCIPWETH10Bridge** | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | ✅ Deployed | WETH10 cross-chain | | | **MerchantSettlementRegistry** | `0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800` | ✅ Deployed | alltra-lifi-settlement | | | **WithdrawalEscrow** | `0xe77cb26eA300e2f5304b461b0EC94c8AD6A7E46D` | ✅ Deployed | alltra-lifi-settlement | | @@ -119,7 +119,7 @@ CHAIN_ID=138 ### CCIP Monitor Service (VMID 3501) ```bash -CCIP_ROUTER_ADDRESS=0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e +CCIP_ROUTER_ADDRESS=0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817 CCIP_SENDER_ADDRESS=0x105F8A15b819948a89153505762444Ee9f324684 RPC_URL_138=http://192.168.11.211:8545 CHAIN_ID=138 @@ -158,9 +158,9 @@ Use these addresses in config and .env. **smom-dbis-138/.env** has been reconcil | DebtRegistry | `0x95BC4A997c0670d5DAC64d55cDf3769B53B63C28` | | PolicyManager | `0x0C4FD27018130A00762a802f91a72D6a64a60F14` | | TokenImplementation | `0x0059e237973179146237aB49f1322E8197c22b21` | -| CCIPWETH9_BRIDGE_CHAIN138 | `0x971cD9D156f193df8051E48043C476e53ECd4693` | +| CCIPWETH9_BRIDGE_CHAIN138 | `0xcacfd227A040002e49e2e01626363071324f820a` | | LINK_TOKEN / CCIP_FEE_TOKEN | `0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03` | -| CCIP_ROUTER | `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` | +| CCIP_ROUTER | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | | UNIVERSAL_ASSET_REGISTRY | `0xAEE4b7fBe82E1F8295951584CBc772b8BBD68575` | | GOVERNANCE_CONTROLLER | `0xA6891D5229f2181a34D4FF1B515c3Aa37dd90E0e` | | UNIVERSAL_CCIP_BRIDGE | `0xCd42e8eD79Dc50599535d1de48d3dAFa0BE156F8` | @@ -200,9 +200,8 @@ Chain 138 WETH9 bridges (LINK fee and native ETH fee) have mainnet destination s | Address | Note | |---------|------| -| `0x89dd12025bfCD38A168455A44B400e913ED33BE2` | **Deprecated** — old CCIPWETH9Bridge with router mismatch (no code at router). Use **CCIPWETH9Bridge** at `0x971cD9D156f193df8051E48043C476e53ECd4693` instead. See [ADDRESS_MATRIX_AND_STATUS.md](ADDRESS_MATRIX_AND_STATUS.md). | +| `0x89dd12025bfCD38A168455A44B400e913ED33BE2` | **Deprecated** — old CCIPWETH9Bridge with router mismatch (no code at router). Use **CCIPWETH9Bridge** at `0xcacfd227A040002e49e2e01626363071324f820a` instead. See [ADDRESS_MATRIX_AND_STATUS.md](ADDRESS_MATRIX_AND_STATUS.md). | --- **Related:** [DEPLOYER_CONTRACTS_INVENTORY_AND_VERIFICATION_STATUS](DEPLOYER_CONTRACTS_INVENTORY_AND_VERIFICATION_STATUS.md) (all contracts by deployer, network, verified status) | [EXPLORER_TOKEN_LIST_CROSSCHECK](EXPLORER_TOKEN_LIST_CROSSCHECK.md) (Explorer /tokens vs repo token lists) | [ADDRESS_MATRIX_AND_STATUS](ADDRESS_MATRIX_AND_STATUS.md) (correlated matrix and status) | [EXPLORER_AND_BLOCKSCAN_REFERENCE](EXPLORER_AND_BLOCKSCAN_REFERENCE.md) (correct explorer vs blockscan.com) | [ADDRESS_MATRIX_AND_STATUS](ADDRESS_MATRIX_AND_STATUS.md) | [CONTRACTS_TO_DEPLOY](CONTRACTS_TO_DEPLOY.md) | [CHAIN138_TOKEN_ADDRESSES](CHAIN138_TOKEN_ADDRESSES.md) | [TOKEN_MAPPING_AND_MAINNET_ADDRESSES](../07-ccip/TOKEN_MAPPING_AND_MAINNET_ADDRESSES.md) (138↔Mainnet token mapping) - diff --git a/docs/11-references/CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md b/docs/11-references/CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md index 0c51f78..4cccdaa 100644 --- a/docs/11-references/CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md +++ b/docs/11-references/CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md @@ -64,9 +64,9 @@ for addr in \ 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f \ 0x99b3511a2d315a497c8112c1fdd8d508d4b1e506 \ 0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6 \ - 0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e \ + 0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817 \ 0x105F8A15b819948a89153505762444Ee9f324684 \ - 0x971cD9D156f193df8051E48043C476e53ECd4693 \ + 0xcacfd227A040002e49e2e01626363071324f820a \ 0xe0E93247376aa097dB308B92e6Ba36bA015535D0 \ 0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03 \ 0x93E66202A11B1772E55407B32B44e5Cd8eda7f22 \ @@ -108,7 +108,7 @@ Manual verification: https://explorer.d-bis.org/address/
#verify-contrac ### 3.2 Deprecated and security -- **Do not use** CCIPWETH9Bridge at `0x89dd12025bfCD38A168455A44B400e913ED33BE2`. Use only `0x971cD9D156f193df8051E48043C476e53ECd4693` and set `CCIPWETH9_BRIDGE_CHAIN138` in env. +- **Do not use** CCIPWETH9Bridge at `0x89dd12025bfCD38A168455A44B400e913ED33BE2`. Use only `0xcacfd227A040002e49e2e01626363071324f820a` and set `CCIPWETH9_BRIDGE_CHAIN138` in env. - **Secrets:** Never commit `.env` or private keys. Use [MASTER_SECRETS_INVENTORY](../04-configuration/MASTER_SECRETS_INVENTORY.md) and rotate any exposed keys. - **Access:** Restrict deployer key and RPC admin access (RPC_URL_138 = Chain 138 Core) to operators who need them. 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 5028230..25137da 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 @@ -61,7 +61,7 @@ | Destination | Bridge type | Contract (138) | Status | Notes | |-------------|-------------|----------------|--------|--------| -| Ethereum (1) | CCIP WETH9 / WETH10 | CCIPWETH9Bridge `0x971cD9D156f193df8051E48043C476e53ECd4693`, CCIPWETH10Bridge `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | ✅ | Relay path to mainnet (CCIPRelayBridge). | +| Ethereum (1) | CCIP WETH9 / WETH10 | CCIPWETH9Bridge `0xcacfd227A040002e49e2e01626363071324f820a`, CCIPWETH10Bridge `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | ✅ | Relay path to mainnet (CCIPRelayBridge). | | BSC (56) | CCIP | Same bridges + addDestination(selector, receiver) | ✅ | Per CCIP_BRIDGE_DESTINATIONS_AND_LINK_FUNDING. | | Polygon (137) | CCIP | Same | ✅ | | | Arbitrum (42161) | CCIP | Same | ✅ | | diff --git a/docs/11-references/DEPLOYER_CONTRACTS_INVENTORY_AND_VERIFICATION_STATUS.md b/docs/11-references/DEPLOYER_CONTRACTS_INVENTORY_AND_VERIFICATION_STATUS.md index 25f2b01..e725f62 100644 --- a/docs/11-references/DEPLOYER_CONTRACTS_INVENTORY_AND_VERIFICATION_STATUS.md +++ b/docs/11-references/DEPLOYER_CONTRACTS_INVENTORY_AND_VERIFICATION_STATUS.md @@ -63,9 +63,9 @@ Explorer: https://explorer.d-bis.org | Contract | Address | Deployed by | Verified | |----------|---------|-------------|----------| -| CCIP Router | `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` | Deployer | Unknown | +| CCIP Router | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | Deployer | Unknown | | CCIP Sender | `0x105F8A15b819948a89153505762444Ee9f324684` | Deployer | Unknown | -| CCIPWETH9Bridge | `0x971cD9D156f193df8051E48043C476e53ECd4693` | Deployer | Unknown | +| CCIPWETH9Bridge | `0xcacfd227A040002e49e2e01626363071324f820a` | Deployer | Unknown | | CCIPWETH10Bridge | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | Deployer | Unknown | | CCIPReceiver (2026-02-13) | `0xC12236C03b28e675d376774FCE2C2C052488430F` | Deployer | Unknown | @@ -106,6 +106,8 @@ Explorer: https://explorer.d-bis.org ### DODO PMM / liquidity +> Note: the Chain 138 DODO stack is deployed and on-chain confirmed, but explorer source publication is still pending manual UI acceptance as of 2026-03-24. + | Contract | Address | Deployed by | Verified | |----------|---------|-------------|----------| | DODOPMMIntegration | `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` | Deployer | Unknown | diff --git a/docs/11-references/DEPLOYER_TO_PUBLIC_STABLECOIN_ROUTES.md b/docs/11-references/DEPLOYER_TO_PUBLIC_STABLECOIN_ROUTES.md index e620a49..6040f40 100644 --- a/docs/11-references/DEPLOYER_TO_PUBLIC_STABLECOIN_ROUTES.md +++ b/docs/11-references/DEPLOYER_TO_PUBLIC_STABLECOIN_ROUTES.md @@ -72,7 +72,7 @@ Tokens the deployer **can hold** as source (mintable to deployer on 138/Cronos, | From (138, deployer holds) | To (Mainnet public stable) | Route | Status | |----------------------------|----------------------------|--------|--------| -| WETH9 | WETH (then DEX) → USDT / USDC / DAI | CCIP WETH9 bridge `0x971cD9D156f193df8051E48043C476e53ECd4693` → Mainnet → swap via native DEX | ✅ Live (bridge); **requires Mainnet WETH funding of CCIPRelayBridge**; swap via DEX | +| WETH9 | WETH (then DEX) → USDT / USDC / DAI | CCIP WETH9 bridge `0xcacfd227A040002e49e2e01626363071324f820a` → Mainnet → swap via native DEX | ✅ Live (bridge); **requires Mainnet WETH funding of CCIPRelayBridge**; swap via DEX | | WETH10 | Same | CCIP WETH10 bridge `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` → Mainnet → DEX | ✅ Live; **same prerequisite** | | cUSDT | USDT / USDC / DAI | **No direct bridge.** Swap 138: cUSDT→cUSDC or cUSDT→WETH (no cUSDT→WETH pool documented); or cUSDT→cUSDC then no bridge for cUSDC. **Indirect:** cUSDT→cUSDC (DODO) then no 138→mainnet bridge for compliant stables. Use: **cUSDT/cUSDC → swap to WETH on 138 (no pool today)** then CCIP WETH→mainnet→DEX→USDT/USDC/DAI. | ⚠️ Swap leg on 138 to WETH not documented; bridge leg ✅ | | cUSDC | USDT / USDC / DAI | Same as cUSDT; need 138 cUSDC→WETH path (not in docs). Then CCIP WETH→mainnet→DEX. | ⚠️ Same | diff --git a/docs/11-references/LINK_TOKEN_ADDRESSES_REFERENCE.md b/docs/11-references/LINK_TOKEN_ADDRESSES_REFERENCE.md index a3ce244..4e8f08a 100644 --- a/docs/11-references/LINK_TOKEN_ADDRESSES_REFERENCE.md +++ b/docs/11-references/LINK_TOKEN_ADDRESSES_REFERENCE.md @@ -44,6 +44,6 @@ Use [Chainlink CCIP Supported Networks](https://docs.chain.link/ccip/supported-n To confirm the bridge fee token on Chain 138 (should match LINK above): ```bash -cast call 0x971cD9D156f193df8051E48043C476e53ECd4693 "feeToken()(address)" --rpc-url $RPC_URL_138 +cast call 0xcacfd227A040002e49e2e01626363071324f820a "feeToken()(address)" --rpc-url $RPC_URL_138 # Expected: 0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03 ``` diff --git a/docs/11-references/SMART_CONTRACTS_INVENTORY_ALL_CHAINS.md b/docs/11-references/SMART_CONTRACTS_INVENTORY_ALL_CHAINS.md index db89f5f..a3cbfd7 100644 --- a/docs/11-references/SMART_CONTRACTS_INVENTORY_ALL_CHAINS.md +++ b/docs/11-references/SMART_CONTRACTS_INVENTORY_ALL_CHAINS.md @@ -25,7 +25,7 @@ | WETH9, WETH10, Multicall | Genesis: 0xC02a..., 0xf4BB..., 0x99b3... | smom-dbis-138 | | Oracle Aggregator, Oracle Proxy | 0x99b3..., 0x3304b7... | smom-dbis-138 | | CCIP Router, CCIP Sender | 0x8078A0..., 0x105F8A... | smom-dbis-138 | -| CCIPWETH9Bridge, CCIPWETH10Bridge | 0x971cD9..., 0xe0E932... | smom-dbis-138 | +| CCIPWETH9Bridge, CCIPWETH10Bridge | 0xcacfd..., 0xe0E932... | smom-dbis-138 | | LINK, cUSDT, cUSDC | 0xb772..., 0x93E6..., 0xf222... | smom-dbis-138 | | TokenRegistry, TokenFactory | 0x91Efe..., 0xEBFb5C... | smom-dbis-138 | | Price Feed Keeper | 0xD3AD68... | smom-dbis-138 | @@ -35,7 +35,7 @@ | UniversalAssetRegistry, GovernanceController | 0xAEE4b7..., 0xA6891D... | smom-dbis-138 (phased core 2026-02-11) | | UniversalCCIPBridge, BridgeOrchestrator | 0xCd42e8..., 0x89aB42... | smom-dbis-138 (phased core 2026-02-11) | -**Deprecated (Chain 138):** CCIPWETH9Bridge at `0x89dd...` — do not use; use `0x971cD9D156f193df8051E48043C476e53ECd4693`. +**Deprecated (Chain 138):** CCIPWETH9Bridge at `0x89dd...` — do not use; use `0xcacfd227A040002e49e2e01626363071324f820a`. --- @@ -125,7 +125,7 @@ Summary: 1. **Chain 138:** Confirm all 26 deployed addresses on explorer.d-bis.org; run `./scripts/verify/check-contracts-on-chain-138.sh` and Blockscout verification; .env reconciled (one entry per variable). -2. **Deprecated:** Use CCIPWETH9Bridge `0x971c...` only; do not use `0x89dd...`. +2. **Deprecated:** Use CCIPWETH9Bridge `0xcacfd...` only; do not use `0x89dd...`. 3. **Phased core (138):** **Deployed 2026-02-11.** Addresses in CONTRACT_ADDRESSES_REFERENCE. To redeploy: run 01_DeployCore then 02_DeployBridges; set and document env. 4. **Trustless bridge:** Deploy from script/bridge/trustless/ when needed; update config/production placeholders. 5. **Mainnet/multichain:** Use DeployAll or chain-specific scripts; document addresses per chain. diff --git a/docs/11-references/SMART_CONTRACTS_INVENTORY_SIMPLE.md b/docs/11-references/SMART_CONTRACTS_INVENTORY_SIMPLE.md index a3acfa5..149153d 100644 --- a/docs/11-references/SMART_CONTRACTS_INVENTORY_SIMPLE.md +++ b/docs/11-references/SMART_CONTRACTS_INVENTORY_SIMPLE.md @@ -15,9 +15,9 @@ | **Multicall** | `0x99b3511a2d315a497c8112c1fdd8d508d4b1e506` | ✅ Deployed (genesis) | Confirm on Blockscout | | **Oracle Aggregator** | `0x99b3511a2d315a497c8112c1fdd8d508d4b1e506` | ✅ Deployed | Confirm on Blockscout (same slot as Multicall?) | | **Oracle Proxy** | `0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6` | ✅ Deployed | Confirm + verify (MetaMask price feed) | -| **CCIP Router** | `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` | ✅ Deployed | Confirm + verify | +| **CCIP Router** | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | ✅ Deployed | Confirm + verify | | **CCIP Sender** | `0x105F8A15b819948a89153505762444Ee9f324684` | ✅ Deployed | Verify on Blockscout | -| **CCIPWETH9Bridge** | `0x971cD9D156f193df8051E48043C476e53ECd4693` | ✅ Deployed | Use for sendCrossChain; verify | +| **CCIPWETH9Bridge** | `0xcacfd227A040002e49e2e01626363071324f820a` | ✅ Deployed | Use for sendCrossChain; verify | | **CCIPWETH10Bridge** | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | ✅ Deployed | Confirm + verify | | **LINK** | `0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03` | ✅ Deployed | Confirm (CCIP fees) | | **CompliantUSDT (cUSDT)** | `0x93E66202A11B1772E55407B32B44e5Cd8eda7f22` | ✅ Deployed | Confirm + verify | @@ -27,7 +27,7 @@ | **Price Feed Keeper** | `0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04` | ✅ Deployed | Confirm + verify | | **MerchantSettlementRegistry** | `0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800` | ✅ Deployed | Confirm + verify | | **WithdrawalEscrow** | `0xe77cb26eA300e2f5304b461b0EC94c8AD6A7E46D` | ✅ Deployed | Confirm + verify | -| **CCIPWETH9Bridge (old)** | `0x89dd12025bfCD38A168455A44B400e913ED33BE2` | ⛔ Deprecated | Do not use; use `0x971c...` above | +| **CCIPWETH9Bridge (old)** | `0x89dd12025bfCD38A168455A44B400e913ED33BE2` | ⛔ Deprecated | Do not use; use `0xcacfd...` above | | **AddressMapper** | `0x439Fcb2d2ab2f890DCcAE50461Fa7d978F9Ffe1A` | ✅ Deployed 2026-02-12 | Confirm on Blockscout | | **MirrorManager** | `0x6eD905A30c552a6e003061A38FD52A5A427beE56` | ✅ Deployed 2026-02-12 | Confirm on Blockscout | | **Trustless bridge** | LOCKBOX138 (deployed), INBOX_ETH, BOND_MANAGER, etc. | ⏳ Mainnet stack when needed | Chain 138: Lockbox138 only; rest mainnet | @@ -44,7 +44,7 @@ 1. **Confirm on-chain** — Run `./scripts/verify/check-contracts-on-chain-138.sh` (36 addresses) or open each address at https://explorer.d-bis.org/address/
. 2. **Verify source on Blockscout** — Use [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) and `scripts/verify/run-contract-verification-with-proxy.sh`. -3. **Do not use deprecated bridge** — Use **CCIPWETH9Bridge** at `0x971cD9D156f193df8051E48043C476e53ECd4693` only. +3. **Do not use deprecated bridge** — Use **CCIPWETH9Bridge** at `0xcacfd227A040002e49e2e01626363071324f820a` only. 4. **If deploying more contracts** — Use **`--with-gas-price 1000000000`** for all `forge script`/`forge create` on Chain 138. Phased core: [CONTRACTS_TO_DEPLOY](CONTRACTS_TO_DEPLOY.md), [CONTRACT_DEPLOYMENT_RUNBOOK](../03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md). RPC: Set `RPC_URL_138` in `smom-dbis-138/.env` (e.g. `http://192.168.11.211:8545` or `https://rpc-core.d-bis.org`). Set `PRIVATE_KEY` there too. 5. **Quick RPC check** — `cast code
--rpc-url https://rpc-core.d-bis.org` (non-empty = present). diff --git a/docs/INTEGRATION_TEST_SUMMARY.md b/docs/INTEGRATION_TEST_SUMMARY.md index da489f0..09588a3 100644 --- a/docs/INTEGRATION_TEST_SUMMARY.md +++ b/docs/INTEGRATION_TEST_SUMMARY.md @@ -12,7 +12,7 @@ **Status**: ✅ Service running and configured **Integration Points**: -- **CCIP Router**: `0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e` ✅ Deployed +- **CCIP Router**: `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` ✅ Deployed - **CCIP Sender**: `0x105F8A15b819948a89153505762444Ee9f324684` ✅ Deployed - **RPC Connection**: ✅ Configured @@ -45,7 +45,7 @@ ### 3. Bridge Contracts ⏳ **Contracts Deployed**: -- **CCIPWETH9Bridge**: Use \`CCIPWETH9_BRIDGE_CHAIN138\` or \`0x971cD9D156f193df8051E48043C476e53ECd4693\` ✅ Deployed. **Deprecated:** \`0x89dd12025bfCD38A168455A44B400e913ED33BE2\` (do not use). +- **CCIPWETH9Bridge**: Use \`CCIPWETH9_BRIDGE_CHAIN138\` or \`0xcacfd227A040002e49e2e01626363071324f820a\` ✅ Deployed. **Deprecated:** \`0x89dd12025bfCD38A168455A44B400e913ED33BE2\` (do not use). - **CCIPWETH10Bridge**: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` ✅ Deployed **Integration**: @@ -99,7 +99,7 @@ pct exec 3500 -- journalctl -u oracle-publisher -n 50 cast code 0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6 --rpc-url $RPC_URL # Test CCIP Router -cast code 0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e --rpc-url $RPC_URL +cast code 0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817 --rpc-url $RPC_URL ``` --- diff --git a/explorer-monorepo b/explorer-monorepo index ed86d01..d02ee71 160000 --- a/explorer-monorepo +++ b/explorer-monorepo @@ -1 +1 @@ -Subproject commit ed86d01e1dcef36056f0719fccda19326e7b9c68 +Subproject commit d02ee71cf64119c76cb1f7ffa83ebb7ee0a227bf diff --git a/smom-dbis-138 b/smom-dbis-138 index fc3a95d..a780eff 160000 --- a/smom-dbis-138 +++ b/smom-dbis-138 @@ -1 +1 @@ -Subproject commit fc3a95de08c95e1d0a96b640ea1fda99ac56510e +Subproject commit a780eff7c5215a6c2415ee8e7fcb9a765a7c7b29 diff --git a/transaction-package-HYBX-BATCH-001.zip b/transaction-package-HYBX-BATCH-001.zip index 45d362c4123b65ebdcce98e3412c2d02a9b2c19f..5df28c51f376dc58059ca294fc8df888a3115cfa 100644 GIT binary patch delta 23319 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
  • u-X@g(`>?4WbNF!qbpSe?vf{U8$zxmmXR-9 zy<8@gXCD1M*6p_5*n!lkp3HpDFO+Q2h1-Mn>1A(BZfm8LaZ@k5Q#zw13Ixga6Rjn+ zC!&3>XZw6rc3F?NRxmX_%W}yjc)_}0``_{ScLh^5S)J>m*Y~QLtd^^od_P9Ddo{Wt z!4IDR_+!SI6WqMlR6bQC)QL(5v-XFVS6df8#F0Mw_1FE)VX*ti{_`hKbbr*~V%p+$ z$X|@;K9Z+xG)1zaj(?Q-y2T-?V*T76k*H6hdynY+XqmqnA;&AXuF~x4P3dcU40ZK0 zc)Of*-6}PAeCE*~Y#Fw5h)SLJjORMlG}@I+y`h)XODr`Cm9h15CJ)&@qButUCxq>g zQqhTyv|<~@3kCh3Mh?IAs~K-De9GC;nt9VtGL&xFyCz>dz%Q@ITJU(G(yPgv#(eKM#x0p&^6!gS zWqHR}JM%?!k{2tx0#&`Ly=23HG|u{mD_;DR*th83$Ue(n{TV_>!uc~JTx>1<64zxC zBWA1aWr*^ynQaqY$Yj|{jU4QLgydyPPs3!M+INis|PeuUKh=5CeMA? zGEFY=JpE&KyUE^wkFFk3ivIoDjjD%E3JZZ_g#CfS>EZYRl{_&qUH0J8>3cixN|}Fd z&LRj|QQyvlu9*rwVX2ZoF~VhcL*tXB$bf3QOlqGX_ue@DzdPjx$>lkOf&&$%4fF6F zd_0pFGrb8Q5?Bb7m|(LI$qLxe1-1j3Ce60dMYn3PjM6#g%X* zyy^cG=rGECPk|YuY*qv;80D%WV1>#wCOW9?Gc0JrGc4%BGYDGxi`47+A}9ugIBqY~@Hn@R>F zNV2O6970KGB>?4;D)1Mhto{;^mz|&|y5i+xj_5`+FM$)I(b;NX#3+BLhLJIlIM=|) z8RYjhizIYBt6D%})K}C3Yere84(Kz=8Fg5Dk$S8gRS!#!fe+sR%o*iV4Osnf1D4OZ z5mp<6eP1ImVU$gpfF7g#unCwl%F@l?0Hd7H473>Kxn|%g+hbSEeJta2l45oZd!!R^Ee(wcwb;or3L z$B@-+z<@p&WuUY{sFi{MQ4je_Zly&y%4Lg6=^MhDatZURWpCLsTt?he%9 zQ<2IJ*llUaTbcth-5JCH7`7J+4hJv}oKOQuj2ck?4JfJ;0y!afJF)dA*af){X)I-z z)CJ^F8pi#VFG3ICEIizN-JNaGUSEr8qi<<&BNAb1&_lFe13nIwMK!~=tMLk|MfGWF zUl6 z?nkZ8kx*~}q<{pJ(0u#`&NOGT=s4OEY*CG_Qwg+BC@)iw$un3-9qSV=vs(=q@eou1x*rNKPN%#}Lwx z*mj$-u|Sj;e}t%r-0%Cf1^;S8mRtb@@HdgoZ-DF{G=-L^>%1I9%nYEBHN1h5v0Ks9 zvHia)hc-L)<4Wt-KnFVErH2Ve)S702IQB0-Au)xTZG$TLkg8-p?fyqXD2wH$mM?9)Rwhw_C)^w_7d+8XxRGhJG~RL+k;1P;i&WNoViH0AVjP zv{-06j=Dqgsh6-=vLGohhV&KUF$jd|3m&D*9E3$bj#Lc-^<^(0i^LFIzHP?<5)B)c zA*);f7g~{!1a(6aeNAM!7G zh0j6ya)!%<_zniD7z2>qF<=AA&+yDb_f~u@^5Pv(p{GoI`IR@A+k5bm#o&h`o8QA_ zxHK8G7-%m!!O38PgC#M8M`3eNm|j{8>`2jjSUU7sTz(G+9t_o8kHd*#4DTXLA7IJT mS^oGg0yDTh4&kcSuS%>`h67APv$D(v5VpC8WDH-JR0XB`w_`CEZAez_;~ze9k%V zdEejn$F&FJy62j;Vy>~qq;P5)dUA3a8ckUa77h;z3JMA8DmD&{3PGQ{*Giwe2EYdm za}f)Es{tTJmta>{LxzIY`TYg#XaK-RLV=8cf{Xx*832gEdMW@Ebl$(D{u=*FiWKH5 zHsKK(__s=MjVzETK?$bo7mW=o@i$$k1A74Ti;_Z+{zD}q@cyPok>r0<2HbTN$Rf}X zseiM_^S|1wMEOs9&nR6mm$3=ms1gWz5dZbK15waIP|%U02P8?^5_s?K!6DW76jN3;6Q*20UiYS5D-8>2muiU#1N1`KnlSN2*@BHhkybC zN(iVRpoZWj1T+xPLO=%rJp>F8Fhalt0W$%}?-~H^zbEh4%u|AeH2*Sis|nEmBOIpz#BH+I0!aO_LJS_) z0U-YGrXWl0B|6}Ln{}|1?tevu2+r31%b<=PK=MySg?fOrKkJC;j~9RP5^eAwTJXT% z3;=zVSkaocOgXKe@*pU>;Kl(2iXu{GaG<1 zg6{7f-PCFWutohvGP(n#{*bQjfE>7AB%u%B^&j$`4?qL$7ug&Np!}QsYpX-JpP>Ma zKZ06efFzh-f~OGxfj=ZiB;e$?O3FA$*8Vo`5(mJ7{UsTk2ubqaj(#$zP_76#O0f_l6*>DBm`a>RH0fsSu`PmE)RR2TbAppZ*urFgh^h7LG zzuCY*LD9oQK}mprGyq?LS!RG3Ajrx8m#4i}t{$jR&~SUOP*A^rD%H9bzj0u-U*Kzu zu@ue*ymnaqBC5utO$+T`Hq13dbNGEB?pUn?>)Ajc-3ws3pe6@{t)AM=+Til;< zexg=jBAA)j=S}zg`oaLS`ZcRGsirUyy(czdlVk?nt$Ab51}4Zy(%dt}+%z~MU<>}b zdC|ws(Xo-1!>AHUDNgK|zlwt3rVgI1=WuaJtnZ7i!cLX-HN!Ummnd zbT_oA-a((Few$f;KoM&~8-fX@jh=?+>@CY4J#<2bbzzQF?O4TZeKe`$^CtuO%?kYb z!xZ1NFLLes71ki&;appRUW);DQ#$fNoGNUz{AJ-6NE4eqgvVKbV= z_ue3M-1?m>-VF+kC0&LSJ9_9d-EK!`@V-Fh(}&BK$CXX1g2HQP2qWs%Bkr&6 zBn)C{71*t$zFma|z)o-H@4g=({2FP7je&|Y3CzbH>SZyAT|eFnAu~MD6g&VgzXMN{ zsjKhWTpxpuetrtM;BTk95!i-xxqNrjKId%*4$se_X7nlD0e3564VkYgl@m)p2jypI`o`%m$=pOZ7R~5)24nPI| zvn@wZf%CtYdjSSe`p?Qf#{l{x{95j=_`rY8rAd6?>)(=uM8JQ}5FMhwhXY7~;(vyF zlLEPZpElK$|I+zL2}Jun9Q7sepB+d620A1DGBm&h{AUBBF#~gc9|~10K*2vc&scy_ z$iE~(JiveU{{#;(>$lGL{6L*Qk`w&El;5PaAW;4f*(L~FLi*=cCi(v;Fp#Ru{6EVI zqZIHz3v!SY@bj);xB!XazL#=`VQoPWdG;`vnm4rquTw}h6}Tz@V7Q^#sAQT3ocXy_Wx38 zrv!ZaCmx7O%BC$P;P-#k+SmV&RG_N-cPg}1{zoe6Re--QKMtz@xc;j&;5MzR0#W~U znOfHdqJXh9{xgVQ{=L%p$G;}XI0_h~UwMjrxK;p@=s?nxvJS*Rh8(27D*a!X`gIdV z1fyyLe;4)N^&6u7zv?%h4)Cw5+P{yo)A?%@qb~5zRp2jgvvh%wLI&{%5;P5XRsX*o zMKS|wTY^1iM1q?D&%phU+o5(XTH1zYo&X;S5 z7fi0Bq;a@VP;#tLka!^xgIR5Wlpw?3q5hW#?P)= zb}=2^1wl?RAN?whqy|rep2r3|1@C+FDVEhAK(Y4KB4=^w=Nspb$D`AS?wStSCr{Tu zjze5r6NZnsuVy!IN`G=cE|5RpY(LQRI@~U&yLmq}w%cenmCxNhfJFo!o_^E~nctt+ zV8vsacC;BLk6dnm&33^&)iE8a2j#rCtrq(S)t#WEswwvUn`fTRvU$zp9j-?KL*=S! zb^E*f{i{}YaMR0)dj*xbAG|81iSZ|68r8a-v;#V61bs^kE_>W9DYk=s0&nG-775JM zj_GU?ypDW4JAIbz$$f7qIv)n|Z}zXz4ez%~v6lC*)|SCJw!oJl_JmQN=7lVFrQK~0@mj?0jz~PuaSpGaE9ny4L@G;Y-ix?r!hF4FY#5k;47HU*UnH|FIL(K3*YZj zkPjdB*>dVC@YE$7A6@-4ZA=+!tczQ}wyjMO$*$y8dOF;>Kd`5sJu^H-QQs>Qn3PAC zTE>%mtEhd5R1*IQR206{kbpOwOd~Jd?qxCM|N3P9U2RH-Ue)!Xa^f(X*MMs?Tl*(8uHl}2;ynlXW+i*Bx z&hL9(^H}$6sM;LnG{Kt!jtJLYFxweSC}Ux z)GfB7667Wh^Wx1GD%T!X=zpDTl0}tIyzJb5l^0HDhLXgXyE#=78(x7J*#4O>(>A%B zqH*SDpKTrYGSP9n+l_HjSxZ_)Tlr|c=!I3`k?bAKo{eU6VOo+~B0m9wI060(XYG2y znUhhkT798xkoEqS8~4L>UrPOQdZ#Zwzj8&EYrKM*MZ0rwt;Tp#zwzraI_X?HTv|zX z6K4ILsWNb_G^6~TLfriBNMBmon$Ks_rKPTdbJxBra~1Q_GP&lxbt@akzP%bJDJ=&f z(!p0)o%_;d8dnnBAim4_V>gp{6w+x~^E?~u3XMS_5MDYQYxR_*D)4Me)v<$nx_#5R zOXWtAJnghKm-y)J!W#-U%VIX&C98qJ|G=Fheyk@6>eB+Hp1mToy4q1<$E)4=0=`lp zDi#@1hF=-DY1u`+$zf_V-Oc&bOF;9jS$O~Omsz4|o$zp3lKjFm;=OGWiPG7!G#nGl z0BEQrP^r4)s$8{9W<}bcZ(D1rjPILOfL>l)2fQuE$9iMhUaY?Ll}g#aw4u86f|@C zrX@a*Yyf3RE_JN))ccut8ofwUVoCo8v=4GwBAK#i`;Rv!VY@mwZJP*2sS z0>nxoy}h;Q)2^?uQ>?b`!Xx|1x1B<#aLyM`gOs>IjtQmV0lEOGv4tr$(^Z3h8*M(T zmLi1|uxG+$`?GT5aM9fPl|VWxPd4sCMAanjQV?1V^vN7FCpW$lreMxo{X85&q!kB& zQK8uwrO2yxBH%j4YY=CsEhll^E%8ND9q4piiQc&c)Smx&dNE>X|N73_iRa@IV4MBgo%X3=31wkPoY4JB6wXScg`sn?S@NRsFQ0(4EYHQ=aQzd<+aa?6ZP!*?6DqBj#NY9O;O zxx^puEOr5Y6RAUeLqBn`PqeH$mRxNgkHffC-Xas%SD;_hrau{_9mRAzgXG6Ad4SL%rYn0J}kmG@FyA3;T837fKxNC7M+TW(wb4w|RS4qWZFP%0bNw`TO6nQ_2@F z7OiOj6Xu)`e(d<~BOUS3gBU?nutx@{P<(Wmk+}Tg60|i8gRHYSOY=mZi@EgH*+bt0 zlb+pWo|Q2S%`fMr+O-rEh10sOT$qmf1p+lht`8Qj=PyAQ~hyk%f| zC0dfFSI@rWcAPoG9h9$KBN1^`?TP*jOq`Vu)YNGZ~9dgPeeXC^2@H8&2RB}JgTwiT{cex;Ty7oLU z2=n@yr>!+9OKL?kH+nKvvuT-YC15W2>ImLc)}Fx-U1!L)E6>F;OVNU!z27`Di>s^I=+UdIntG3w=@2DK>94xzYv^u)BYX4ekX&I>s??6t8z#h&U(5)~ynEz7U8nl4&vM+49K-bC_R()8J*7$()B~MSqhmD;uT3`7@<+D7E1#99+bN@ z?WppP&l<~^vzB)QAkB%HK4pOmvFvjG$_F<(0$o!US%fCiAJ1ftA?WXinzcS0_Mb;U zsep03p-H>t3ty76QQ|C9S?Xo6DmEot++F`PesuaYvt!(D82BP&vj??I&5>5(`6Uhl z*CsNu3jU;SwAF;DQ`pWr%6qy`O!+P>=NON4)1zd{tK(4fn;`tWoNLEsB>0#-?2oey z+%9c7k`1Im=y^mVRiBRXX_mA?d;I``RQmnV8603$k8@2%;kD{cH?1s6`NkugS$VQ5 z-9eVuJBaiAXzzyQEo8)K26JzWr#Na0&PVS%bFijs7;O8B@fUX~@qMu*c;HnzhI^O` zP?#g+O1}#5)Pvl=?3_)15R9%+U$!o(R4*AO3z*fv6=7r7fK?AkNzcdV-w$#zr(pY( zBAa9_Q?NN5M_a=EURXdHGt-7shUJ~bJ5_OYS3$hX7vD~{j$&W_WC~Qma^s8W6OhgHkPFxZxlU#l zA{KY5c-x(gKY?SBfP!6M9UV0-=Fr;}jaQr)Y>}7phA+|z1imU^OnJ{_l4hf?$MpkGMv4;v2niLg= zMIJc!c&0O99rzH?p6I@^LG|t-q|PMpHl42exdwqKy=C9yca(Wj5;^rvQ?kD1=^%M8 zOIsWzVTpvUCSm;+wQaFWtsNA3dFEMvxYt6HiNnaeoKMldv%LN?k931-&ymAQP)d9T zLCk7KL32=o#|ab1(6IAyUw>IKt7`eAYC_`#xoTWESSFj=?)S*AT+zW&yFe>}>r+2pWvZ031>F%Jrg z!<9sWA+b~_0;Uzhv&M=QI-bP`fkU4PbVjXRs;Daw>Lqkg+8>O>r^k^Oiw7fOa4g(O z*QGVZ1KHcghCMZr!$TvuULG}HI}##wnWnwG=(Y&>I(z--F)?5KU9Yy3X>3e!TN&0r!Ch7P8~- zd^GK=DK{rV4>6!9b7Y3{Kg2;fnFz^8jmF6$YkLeVs3k?xqL=Mfljb{DJU)q1OiXXm z6*Q1@4t>bS;ZUh>?WX1vh*?BsAYVcK@|{Votbd-` z#>d-@^K0<&=z|8^gV|zXeKy7pZ4!n*?At!7sIsr6{DY)JgkAZ;y{5wGSXHmTT*}DV zG1X^bdw*{#y4bkCzeZwGzW%U?Z9r3qKU3Nek1aD2DCE=KlYxp_Maco@iNq6!0pwF*;h?5u2kS{hB- zGQq+2RvF;ISKyd(>O&q9aP47_=z9+2h5Xg*4dMtjwR_y*0eHFFrfiY^E4W zEz&ZslVHw}&d5Mrnw}gb52bi4c?dSZqP);kJToV{F<$l%{eoT;Wtml$|F)g#wqLAx z*7I9WiTXTDi!{&B-Pzd}zcA9Qtg&YoP7&f-LJFQoAX7G~^C_0yGl-MiY5*5Eh3g%S zN*#CGt7HQ=ns;KDMaCw*V${-Y2@Dz*wgj75O!k!`@?7rI0%w=8kyaTWc(v8oCG#17 z2-&mn=*M*jt5qIJZLGiKfu4*!l8q!_>ydV*vGuvPb!urPYxXYLYEl?{FSI#W6dZ>- z!)1>_`G9qT3^rD|p#nh#A%G}F391pH>y`CX70i8s#S#LlsqkCRpVvYV-5~E(Z7-^I z-6Zg5^k3wRU|qe#7$8oQ%dPu<++{S@fmXC6^yGMhaoo4KXnNHfXDxkJi6-n!Tw}np zw^%8SRJV8Aw7u>HZYX^b!MqvTkw}DlDorFI#4^(5DNIcmPXsm^}|OZCEdgqG}FQc zd6QM)JGb;2%BG+6xjpzQV;bM_C5$U~q-KvQ?nao5Sk;IO>9F<((uIaO`Y_kpn+ak~ zZ}5jGA;mgvyYqtti|F5V>sW6(CJs1pJ>1YKnomy;9q_V7SlC5Wh%)pp_h*W3iC*hm zA~i)?aDHM7{-!*JzWyeIv6!P(kkwn%O3R5UFkZ`_K_&)VcyviIDs~ zCsIg1dX0n$zdJXAF^ovK@8TcOyd(Sc9G=E0O2B)@SH{z3TmXTa-Qw*eAe&g7P4Qf};BOcT6=^@RJqfd6xqO z#0LEz&y4L0o`PyC&rt8{%nfT#0Vw#rWc?&owu|C!;?^vSTttbs3TTpyajd=keXP(-$8G<)A2yu*gKW zu7UtZRQsT~WG&Ir4iq2ok!A~>-+XqNW~^zr0_@G$U!MlM~cb?=KPScwJPW<=!QgbA&?>Vm*_nOkI%?6dS^Z*Mtm$8!3yv{}# zEoqtji?|rX7MK|L+LXa0JGTp4Q2dgj28#Z3**GAnF^sRGgoYyz-$lP&s&mDu;#2m} zLs8cU%D2LDq-1g$hmW82phYg+bH&EX^K}sS#PEs9*MDA_l!tL^vJL9S z+&?ZseR*Y6f21#lGHOD^KS9g{I%*UJsrY;xCFrB!2a)bRVn?XJPw#KsIO$(p^|xlf zmqDL&G}gVVWKAw8ry(CXCfR5;r6;_(=1LCPR-Jtx;iH>#~5+_ z$&A4pI_Wfb@DXKuKw0F?D%t=D@FFNRLS%I}s4imdhGPN>o2BuJK1T>13Hz&*_l%Jg zN8I&SU6+fu%jFLBkt&%LzR{P=)Qd8Ee= z11ie)jfJD;cTER@h8-o?7|9lu9c9{GqYP9EZc;80pH5}w()R3}@EQ4zUifGql)71a zh_tJgCIV^s=*?<>kT)4JY*~q!d;%O1fT?Zrol;jrhp60pNqdN-mSb&a-P$~26WNQj zLHa_?`X*!!hdor>lsfH!f}5MQAWxoqmHJt{ zv!%X|bkyN^bJ<=SM}OTrJlYB)dlP%Qk}UX6I)?W`G-+x%`?$~j4U75?{hplAVQXc7 zg&05Pj7w+C;E*|Yeh?iNbc zx&?F-m>TFUllpF2VC}{HljS})g^`u6HWRU3syBYf?mY^VUi;BM=AeL zObSmy1q{*>7Dh8{xo;8$*ks{eQ-PZ-cCs+3Q}&o|Cawm8H))oXd1u%wO-E%3`$5At zR7&~eSr3GSSuB)(A%&c)SrudzM>0*fR16LXH2P$R<+UzWAKH4Wp@CipuwIc*`F_HVh8{N56tI=&y5dPjQlK&ei}s%OU2#i3VIvS1KNx4+c6p-^tu&br!NjNY^O{o zKCIn6iHxPGPdo@Bb10ne@LvXCCWQ>cBjd?5!^;>dyoV=p24DK5SV_C~*3GcZD ze1ULZ<`f5kY)kVWHHOsFoqW|pLd6>RBx_vrt$`M0%L??Gde<+a8*xWKBsC%hRAbli z(MmIY)zjZByGl;aAM}ruL2N{KiS9~uV3Q0*mLernFgV$CcCj2#6ym0op^Ro#qZZ!o zpBK7kYq`@dbEqfM*vS+}`gCTd^tE>ag*)OPOx_LoM$qvir9$`1Cg~Evm`*&o9o6go>N>-}vl-L-f5i=dp$(tj9W#ali zyJ%qFHXuhSvERpcNghrpJ>Y6Nsda`{5Anm-!~0Ty4LV4#>bMp4VP7R{m8E@qhRm@x zAYc^5_KIDa^`o@xj!{G0Bv6So~@K!$RwXO|d`tecza zj*<%Bh6MMf8Lvj<-+lejEsi!PzK#!jSOw-K5p)PuNJZ6tl^$v4UPaB1S3Sd7hMn2w zP>I*7Il#^_G+3g^=&vUa7alCaX4BoF@z%sNEh$qoq}JpO7&xNn8P~GPc#9k7wMpKm zU=KVapX!o(fF_qy0CjNN!lqK!8OlX!t7l(YoJBuYq49Rz=@ai5rcA_&O&6{2SkWn7 z=j7z974eYVu})h3JbRQB2T)MJMDIsVCR4Jf9x*2$=}*bCUU!TbT7&rv#&P&xv&griqPnu==E)IJRQ2Zb$|e9bgwvZhyW z%{ybSJ2{%&2W{9{VOVi;u+-X=p?CA$D~DIN^3yUSdk9{8DXjU`EYU-6$>V$9OJC?6 zl<7n$M4#Hj%Ne`JlT>)5q(`Jn1YAMuR4+SMf^!uu*gnnnR48?EP@mJtROTwIe@r ztYR;w<0?2m|7?+2o%Q2G&HJ^Uj%cTrVZLBEd-yQK&2KgunP(aFxlZl+}&3^mca!VHPLk%`-G+;vr7{Q@fBsJ_nN=+3e=r#w)sAgB3_iFnTk4Y!7q6Z`6j3NBTx^+=nL=-U9h zwGK^-Z;WwnBd!SNRYF_7H@d8f2gWB0z|;HJLIM}J($=q!PWm0Ysg>Zyeipl908efG zk2~A)5!dT`cjV3}4jx&pb!SOI0BPF`*Y`YL?4Zpe&Y!m=>Y<}s?pLA(4tI1cPxR*j zjiI~9pP%JUKk2rq-imlMr4}P{tjSN`+ozG_pfDuh4-v(G>*PMxq<>aw@-VDCe~nb> zpt_5637;iwQsx^pgyCQvRuzs7)uX_qdc5&8{W9UL6yJ?}$d=d+kLvi+9f4=eV5VH3 zi8Uy|>xV?Jg3voxu{TNcahF9Iw8w|90)MF7e^I?CU?uk(x8iS>C>GXu?!G)j%xPzv;{U&_eSXxpo~dUjQIlZ)H+y+oPNv#N>(~{^1Oto{1Cr( zUqo;z(UW)?k1?y9SR;A{wN>y5?zWV3sQF>3>lEq=_(g7)mzjmGkyobATxHCEe(?Yj z7BgrL8UGrE0@imD^Iv={6BJ`RI$q3Bz5nUh?}ItA=#$9#6f(3|j|aYCNAiPhNqEf3 zFI%+?dlHS7s|eE!L)N>=L<~G%!Q4VI;$`ZSOCu7loTwJ$o{?I*`1Pk5~lvS$m-2jexN@ICBo;C7)|9bW(Tncb-S&$%=hl9 zGj``N)x2+&P^D_y;9l>-)g^lNSCmzIq3+^mrB&`)K6n)17Mb^()9LsIKDaH^MGDLb zHYWSsMALs~Mxj6~@VFhJZK$;Y)s3{#kJ&}Mpgy{~CKKgERiu7(fYtMPr9^Wxy1yZ8 zWH7%pg;T3x^Y)#8ZB5G#jY7)Io_(`YFR(CPlyUvN(szh2?)F^FA(1}TB=Rgs3`1O!faBFNdtp}le@nNFvhxAh6| zFfkulrSK}E`7B17vXpi5IBdTcxkY>h{zeM7()i1F6jUD2aFXqAqS>W7BE_~=% z|M`*-cra{W!rw^o^u_*Fa8=pOCbo$Og)v@^Kj|BC&oI8NeP@vvJdlmbWT`U^Sxqvd z%9Y^L&Lf9ZSmMW+liK;9x2P-bC?7?TpMY{n=E>Au*CQ-MP`PA{AFi6n?cn7sj&|Db zf)J=lTp5zZ#fru~=W8F~D^zuD&k+Ql3l(&9ZB_1hc^;*ue2+(g6Fq*@GP|vc4^U}J zrfEtvUqucs=k42|qCuy^oG`%I4do@x7LiIeENZ0JA@pFIMO_SL3aT|~q%y)EZQ4vt ztJjxae&+R;9*LV|{`AHplQ1U)#<<#?VyjB-v8)`S^ z(#)cIy{jF$bc<5}>De2#6zL483Tc%TlPQ|*`%!^$75CuKiQ+nnxVWhMqX4hv(i&ZJ>~Z}FcKtK@OM0>bB~|PY>e4a>pPFG07_PdDi< zy4T1<7CO-WhT{>?0p@ph)!10~`53|G`K;@@O^DE?tWn)xEvZDIaz=d_=37lfg~PDn zJ+2wnMEr))78=9RVNIX+P{IiUsn30DOhUfw7Dvkm>!5=adey!;RhYRJx$>|mL#f{9 zi?NAX*__ty>3@I|4MYg%ptSjx=x0KqZI(@>)V8;iDpd)};oM_&d?YZJ0tdc*QbH9> zL@I)fP(o+KU)uM|fAvF2Z(1w8Fv?t$EjY%FiC?AyL7si#5={77PpZohz3zHbnUrk! z5j{JN>5VIBDz@16IN!aQr?{+AgO~%vf#!jMsa%8nB|fJO@!bm{l<=le;w_2PbjBE* zid8*+65KWN8kR8_xw7;(lANe{B-g~gd*~*aMr7VU3$sD3uLqU~@YS>?Uf*=_e_=os z5mNu0TRH3kU#zAY`_wb?zVBOhrd*84)=|hUBV;t=n;qcJvZ}e!MqVFSft`2`_>k!SEZ|;x~*jQ}ml^L+>xQVlQ;ZnJfH| zrJj?lnawD=P4;9#OV6eajXI95O7g+iD7or7)7@&C2UdDD_EP(0aYG~3J2>YtObb~S z>m6S=K^IM)Q?rd5b8~{d54%;{Y77Cmqr~;73%J#42*hBwuGDFw-W^HQ`1@MX;>t1( zl~?{xvYFTF=!WUbwHS0E_KbG@55+l}npM^Kld!-GODDtCM4~J7F zd8xG?JVX8aBNW&(4$^=9SJQvfOdQbkclY#^#)88GFiQ};| z2;lTAAou_EP^BN=?Uc@e6?`h#M?M{0!$~wiXJ;Ww>tBk_I+#gEC`BNr9R4wIi>Bj> z>OROfe%Kx`y{}N7^z@wVz>7QrSDO(m=|wmN9H;y$9Zz_6IG`kLpYPy?rxL#q4QR*< z+_Nr8mHND(d=8?6ns?l7++3_u%CuV7L#W%&#LxXA^}ajU1PVK0Z38#qXmBk4?v<|C zT8eNH_vb3f^T>W;`1tC1M*Zw)LNgqap*tiUA5J#ad9z5*(Qno4LR)|i{ka!HArDVe zKL`}sGuTr*7tTkTRWJJ2?!RR=y8@QI0COy)BjJV~?j@j_VDmlqu7?%HJu+Ez@e|Bf zP%9|#QF~`73%LX>#WpHXU2hY!Z7roBVjF2>?HQc(DN}jhdyM+dGrir?Yo(l`b~VIR{yNiPXBUY!p0jK zvpx2V#RU~7TY&0qRHVP@ij7b}=Mg$i(K~NoorV{m88@E5me*e4dd`=2(|e8_l&58! z)^D#RePD4zM=t5=dIO5)sdBd$n6SGYnWjWGIKni6oVk)&g$1wLQTK~N%Q+sjXw6@i zgLrH2Gpbdbyh(ztNdJA|dFZjP496RRp>u(p|JTYg%xYgOEOJV z9V^@lupSy z-Q!i^%>X^dfuu&#K0^6O^5i7@{8qNrXRkMEZKXhTV}c(E!%*CHor|=J=8eb)b)!C^ zfL#p}5ChleJE_hIk;J)6)va}tPlS;p4HuIi+PQTGTgqnbb?xWv)CZ3h?bI0ImrKp3 z3ATu;$gLXZ)4NxtLUAHVixm8#jKnw0Kr{``a`h*VcVI)4?9Kj!Zoate>AjyqHP-3j zhrx3C+^o8XZ4vjW%k86nZS1tf=M;a<2>M_Dap$2oZS<0K4BVLqWc|OUq%v*9DP7a; zRxNwF^1C(q^gE}TcD=0eViCd4hvR5TwchwP=7!6v7F^Kij8VNp4c>NQ zL$omyvQ1fuzJOIkEiE#xO7&{0%csz~MdQXaTl3=O#pSzwTh2^73lr|;h#})A>&8{V z=bL3rUNu%(Gs1Qg<|?_(aP!O_p7ww5)t+xOGV$Rga92suiRnjBH<6{!L|6RzQ)N zph^|eA4;ZPFCQa(cXZ%Wt6k-{;N)UaH#%o)QlDL2g6OtZr&t?yP~krIUU9bWNGo!1 z5stCmF0WwE%(ieuPv=U7fbkoATm*uMk7m*1_8OAqM`z(6M zXm#j4+dK6tl6_;?8oPS&wt`9K#83IImUVaK@l4J%~RSg@9 zyR32{)XTgttA%Q`sGD_#FVb#54J-0B?HAdfCLK7}!H-Z*&itKnyLZ2r|CT6gTypjZ9O!w{Xa5cjsVAWylK{cCJaLwWq7wuP(8 z*r$fXN9D*AV%~(qM^?X5?|Y|?)hfCR=W91%()8tymHA18Ne-%)jiIrw@@fiw&M8@* zc1t$0p(G|81WD^hnVj107_Ng!4`yi~8u=KXC)7KKpZqC^+-fyK)kbo=a9V)}6AC(>wc^x2vvPEG};O zJXmu#r##vQY!4pnY&Fss&o5=L#6MOrS zQ9CfW_q!I-v4F3$@SC9%8`(Z`kl92nPsTT7NnIv2!l;_sPrRee8r@25Z`PCnS`PPSK_kF5I1&%YS-4HwdY6}a%VQx$dyJwTOX(;tkhqENCXLAM- zF2oLX;`0PdWV@0-CgCW$A_mGA(pMfy`aPAv3#&fv^oQtcDHV#R%&jDepbe-=n0pPK z72Vn%DfSfom{V&EK6Qt;4(zQHE}9p#NQLe79b~0n`Se)~j~g~8;|6jkH7v9hYFY@Q z*1e)cQzHWz3dOr#njOiyZ{>f`Hpuyke^JI?`jWOd<0QOjX{i7HV7m{}AgcDm>D#b1 zXv`!ye9n`Iz-x`z^qUq+HyVq~P;-kOH6SsMc@At>3M2%HPFEST>!ok6zS_${(N)kf zWi^?&bdOpMWFCEqfxaKGcsao`mM4bZyzmmAoqn1Z(z4#s*%5xxy^@FM5^4F>6`7dq zQioETbKf*$5L=%ujIO^>U5+T8Gt{w=P?-hchx9QbTy0u=TBX!B=WN8{jW^*fNVJLm zfcy1ve-21_Q7>ypM;ob^S{U98n5G@TXbQVmu$u#bsiQ- z4|-sfd6jMiieU0D5q^xpC6&#*gu0#As5KNj;EXW;0nco=B_(RpsvAI-TWKYr!~QA- zTi~4#XcZxfXwa7E>av7zP7YqCjyDn3MQlGGzax&OCAFb; zC^xBP724wy+A7$1K}laJ+DS@X+dUetHic$DBe~%B`QaTo%XizFz@!zJtTHRI6EjY0 zCn*|D*AlpTm!W1PzJdPBun!CPmMxUr(y>#VWkfmYZY98x(^bk1&EEFi-Zvl(XZ!X2 zO7n#bI`KMHcxOcW?_m<#)NDn2P_j)grei0!aORWwvlHQ~Nb zPHP_e5^F6o3x2w;q4JsBoXVT1FAQEauBFWDuGrwliKnKDQm~PD+R@5lt4l~6a=8$l zyACNO`|=`aC^@$@&5vpwDfJ_0(C6LCOSS@e!z8@d;`-j~be`rJWsfo2!T2%JLWPb+ zMEw@m>8IYj_ml`QaMT%ZD3R?M)Pmia+hthx$*9XVJ*CDeeaahWm33drde1*;okg-L zzFD5ie+XVV1Z_SL9_xMe4g$$TgjLt2ICDSFo0+=OJ8Ww`tNHuFwDra~F`O?ot?$XK+7)`=-F zx!1`P-Cs#CExP9+>B)3)f`Bz#%^K@H`nv+0c|~zq(V@MTt*}|nvHd1PpIH3M1@lry z4B49q2lrourl1?^e&xZ;9}4`|w2K@Tj@!&nq#9rP1LwVJ&zj|D^~S7aM>!;LslD$xsNqA!mV#fKW9-AqTi z#yO2(bY3ysz5njUZ|TUsx29jYb2xo>f(RzBf*e$l&f&H`+-M!L1>zwwC{Zm`_is_5 z{21c=@U~-EzaRVfa`S_pPEK}jUShaR(8v_O9v;5l8!$WHu;h*4>@iW@!{C8%@<_hA}ZjqDj*4{4Sq88mS0ENQJ$p?H8a%3 zloj!T7Tle&o)r6vKKHxFXQ_&szC`3hH&vxH3cQG3;Ug80@`!~eFg$PoeYPA8V(*q zV}%BK<*q-1vf%JawxC^@>L?@>S;Qbsn#E+lnlyK~mUD|O%Q4?rlV_M8er8~ai4BO2 z&9pf4wNp+f#pG>Jz#*mKM>ayqH>SDuQEs||+aWLIG=R0GXoFffF@&;paF`lccBeQI z&SoZ4=6F^68ORSjg|_=#(8KJReeGgldLDSs-Z?WLL-(3b z!imFPOW^WkQiZS~fgHVIc>O7;d$8EEe#P=@k0)M^HQ8Gy&w_q0H<3fH)|4Zt@H>(A zmIXq|u@~WVQtJtfTAW?4@hQ-xO5~8Y;Id8WZh2fVcRv+uiKow1L|7^ja2tAhLV7u~ zIy2EhVVS<7o%(w2em4~JD6$COEotImZ~t-q%iV5zpv^VZ<61? zZ{)8Tpq%KNGnL&eX;_CcQ?}Y#d(8v?BEdT7!tn%up5l9OD0Aq6H2TuEM(C}j;qvmD z!^vtx>*4v&rp%P!U~#X^q>CyQxU5jF-awX45KOowsxN-Cf*<{$o?Z237@&J}eIAqE z^uDmg*I$42;o`(|dpcw!#PfB?6z37&+rgYTr=l-scXSx1MML5P)sf2I?9kC_6-Idy zhU2CXLzqXgT(n@ZV{i;2@)P<2L2MzM>!T~u87|*mG=2<=rq5OT@@2oA-sW>J$>uws zUXXz;4t``mUqzf_NW^P|**D`|B%3vAnv#p05k<~xKGR!TF*6=F-cNSv)B2uG-h8(m zkQUD3-R%n?p_pN-ZW@(+&E5x>^GkE53}{D#uNwwWW?N z-(27A?CDWghbH%j${y>_?52Agq$JqxL7=+kyx^XmTk<1JkGd21NmqQix0`QaT~L(L zikl8FV{k1U`z`wOJPQDhW#J#}O~)m3D=isTv7Ha6aKFCTtw7btrW8z(BP;#k{BSw_ z(D?Y{>Eq$;>I0_8iCjQ^sY_ef9UF#fb$tE78SNQ0$JZz%v3#NeMQj{Wypa>8=p+y{ z>W^L8YKN1hnCz-kzqQr>uZ}AZhkASC%nYIITVX7fr5LUpyF^ULn#z)p4A)kKqFhEL z6;g<=it3h<5?RZ>XBiZ-CaMuF+$jB2T7Ks{O!qt0eLUxn_nh;7-sQaKHP1X}K2ZTL z%H0vyuWD)|Y>rP`;>Suf*y1+3N<4Y<(qd0Dt@=ct=!$f%)-{DI`EVVpv>fIpN;X7( z3<@KFL*2!sFV@F7&)^HZCp|;LP2uxPMB^imu~87)a!Ygi%$4^C4fG56Utf&k;GKE? zZt8`J-9@UZc>egU_=v=aU^$Ak*4p@lO5dPj^hnpLhQ zm3sx7q&ABMKinp0m6EF4th(0BYVvKvNi(%B2UUy1pOfF-th2zcl?%y^=Wgo`hEKkd zOeQ#URQu_fAJNB~?j70GLTAH74UWkB{%Kln2g<1)YJxR+dJ^PavB}&{4ihs$B@V7j zkCI*mo2eL-CLZmmKR|yX15^_To;y~V3Erg~x8dHD)ajT0pTo`XA5OuyTMcD!kYy8q7TWm;K&76oxJVjgx% zyt}F9v-lH!S-OR3N5ArYCU)J6of+hs3g5|n*eHrSOEYI);GrqA z^9JWt)#19jqg4q5RnlL3TsWM|jLd^8#bw{<9JWwUYn~(BzR6=HbUbd~`$)=(8Pob} z4_DM3$f|h0O3_5AO&|m@uG-y2e76rLeT6=nMm_q*wePz5vAhJc6URc+Kb|zT?KNq? z5IH4P5)t`%x`Wo+)D$!PY1UBPx=?hd^s)fetQePjrChuNHe(9%yn+5~N5=KyLe5ca zZFa{Fv8zbsJ`1`^F2 zWM*fKRu1$Nt+x?Rmw&7FS5k=}gT z%=XWo_pPsOcZfGjpXT$MlwjvGbU9rWBSN;OYm%urCwsG!hi0Vv*Us+sSgv@!uz0v& zzf^{nPrdn(_KPz`ro$jcvw*a5Z>#~wqny8YaTty@3gYLvuH-jaL<;D*N0N453P(QK znor-b%6g$>v8nUAspTm%*F6TSJtA$?liU2fo8|jkPn-~q9%%enBe>bHG<}KwH}}P_ z9|a-36v{D@=3!Z`3He3Fd60ifz$WT{5Q~&J> zC7${g?TEyQj7(n1C2_u)8uZ;A>*(}%Pd+{9ER(TT%XG`HB5y78(6fr6^jq2FcuUHK z`AqHaO476#BKv0ry%ElPe#ki0J6WW7Y{k~kGb@HWoXgcKtVYHsciD<~*=(~=E)hLG zaZhNBn%MX0nI0+Fe*3mj>0HHNN8f^^;-Pmj(?SKC^TL)ms4FIK-{|MIm#>s3N$~u8 zYu|J|!smHX4khzBU-qXWE^VN=LTzTYXz9Uog>k9ltN-5L#=qXOG$-U{k^>=4y|pc7 z%|=@CleeU<>5vq**n1kC-60{g{66CpJl)*skUq7C^ydmI@|G7FS2XUmtxHtYSB#(~ zi}eMs*)G1a(tZn9`5gh#`HxL&n*v5(HZCt;A2v42nW&#I{EgvQ4K{$i_RS$|B`+kzUecLdyr>iIzRr*na6GHVh9vOiw!i%`8_ zRB=a)LzsH!WqtC56}#h^kYXF-vzPC-bO)D2r>EUjT4r8G;T|_-UrFc^xN&)g-z>^& zUE5pR4!Pie^4%Udic_@Qm-M{!BMMP9SHnYQ&TwQrg{6`tWPqrLA6c*CLU9yH%)PXA~9266?qUb-oSv zj>tR>rKa?(HWrmTuWz&Ge9Ns*Yn|qMxN`XM!9{MhNm`SBfAq^v@QZp{zVAia0&;96 zoK>CW@_JN;?Zb2mXCo}ug?hGCs!v%T64sMAT@`w^abFs*tJZaOqPN>*x7_~qbCbFK zGKrlEUkmgTB92<<4VcZhe4msQii&zJ<-!>kBwtLurc^mQ)5x`*i@)53AYOf~&b|F= z80FCZBA%lh&YU#mLcWpV%R)%qTAtP()2p)2%nRo<+a3d5j>#yRXWr=ow!678VjLn| z_`E;!YsbZ!j=zr1uFjYq|BJXYBRZFsy)HMwk9bqF6X&OS{CC^@E-%PS7TGPM%Aeq;oAoz=h`J_6^}->`DjUhuyYsI zUNK7#SU0J7ae|jKWy?@QX2FCvcYIY{)`p;z0))4K>UXjH8(&wuW6@K++WhUNUoH$9 ztdy>M_3jd(=ggo{xI+4OW4Y7aqq8^umqV$Ti!zYtu-kL`>Fso@NlC5=bwS5lvKjMP zk%lFvgun^&P9Xa+c1OpT5A89w^7v!2spl%ra1SaKPX&ryt=jWlr{28dP0K}^Qgf^D z^OX8!;UjqziJk6}-F>5V(}b(`1R*+?ZrzEXa$SB~j!M_sxd*GPBpbZ<3ih7hXgDYw z!?pBe!=~IJHtQCr75qo}D-N8pI5DVQ&c3ZQSelcYa|?HFC2@S}eS8gk@y?Eu#xqI% zkbw%IhI57dER{eUk*x%rD22?oRv?9#Rstd14(tk~RPzJ*CnTp@R;1Kg z3=%Z=u@*S9`oN4kvFw*98;S?Kw1II|?fd*C=iyBy66l(-q zSuvSuy57jDNpED;+|&d-u->&aft{>Ki@}PhP&C*a0t5E%@p4Bw={Qg#M@%g+4c@uW zYH;d4t3kVF;Kyo!sX5oostH;!n(#!C7T|_+Sv*lFi?xDnSUJ8G*e}Y9Ck!{i`c%bk zvTg$utlZrOEU>Zx4aSc#QbvRM!N~gUKa3Dj2By4rV2NFq=m0KQIjsY1!pdJeSoMQC zS!H@BEL)7d?GM0qtW0~ry1xD)tG%*^uvjtr8ePB|EC1aE$XIzvH?YOZVcoz9D^GU= zBdolo2Y51NUKYAH=xY%_wwxFT@Z)UiGpbu1+7ERzbG+0S)Z#95{`? zAq$XNSpYa-;bQV5+YgJ5unIBk2kKazGjN{07P;LI{=iOugVXqI6@b*J0HvRxd)Cc+*hg?~f_h^-kAUBcM1(6||`@XQc2uoAgF1QeK8Uk3e6Q^tt4atQP>6`sI) z79X_{!N;&}Seie)wx}6)Ipm+mK>QaYU60{fAiDO$h%9R4c;+%I95m7hhcSzhW0uI< z$3P769R}-uYYK<6L57BbB-3dIITlL$g~-(dF}$4(KzwX~9GZGew1=L+TzK08B+3@7 z|99=DoYrmmkyDff>_2kKPC#l$ehQZ1h25sSB8C_2_UI1QkUNO+csvZ3_Dje~;Gf7U|T#H!)F z>Vt#GqIJt@K?|~s3I1{b3~y?k5#wh+RTQIi8k0ybe-Fxw7(D~>%p+s?-8rqMAOw9L zfP>89!AchfK4Rmta8Z9(aJV8@M34@|eyKSB=P+OFZj43b(sS4Y7OQ}9Ld#Y5i!Gc` zEFwVvaYBn_0E-#@BqNgH0kD*0unbVbv`RoUKwFgd?n_~^9KGcRIWj9}uZApv`oSkv_KbCXbEbd6>W5tFgG*ay)8VIF?tC^ z@!3}Z(s~8RqQ)2T@Av(zsna4++GAz_`c2nQ#cAb