Compare commits
1 Commits
sync/curre
...
devin/expl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dcaa0c7f11 |
@@ -0,0 +1,124 @@
|
||||
# Chain 138 — Contract Verification & External-Listing Checklist
|
||||
|
||||
**Generated:** 2026-04-19 · read-only probes against public endpoints. No LAN required.
|
||||
|
||||
**What this is:** a contract-by-contract credibility tracker. Each row has four axes:
|
||||
|
||||
| Axis | Question | Source |
|
||||
|---|---|---|
|
||||
| **deployed** | Is there bytecode at the address on Chain 138? | `eth_getCode` / `/api/v2/addresses/{addr}` |
|
||||
| **blockscout-verified** | Is the source code verified on Blockscout? | `/api?module=contract&action=getsourcecode` |
|
||||
| **blockscout-token-page** | Does the Blockscout token page render with name/symbol/holders? | `/api/v2/tokens/{addr}` |
|
||||
| **coingecko** | Is the token listed on CoinGecko under the `defi-oracle-meta-mainnet` asset platform? | `/api/v3/coins/defi-oracle-meta-mainnet/contract/{addr}` |
|
||||
| **cmc** | Is the token listed on CoinMarketCap? | CMC Pro API `/v2/cryptocurrency/info` |
|
||||
| **dexscreener** | Does DexScreener index any Chain 138 pair for this token? | `/latest/dex/tokens/{addr}` |
|
||||
|
||||
---
|
||||
|
||||
## Headline findings
|
||||
|
||||
1. **CoinGecko asset-platform `defi-oracle-meta-mainnet` is registered.** The `/api/v3/coins/defi-oracle-meta-mainnet/contract/{addr}` endpoint returns 200 for known addresses (e.g. WETH9 address auto-matches the CG mainnet `weth` coin because the address is canonical). This means Chain 138 tokens can be submitted to CoinGecko without first creating an asset platform — that step is already done. Submissions can begin immediately.
|
||||
2. **Blockscout source verification is the longest pole.** 2/44 contracts are source-verified (`MerchantSettlementRegistry`, `WithdrawalEscrow`). 42 need verification, including every `c*` stablecoin, every PMM pool, every CCIP bridge, every Vault component, every governance contract. This is the single biggest credibility gap.
|
||||
3. **All 15 canonical tokens resolve on the Blockscout token page** with name, symbol, decimals, holders, and total supply. No work needed there.
|
||||
4. **DexScreener does not index Chain 138.** `/latest/dex/tokens/{addr}` returns 0 pairs for every Chain 138 token, including the live PMM pool tokens. DexScreener onboarding is a separate track and may require reaching out to DexScreener directly or waiting for them to add Chain 138 as a supported chain.
|
||||
5. **CMC probe gated on API key.** The checklist documents the endpoint so it can be re-run with `CMC_PRO_API_KEY` set; `/v2/cryptocurrency/info?address=...` returns listing status in one call.
|
||||
|
||||
---
|
||||
|
||||
## Fastest remaining wins (ordered by effort × impact)
|
||||
|
||||
1. **Verify `cUSDT` and `cUSDC` on Blockscout.** Both have the most holders (cUSDT: 4 599, cUSDC: see row). Verifying these first makes every PMM pool page render the symbol correctly on Blockscout. Source: `smom-dbis-138/contracts/tokens/CompliantFiatToken.sol`. Estimated effort: 1–2 hours per token (upload source + metadata).
|
||||
2. **Submit `cUSDT` + `cUSDC` to CoinGecko.** The asset platform exists; submission is form-only. No on-chain work needed. Estimated effort: 30 minutes per token.
|
||||
3. **Verify `DODOPMMIntegration` on Blockscout.** This gives every PMM pool a parent-contract reference and is the one contract most likely to get cited by a third-party auditor. Source: `smom-dbis-138/contracts/pmm/DODOPMMIntegration.sol`.
|
||||
4. **Verify `PMM_POOL1` / `POOL2` / `POOL3` on Blockscout.** DODO proxy pools; once verified the Blockscout pool page will show the true pair metadata instead of raw bytecode. May be non-trivial if pools are DODO `DPP`/`DVM` style deployed via the DODO factory — may need to link to DODO's reference source.
|
||||
5. **Submit the remaining 11 `c*` tokens to CoinGecko** in a single batch. Content is repetitive; 30 min × 11 = ~5 hours; can split across submitters.
|
||||
6. **Verify `CCIPWETH9Bridge`, `CCIPWETH10Bridge`, `CCIPRouter`, `CCIPSender` on Blockscout.** These are the contracts most relevant to cross-chain credibility. Source: Chainlink CCIP reference + `smom-dbis-138/contracts/ccip/`.
|
||||
7. **Blockscout verification of Vault components** (`RegulatedEntityRegistry`, `VaultFactory`, `Ledger`, `Liquidation`, `XAU_Oracle`). These are the contracts an auditor will inspect for the XAU-as-unit-of-account policy (see `EXPLORER_TOKEN_LIST_CROSSCHECK §5.1`). Source: `smom-dbis-138/contracts/vault/`.
|
||||
8. **CMC submission** once a CMC Pro API key is available to re-probe. Most c* tokens with repo addresses can be submitted together.
|
||||
9. **DexScreener support** — file a request with DexScreener for Chain 138 indexer support. This is gated on them, not us.
|
||||
|
||||
---
|
||||
|
||||
## 4.1 Token checklist — 15 tokens
|
||||
|
||||
| Symbol | Address | Blockscout verified | BS token page | CoinGecko | CMC | DexScreener | Holders | Notes |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `WETH9` | [`0xC02a…6Cc2`](https://explorer.d-bis.org/token/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) | ☐ | ✓ (holders=36) | ✓ (id=weth) | ? (need API key) | ☐ | 36 | Genesis; WETH9 canonical mainnet address. Source verification may need `Wrapped Ether` v9 reference code. · CG hit is the *mainnet* WETH token at the same canonical address; needs a Chain-138-specific coin page. |
|
||||
| `WETH10` | [`0xf4BB…8A9f`](https://explorer.d-bis.org/token/0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f) | ☐ | ✓ (holders=4) | ☐ | ? (need API key) | ☐ | 4 | Genesis |
|
||||
| `LINK` | [`0xb772…2b03`](https://explorer.d-bis.org/token/0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03) | ☐ | ✓ (holders=44) | ☐ | ? (need API key) | ☐ | 44 | Chainlink Token (Chain 138 deployment of reference LINK) |
|
||||
| `cUSDT` | [`0x93E6…7f22`](https://explorer.d-bis.org/token/0x93E66202A11B1772E55407B32B44e5Cd8eda7f22) | ☐ | ✓ (holders=4599) | ☐ | ? (need API key) | ☐ | 4599 | |
|
||||
| `cUSDC` | [`0xf222…640b`](https://explorer.d-bis.org/token/0xf22258f57794CC8E06237084b353Ab30fFfa640b) | ☐ | ✓ (holders=60) | ☐ | ? (need API key) | ☐ | 60 | |
|
||||
| `cEURC` | [`0x8085…266a`](https://explorer.d-bis.org/token/0x8085961F9cF02b4d800A3c6d386D31da4B34266a) | ☐ | ✓ (holders=10) | ☐ | ? (need API key) | ☐ | 10 | |
|
||||
| `cEURT` | [`0xdf4b…9d72`](https://explorer.d-bis.org/token/0xdf4b71c61E5912712C1Bdd451416B9aC26949d72) | ☐ | ✓ (holders=12) | ☐ | ? (need API key) | ☐ | 12 | |
|
||||
| `cGBPC` | [`0x0039…4aD2`](https://explorer.d-bis.org/token/0x003960f16D9d34F2e98d62723B6721Fb92074aD2) | ☐ | ✓ (holders=9) | ☐ | ? (need API key) | ☐ | 9 | |
|
||||
| `cGBPT` | [`0x350f…D97c`](https://explorer.d-bis.org/token/0x350f54e4D23795f86A9c03988c7135357CCaD97c) | ☐ | ✓ (holders=9) | ☐ | ? (need API key) | ☐ | 9 | |
|
||||
| `cAUDC` | [`0xD514…069D`](https://explorer.d-bis.org/token/0xD51482e567c03899eecE3CAe8a058161FD56069D) | ☐ | ✓ (holders=8) | ☐ | ? (need API key) | ☐ | 8 | |
|
||||
| `cJPYC` | [`0xEe26…6770`](https://explorer.d-bis.org/token/0xEe269e1226a334182aace90056EE4ee5Cc8A6770) | ☐ | ✓ (holders=8) | ☐ | ? (need API key) | ☐ | 8 | |
|
||||
| `cCHFC` | [`0x8739…3885`](https://explorer.d-bis.org/token/0x873990849DDa5117d7C644f0aF24370797C03885) | ☐ | ✓ (holders=8) | ☐ | ? (need API key) | ☐ | 8 | |
|
||||
| `cCADC` | [`0x54dB…5679`](https://explorer.d-bis.org/token/0x54dBd40cF05e15906A2C21f600937e96787f5679) | ☐ | ✓ (holders=8) | ☐ | ? (need API key) | ☐ | 8 | |
|
||||
| `cXAUC` | [`0x290E…EC6b`](https://explorer.d-bis.org/token/0x290E52a8819A4fbD0714E517225429aA2B70EC6b) | ☐ | ✓ (holders=15) | ☐ | ? (need API key) | ☐ | 15 | 1 token = 1 troy oz Au |
|
||||
| `cXAUT` | [`0x94e4…C96E`](https://explorer.d-bis.org/token/0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E) | ☐ | ✓ (holders=10) | ☐ | ? (need API key) | ☐ | 10 | 1 token = 1 troy oz Au |
|
||||
|
||||
---
|
||||
|
||||
## 4.2 Core contract checklist — 29 contracts
|
||||
|
||||
| Contract | Address | Blockscout verified | Notes |
|
||||
|---|---|---|---|
|
||||
| `DODOPMMIntegration` | [`0x5BDc…e72d`](https://explorer.d-bis.org/address/0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d) | ☐ | |
|
||||
| `DODOPMMProvider` | [`0x5CAe…B381`](https://explorer.d-bis.org/address/0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381) | ☐ | |
|
||||
| `PMM_POOL1_cUSDT_cUSDC` | [`0xff8d…0849`](https://explorer.d-bis.org/address/0xff8d3b8fDF7B112759F076B69f4271D4209C0849) | ☐ | |
|
||||
| `PMM_POOL2_cUSDT_USDT` | [`0x6fc6…9D71`](https://explorer.d-bis.org/address/0x6fc60DEDc92a2047062294488539992710b99D71) | ☐ | |
|
||||
| `PMM_POOL3_cUSDC_USDC` | [`0x9f74…0263`](https://explorer.d-bis.org/address/0x9f74Be42725f2Aa072a9E0CdCce0E7203C510263) | ☐ | |
|
||||
| `CCIPRouter` | [`0x42DA…4817`](https://explorer.d-bis.org/address/0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817) | ☐ | |
|
||||
| `CCIPSender` | [`0x105F…4684`](https://explorer.d-bis.org/address/0x105F8A15b819948a89153505762444Ee9f324684) | ☐ | |
|
||||
| `CCIPWETH9Bridge` | [`0xcacf…820a`](https://explorer.d-bis.org/address/0xcacfd227A040002e49e2e01626363071324f820a) | ☐ | |
|
||||
| `CCIPWETH10Bridge` | [`0xe0E9…35D0`](https://explorer.d-bis.org/address/0xe0E93247376aa097dB308B92e6Ba36bA015535D0) | ☐ | |
|
||||
| `UniversalCCIPBridge_proxy_phased` | [`0xCd42…56F8`](https://explorer.d-bis.org/address/0xCd42e8eD79Dc50599535d1de48d3dAFa0BE156F8) | ☐ | |
|
||||
| `UniversalCCIPBridge_proxy_det` | [`0x532D…f6a3`](https://explorer.d-bis.org/address/0x532DE218b94993446Be30eC894442f911499f6a3) | ☐ | |
|
||||
| `BridgeOrchestrator_proxy` | [`0x89aB…eD6c`](https://explorer.d-bis.org/address/0x89aB428c437f23bAB9781ff8Db8D3848e27EeD6c) | ☐ | |
|
||||
| `CCIPReceiver_2026_02_13` | [`0xC122…430F`](https://explorer.d-bis.org/address/0xC12236C03b28e675d376774FCE2C2C052488430F) | ☐ | |
|
||||
| `Multicall_2026_02_13` | [`0xF4AA…96f7`](https://explorer.d-bis.org/address/0xF4AA429BE277d1a1a1A744C9e5B3aD821a9b96f7) | ☐ | |
|
||||
| `OracleAggregator_2026_02_13` | [`0xaFd9…58CE`](https://explorer.d-bis.org/address/0xaFd9E25ff301a79feaBcc56F46969F34808358CE) | ☐ | |
|
||||
| `OracleProxy_2026_02_13` | [`0x9056…2E92`](https://explorer.d-bis.org/address/0x90563867F2ba94ed277303e200f4311c00982E92) | ☐ | |
|
||||
| `MultiSig_2026_02_13` | [`0xb9E2…3965`](https://explorer.d-bis.org/address/0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965) | ☐ | |
|
||||
| `Voting_2026_02_13` | [`0x0222…cD93`](https://explorer.d-bis.org/address/0x022267b26400114aF01BaCcb92456Fe36cfccD93) | ☐ | |
|
||||
| `UniversalAssetRegistry_proxy_phased` | [`0xAEE4…8575`](https://explorer.d-bis.org/address/0xAEE4b7fBe82E1F8295951584CBc772b8BBD68575) | ☐ | |
|
||||
| `UniversalAssetRegistry_proxy_det` | [`0xC986…870f`](https://explorer.d-bis.org/address/0xC98602aa574F565b5478E8816BCab03C9De0870f) | ☐ | |
|
||||
| `GovernanceController_proxy` | [`0xA689…0E0e`](https://explorer.d-bis.org/address/0xA6891D5229f2181a34D4FF1B515c3Aa37dd90E0e) | ☐ | |
|
||||
| `RegulatedEntityRegistry` | [`0xEA4C…0b4B`](https://explorer.d-bis.org/address/0xEA4C892D6c1253797c5D95a05BF3863363080b4B) | ☐ | |
|
||||
| `VaultFactory` | [`0xB2Ac…2336`](https://explorer.d-bis.org/address/0xB2Ac70f35A81481B005067ed6567a5043BA32336) | ☐ | |
|
||||
| `Ledger` | [`0x67b3…B7af`](https://explorer.d-bis.org/address/0x67b3831dc64C14FB9352B2a45C6Dd69b3C86B7af) | ☐ | |
|
||||
| `Liquidation` | [`0x3aCd…AB72`](https://explorer.d-bis.org/address/0x3aCdbCB749d6037a02F0ef6ea2E5Fb89D31fAB72) | ☐ | |
|
||||
| `XAU_Oracle` | [`0xf23E…77A8`](https://explorer.d-bis.org/address/0xf23E1eDa304082ab7a81531dFE6020E6105e77A8) | ☐ | |
|
||||
| `MerchantSettlementRegistry` | [`0x16D9…8800`](https://explorer.d-bis.org/address/0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800) | ✓ `MerchantSettlementRegistry` | |
|
||||
| `WithdrawalEscrow` | [`0xe77c…E46D`](https://explorer.d-bis.org/address/0xe77cb26eA300e2f5304b461b0EC94c8AD6A7E46D) | ✓ `WithdrawalEscrow` | |
|
||||
| `CREATE2Factory` | [`0x750E…0825`](https://explorer.d-bis.org/address/0x750E4a8adCe9f0e67A420aBE91342DC64Eb90825) | ☐ | |
|
||||
|
||||
---
|
||||
|
||||
## Evidence
|
||||
|
||||
- Probe script: `/home/ubuntu/verification-probe/probe.py` (committed to repo as `scripts/verify/explorer-verification-probe.py`).
|
||||
- Raw probe results: `/home/ubuntu/verification-probe/results.json` (44 entries; schema: `{sym, addr, kind, blockscout_source, blockscout_token, coingecko, cmc, dexscreener}`).
|
||||
- CoinGecko asset-platform probe: `GET https://api.coingecko.com/api/v3/coins/defi-oracle-meta-mainnet/contract/0xC02a…6Cc2` → 200 (coin_id=weth). Proves the CG slug is already registered.
|
||||
- Blockscout API base: `https://explorer.d-bis.org/api` (Module API) and `https://explorer.d-bis.org/api/v2` (REST API).
|
||||
|
||||
## How to re-run
|
||||
|
||||
```bash
|
||||
python3 scripts/verify/explorer-verification-probe.py > reports/status/explorer-verification-latest.json
|
||||
# With CMC Pro key for the CMC column:
|
||||
CMC_PRO_API_KEY=... python3 scripts/verify/explorer-verification-probe.py > reports/status/explorer-verification-latest.json
|
||||
```
|
||||
|
||||
The script is read-only, takes ~15 seconds (8 worker threads), and does not require LAN access or a signing key.
|
||||
|
||||
---
|
||||
|
||||
## Out of scope (tracked elsewhere)
|
||||
|
||||
- **Cross-chain `cW*` verification on Ethereum / Polygon / Base / Optimism / BSC / Avalanche / Arbitrum / Cronos / Celo / Gnosis.** Needs a per-chain probe script aimed at each chain's block explorer. Tracked in `PR #6 / STATUS_VOCABULARY.md` under the `verified-on-explorer` axis.
|
||||
- **LINK on Chain 138 — is the contract at `0xb77…2b03` actually Chainlink's reference source?** If yes, source verification should point to the audited LINK source. If Chain 138 uses a redeployed variant, flag as a credibility risk.
|
||||
- **The two non-canonical LINK / cUSDT / cUSDC addresses flagged in `EXPLORER_TOKEN_LIST_CROSSCHECK §2`** — out of scope for the credibility checklist but worth a separate cleanup so external explorers don't index them.
|
||||
|
||||
823
reports/status/explorer-verification-latest.json
Normal file
823
reports/status/explorer-verification-latest.json
Normal file
@@ -0,0 +1,823 @@
|
||||
[
|
||||
{
|
||||
"sym": "WETH9",
|
||||
"addr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
||||
"kind": "token",
|
||||
"note": "Genesis; WETH9 canonical mainnet address. Source verification may need `Wrapped Ether` v9 reference code.",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": null,
|
||||
"symbol": null,
|
||||
"decimals": "0",
|
||||
"holders": "36",
|
||||
"total_supply": "55504055200000000000000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": true,
|
||||
"slug": "defi-oracle-meta-mainnet",
|
||||
"coin_id": "weth",
|
||||
"symbol": "weth"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 30,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "WETH10",
|
||||
"addr": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f",
|
||||
"kind": "token",
|
||||
"note": "Genesis",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Wrapped Ether v10",
|
||||
"symbol": "WETH10",
|
||||
"decimals": "18",
|
||||
"holders": "4",
|
||||
"total_supply": "12010000000000000000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "LINK",
|
||||
"addr": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03",
|
||||
"kind": "token",
|
||||
"note": "Chainlink Token (Chain 138 deployment of reference LINK)",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Chainlink Token",
|
||||
"symbol": "LINK",
|
||||
"decimals": "18",
|
||||
"holders": "44",
|
||||
"total_supply": "1150022000000000000000000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cUSDT",
|
||||
"addr": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Tether USD (Compliant)",
|
||||
"symbol": "cUSDT",
|
||||
"decimals": "6",
|
||||
"holders": "4599",
|
||||
"total_supply": "928784229000000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cUSDC",
|
||||
"addr": "0xf22258f57794CC8E06237084b353Ab30fFfa640b",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "USD Coin (Compliant)",
|
||||
"symbol": "cUSDC",
|
||||
"decimals": "6",
|
||||
"holders": "60",
|
||||
"total_supply": "937011267000000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cEURC",
|
||||
"addr": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Euro Coin (Compliant)",
|
||||
"symbol": "cEURC",
|
||||
"decimals": "6",
|
||||
"holders": "10",
|
||||
"total_supply": "72706988330000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cEURT",
|
||||
"addr": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Tether EUR (Compliant)",
|
||||
"symbol": "cEURT",
|
||||
"decimals": "6",
|
||||
"holders": "12",
|
||||
"total_supply": "71235330330000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cGBPC",
|
||||
"addr": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Pound Sterling (Compliant)",
|
||||
"symbol": "cGBPC",
|
||||
"decimals": "6",
|
||||
"holders": "9",
|
||||
"total_supply": "34076968470000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cGBPT",
|
||||
"addr": "0x350f54e4D23795f86A9c03988c7135357CCaD97c",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Tether GBP (Compliant)",
|
||||
"symbol": "cGBPT",
|
||||
"decimals": "6",
|
||||
"holders": "9",
|
||||
"total_supply": "75066546470000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cAUDC",
|
||||
"addr": "0xD51482e567c03899eecE3CAe8a058161FD56069D",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Australian Dollar (Compliant)",
|
||||
"symbol": "cAUDC",
|
||||
"decimals": "6",
|
||||
"holders": "8",
|
||||
"total_supply": "56804486580000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cJPYC",
|
||||
"addr": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Japanese Yen (Compliant)",
|
||||
"symbol": "cJPYC",
|
||||
"decimals": "6",
|
||||
"holders": "8",
|
||||
"total_supply": "91977287100000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cCHFC",
|
||||
"addr": "0x873990849DDa5117d7C644f0aF24370797C03885",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Swiss Franc (Compliant)",
|
||||
"symbol": "cCHFC",
|
||||
"decimals": "6",
|
||||
"holders": "8",
|
||||
"total_supply": "32918682790000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cCADC",
|
||||
"addr": "0x54dBd40cF05e15906A2C21f600937e96787f5679",
|
||||
"kind": "token",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Canadian Dollar (Compliant)",
|
||||
"symbol": "cCADC",
|
||||
"decimals": "6",
|
||||
"holders": "8",
|
||||
"total_supply": "44871934240000"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cXAUC",
|
||||
"addr": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b",
|
||||
"kind": "token",
|
||||
"note": "1 token = 1 troy oz Au",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Gold (Compliant)",
|
||||
"symbol": "cXAUC",
|
||||
"decimals": "6",
|
||||
"holders": "15",
|
||||
"total_supply": "1007568265651"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "cXAUT",
|
||||
"addr": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E",
|
||||
"kind": "token",
|
||||
"note": "1 token = 1 troy oz Au",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
},
|
||||
"blockscout_token": {
|
||||
"listed": true,
|
||||
"name": "Tether XAU (Compliant)",
|
||||
"symbol": "cXAUT",
|
||||
"decimals": "6",
|
||||
"holders": "10",
|
||||
"total_supply": "1007568265651"
|
||||
},
|
||||
"coingecko": {
|
||||
"listed": false,
|
||||
"status": "not found on coingecko under any chain-138 slug"
|
||||
},
|
||||
"cmc": {
|
||||
"listed": null,
|
||||
"status": "no CMC_PRO_API_KEY in env"
|
||||
},
|
||||
"dexscreener": {
|
||||
"listed": false,
|
||||
"num_pairs_any_chain": 0,
|
||||
"num_pairs_chain_138": 0,
|
||||
"example_dex": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "DODOPMMIntegration",
|
||||
"addr": "0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "DODOPMMProvider",
|
||||
"addr": "0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "PMM_POOL1_cUSDT_cUSDC",
|
||||
"addr": "0xff8d3b8fDF7B112759F076B69f4271D4209C0849",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "PMM_POOL2_cUSDT_USDT",
|
||||
"addr": "0x6fc60DEDc92a2047062294488539992710b99D71",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "PMM_POOL3_cUSDC_USDC",
|
||||
"addr": "0x9f74Be42725f2Aa072a9E0CdCce0E7203C510263",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "CCIPRouter",
|
||||
"addr": "0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "CCIPSender",
|
||||
"addr": "0x105F8A15b819948a89153505762444Ee9f324684",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "CCIPWETH9Bridge",
|
||||
"addr": "0xcacfd227A040002e49e2e01626363071324f820a",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "CCIPWETH10Bridge",
|
||||
"addr": "0xe0E93247376aa097dB308B92e6Ba36bA015535D0",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "UniversalCCIPBridge_proxy_phased",
|
||||
"addr": "0xCd42e8eD79Dc50599535d1de48d3dAFa0BE156F8",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "UniversalCCIPBridge_proxy_det",
|
||||
"addr": "0x532DE218b94993446Be30eC894442f911499f6a3",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "BridgeOrchestrator_proxy",
|
||||
"addr": "0x89aB428c437f23bAB9781ff8Db8D3848e27EeD6c",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "CCIPReceiver_2026_02_13",
|
||||
"addr": "0xC12236C03b28e675d376774FCE2C2C052488430F",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "Multicall_2026_02_13",
|
||||
"addr": "0xF4AA429BE277d1a1a1A744C9e5B3aD821a9b96f7",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "OracleAggregator_2026_02_13",
|
||||
"addr": "0xaFd9E25ff301a79feaBcc56F46969F34808358CE",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "OracleProxy_2026_02_13",
|
||||
"addr": "0x90563867F2ba94ed277303e200f4311c00982E92",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "MultiSig_2026_02_13",
|
||||
"addr": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "Voting_2026_02_13",
|
||||
"addr": "0x022267b26400114aF01BaCcb92456Fe36cfccD93",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "UniversalAssetRegistry_proxy_phased",
|
||||
"addr": "0xAEE4b7fBe82E1F8295951584CBc772b8BBD68575",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "UniversalAssetRegistry_proxy_det",
|
||||
"addr": "0xC98602aa574F565b5478E8816BCab03C9De0870f",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "GovernanceController_proxy",
|
||||
"addr": "0xA6891D5229f2181a34D4FF1B515c3Aa37dd90E0e",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "RegulatedEntityRegistry",
|
||||
"addr": "0xEA4C892D6c1253797c5D95a05BF3863363080b4B",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "VaultFactory",
|
||||
"addr": "0xB2Ac70f35A81481B005067ed6567a5043BA32336",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "Ledger",
|
||||
"addr": "0x67b3831dc64C14FB9352B2a45C6Dd69b3C86B7af",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "Liquidation",
|
||||
"addr": "0x3aCdbCB749d6037a02F0ef6ea2E5Fb89D31fAB72",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "XAU_Oracle",
|
||||
"addr": "0xf23E1eDa304082ab7a81531dFE6020E6105e77A8",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "MerchantSettlementRegistry",
|
||||
"addr": "0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": true,
|
||||
"contract_name": "MerchantSettlementRegistry",
|
||||
"compiler": "v0.8.20+commit.a1b79de6",
|
||||
"optimizer": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "WithdrawalEscrow",
|
||||
"addr": "0xe77cb26eA300e2f5304b461b0EC94c8AD6A7E46D",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": true,
|
||||
"contract_name": "WithdrawalEscrow",
|
||||
"compiler": "v0.8.20+commit.a1b79de6",
|
||||
"optimizer": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"sym": "CREATE2Factory",
|
||||
"addr": "0x750E4a8adCe9f0e67A420aBE91342DC64Eb90825",
|
||||
"kind": "core",
|
||||
"blockscout_source": {
|
||||
"verified": false,
|
||||
"contract_name": "",
|
||||
"compiler": null,
|
||||
"optimizer": null
|
||||
}
|
||||
}
|
||||
]
|
||||
212
scripts/verify/explorer-verification-probe.py
Executable file
212
scripts/verify/explorer-verification-probe.py
Executable file
@@ -0,0 +1,212 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Chain 138 explorer-verification + external-listing probe.
|
||||
|
||||
For each canonical contract address:
|
||||
- Blockscout: is source verified? (`/api?module=contract&action=getsourcecode`)
|
||||
- Blockscout: token-page reachable? (`/api/v2/tokens/{address}` for tokens only)
|
||||
- CoinGecko: is the token listed? (`/coins/defi-oracle-meta-mainnet/contract/{address}`)
|
||||
- CMC: is the token listed? (v2 `/cryptocurrency/info?address=...&skip_invalid=true`)
|
||||
- DexScreener: `/latest/dex/tokens/{address}`
|
||||
|
||||
Read-only. No keys required for CoinGecko/DexScreener/Blockscout public endpoints.
|
||||
CMC requires `CMC_PRO_API_KEY` if present.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json, os, sys, time, urllib.request, urllib.parse, urllib.error
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
|
||||
BLOCKSCOUT = "https://explorer.d-bis.org"
|
||||
CHAIN138 = 138
|
||||
|
||||
CONTRACTS = [
|
||||
# tokens
|
||||
{"sym": "WETH9", "addr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "kind": "token", "note": "Genesis; WETH9 canonical mainnet address. Source verification may need `Wrapped Ether` v9 reference code."},
|
||||
{"sym": "WETH10", "addr": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f", "kind": "token", "note": "Genesis"},
|
||||
{"sym": "LINK", "addr": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03", "kind": "token", "note": "Chainlink Token (Chain 138 deployment of reference LINK)"},
|
||||
{"sym": "cUSDT", "addr": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "kind": "token"},
|
||||
{"sym": "cUSDC", "addr": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "kind": "token"},
|
||||
{"sym": "cEURC", "addr": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", "kind": "token"},
|
||||
{"sym": "cEURT", "addr": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", "kind": "token"},
|
||||
{"sym": "cGBPC", "addr": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", "kind": "token"},
|
||||
{"sym": "cGBPT", "addr": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", "kind": "token"},
|
||||
{"sym": "cAUDC", "addr": "0xD51482e567c03899eecE3CAe8a058161FD56069D", "kind": "token"},
|
||||
{"sym": "cJPYC", "addr": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", "kind": "token"},
|
||||
{"sym": "cCHFC", "addr": "0x873990849DDa5117d7C644f0aF24370797C03885", "kind": "token"},
|
||||
{"sym": "cCADC", "addr": "0x54dBd40cF05e15906A2C21f600937e96787f5679", "kind": "token"},
|
||||
{"sym": "cXAUC", "addr": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", "kind": "token", "note": "1 token = 1 troy oz Au"},
|
||||
{"sym": "cXAUT", "addr": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", "kind": "token", "note": "1 token = 1 troy oz Au"},
|
||||
|
||||
# PMM stack
|
||||
{"sym": "DODOPMMIntegration", "addr": "0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d", "kind": "core"},
|
||||
{"sym": "DODOPMMProvider", "addr": "0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381", "kind": "core"},
|
||||
{"sym": "PMM_POOL1_cUSDT_cUSDC", "addr": "0xff8d3b8fDF7B112759F076B69f4271D4209C0849", "kind": "core"},
|
||||
{"sym": "PMM_POOL2_cUSDT_USDT", "addr": "0x6fc60DEDc92a2047062294488539992710b99D71", "kind": "core"},
|
||||
{"sym": "PMM_POOL3_cUSDC_USDC", "addr": "0x9f74Be42725f2Aa072a9E0CdCce0E7203C510263", "kind": "core"},
|
||||
|
||||
# CCIP + cross-chain
|
||||
{"sym": "CCIPRouter", "addr": "0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817", "kind": "core"},
|
||||
{"sym": "CCIPSender", "addr": "0x105F8A15b819948a89153505762444Ee9f324684", "kind": "core"},
|
||||
{"sym": "CCIPWETH9Bridge", "addr": "0xcacfd227A040002e49e2e01626363071324f820a", "kind": "core"},
|
||||
{"sym": "CCIPWETH10Bridge", "addr": "0xe0E93247376aa097dB308B92e6Ba36bA015535D0", "kind": "core"},
|
||||
{"sym": "UniversalCCIPBridge_proxy_phased", "addr": "0xCd42e8eD79Dc50599535d1de48d3dAFa0BE156F8", "kind": "core"},
|
||||
{"sym": "UniversalCCIPBridge_proxy_det", "addr": "0x532DE218b94993446Be30eC894442f911499f6a3", "kind": "core"},
|
||||
{"sym": "BridgeOrchestrator_proxy", "addr": "0x89aB428c437f23bAB9781ff8Db8D3848e27EeD6c", "kind": "core"},
|
||||
{"sym": "CCIPReceiver_2026_02_13", "addr": "0xC12236C03b28e675d376774FCE2C2C052488430F", "kind": "core"},
|
||||
|
||||
# Oracle + governance
|
||||
{"sym": "Multicall_2026_02_13", "addr": "0xF4AA429BE277d1a1a1A744C9e5B3aD821a9b96f7", "kind": "core"},
|
||||
{"sym": "OracleAggregator_2026_02_13","addr": "0xaFd9E25ff301a79feaBcc56F46969F34808358CE", "kind": "core"},
|
||||
{"sym": "OracleProxy_2026_02_13", "addr": "0x90563867F2ba94ed277303e200f4311c00982E92", "kind": "core"},
|
||||
{"sym": "MultiSig_2026_02_13", "addr": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", "kind": "core"},
|
||||
{"sym": "Voting_2026_02_13", "addr": "0x022267b26400114aF01BaCcb92456Fe36cfccD93", "kind": "core"},
|
||||
{"sym": "UniversalAssetRegistry_proxy_phased", "addr": "0xAEE4b7fBe82E1F8295951584CBc772b8BBD68575", "kind": "core"},
|
||||
{"sym": "UniversalAssetRegistry_proxy_det", "addr": "0xC98602aa574F565b5478E8816BCab03C9De0870f", "kind": "core"},
|
||||
{"sym": "GovernanceController_proxy", "addr": "0xA6891D5229f2181a34D4FF1B515c3Aa37dd90E0e", "kind": "core"},
|
||||
|
||||
# Vault system
|
||||
{"sym": "RegulatedEntityRegistry", "addr": "0xEA4C892D6c1253797c5D95a05BF3863363080b4B", "kind": "core"},
|
||||
{"sym": "VaultFactory", "addr": "0xB2Ac70f35A81481B005067ed6567a5043BA32336", "kind": "core"},
|
||||
{"sym": "Ledger", "addr": "0x67b3831dc64C14FB9352B2a45C6Dd69b3C86B7af", "kind": "core"},
|
||||
{"sym": "Liquidation", "addr": "0x3aCdbCB749d6037a02F0ef6ea2E5Fb89D31fAB72", "kind": "core"},
|
||||
{"sym": "XAU_Oracle", "addr": "0xf23E1eDa304082ab7a81531dFE6020E6105e77A8", "kind": "core"},
|
||||
|
||||
# alltra-lifi + factory
|
||||
{"sym": "MerchantSettlementRegistry", "addr": "0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800", "kind": "core"},
|
||||
{"sym": "WithdrawalEscrow", "addr": "0xe77cb26eA300e2f5304b461b0EC94c8AD6A7E46D", "kind": "core"},
|
||||
{"sym": "CREATE2Factory", "addr": "0x750E4a8adCe9f0e67A420aBE91342DC64Eb90825", "kind": "core"},
|
||||
]
|
||||
|
||||
def http_json(url: str, headers: dict | None = None, timeout: int = 20) -> tuple[int, dict | None]:
|
||||
req = urllib.request.Request(url, headers=headers or {"User-Agent": "chain138-verify/1.0"})
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=timeout) as r:
|
||||
code = r.getcode()
|
||||
body = r.read()
|
||||
try:
|
||||
return code, json.loads(body)
|
||||
except Exception:
|
||||
return code, {"_raw": body[:200].decode("utf-8", errors="replace")}
|
||||
except urllib.error.HTTPError as e:
|
||||
try:
|
||||
body = json.loads(e.read())
|
||||
except Exception:
|
||||
body = None
|
||||
return e.code, body
|
||||
except Exception as e:
|
||||
return -1, {"_err": str(e)}
|
||||
|
||||
def probe_blockscout_source(addr: str) -> dict:
|
||||
# Module API: getsourcecode — returns SourceCode="" when unverified
|
||||
url = f"{BLOCKSCOUT}/api?module=contract&action=getsourcecode&address={addr}"
|
||||
code, data = http_json(url)
|
||||
if code != 200 or not data:
|
||||
return {"verified": False, "status": f"http {code}", "raw": str(data)[:200]}
|
||||
result = data.get("result")
|
||||
if isinstance(result, list) and result:
|
||||
result = result[0]
|
||||
if not isinstance(result, dict):
|
||||
return {"verified": False, "status": "no-result", "raw": str(data)[:200]}
|
||||
src = result.get("SourceCode") or ""
|
||||
name = result.get("ContractName") or ""
|
||||
abi = result.get("ABI") or ""
|
||||
return {
|
||||
"verified": bool(src) and abi and abi != "Contract source code not verified",
|
||||
"contract_name": name,
|
||||
"compiler": result.get("CompilerVersion"),
|
||||
"optimizer": result.get("OptimizationUsed"),
|
||||
}
|
||||
|
||||
def probe_blockscout_token(addr: str) -> dict:
|
||||
url = f"{BLOCKSCOUT}/api/v2/tokens/{addr}"
|
||||
code, data = http_json(url)
|
||||
if code != 200 or not data:
|
||||
return {"listed": False, "status": f"http {code}"}
|
||||
return {
|
||||
"listed": True,
|
||||
"name": data.get("name"),
|
||||
"symbol": data.get("symbol"),
|
||||
"decimals": data.get("decimals"),
|
||||
"holders": data.get("holders") or data.get("holders_count"),
|
||||
"total_supply": data.get("total_supply"),
|
||||
}
|
||||
|
||||
def probe_coingecko(addr: str) -> dict:
|
||||
# The CoinGecko asset-platform slug for a custom chain depends on CG's registry.
|
||||
# Chain 138 is NOT currently on CoinGecko (that's what we're submitting). We still
|
||||
# probe the standard endpoint so we can differentiate 404 vs 200.
|
||||
# Known slugs to try in priority order:
|
||||
slugs = ["defi-oracle-meta-mainnet", "dbis", "defi-oracle-meta"]
|
||||
for slug in slugs:
|
||||
url = f"https://api.coingecko.com/api/v3/coins/{slug}/contract/{addr.lower()}"
|
||||
code, data = http_json(url, timeout=10)
|
||||
if code == 200 and data and data.get("id"):
|
||||
return {"listed": True, "slug": slug, "coin_id": data.get("id"), "symbol": data.get("symbol")}
|
||||
# 429 -> backoff
|
||||
if code == 429:
|
||||
time.sleep(2)
|
||||
return {"listed": False, "status": "not found on coingecko under any chain-138 slug"}
|
||||
|
||||
def probe_cmc(addr: str) -> dict:
|
||||
api_key = os.environ.get("CMC_PRO_API_KEY")
|
||||
if not api_key:
|
||||
return {"listed": None, "status": "no CMC_PRO_API_KEY in env"}
|
||||
url = f"https://pro-api.coinmarketcap.com/v2/cryptocurrency/info?address={addr}&skip_invalid=true"
|
||||
code, data = http_json(url, headers={"X-CMC_PRO_API_KEY": api_key}, timeout=15)
|
||||
if code != 200 or not data:
|
||||
return {"listed": False, "status": f"http {code}"}
|
||||
d = data.get("data") or {}
|
||||
if not d:
|
||||
return {"listed": False}
|
||||
key = next(iter(d.keys()))
|
||||
val = d[key] if key else None
|
||||
if isinstance(val, list):
|
||||
val = val[0] if val else None
|
||||
if isinstance(val, dict):
|
||||
return {"listed": True, "name": val.get("name"), "symbol": val.get("symbol"), "id": val.get("id"), "slug": val.get("slug")}
|
||||
return {"listed": False}
|
||||
|
||||
def probe_dexscreener(addr: str) -> dict:
|
||||
# DexScreener indexes by token across all chains it supports; Chain 138 may not be supported at all.
|
||||
url = f"https://api.dexscreener.com/latest/dex/tokens/{addr}"
|
||||
code, data = http_json(url, timeout=15)
|
||||
if code != 200 or not data:
|
||||
return {"listed": False, "status": f"http {code}"}
|
||||
pairs = data.get("pairs") or []
|
||||
chain_138_pairs = [p for p in pairs if str(p.get("chainId")) in ("138", "dbis", "defi-oracle-meta-mainnet")]
|
||||
return {
|
||||
"listed": bool(chain_138_pairs),
|
||||
"num_pairs_any_chain": len(pairs),
|
||||
"num_pairs_chain_138": len(chain_138_pairs),
|
||||
"example_dex": chain_138_pairs[0].get("dexId") if chain_138_pairs else None,
|
||||
}
|
||||
|
||||
def probe_one(c: dict) -> dict:
|
||||
addr = c["addr"]
|
||||
out = dict(c)
|
||||
out["blockscout_source"] = probe_blockscout_source(addr)
|
||||
if c["kind"] == "token":
|
||||
out["blockscout_token"] = probe_blockscout_token(addr)
|
||||
out["coingecko"] = probe_coingecko(addr)
|
||||
out["cmc"] = probe_cmc(addr)
|
||||
out["dexscreener"] = probe_dexscreener(addr)
|
||||
return out
|
||||
|
||||
def main():
|
||||
results = []
|
||||
with ThreadPoolExecutor(max_workers=8) as ex:
|
||||
futures = {ex.submit(probe_one, c): c for c in CONTRACTS}
|
||||
for i, f in enumerate(as_completed(futures), 1):
|
||||
c = futures[f]
|
||||
try:
|
||||
r = f.result()
|
||||
except Exception as e:
|
||||
r = {**c, "_error": str(e)}
|
||||
results.append(r)
|
||||
print(f"[{i:>2}/{len(CONTRACTS)}] {c['sym']:<40} done", file=sys.stderr)
|
||||
# Preserve input order
|
||||
results.sort(key=lambda r: [c2["sym"] for c2 in CONTRACTS].index(r["sym"]))
|
||||
print(json.dumps(results, indent=2))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user