- Marked submodules ai-mcp-pmm-controller, explorer-monorepo, and smom-dbis-138 as dirty to reflect recent changes. - Updated documentation to clarify operator script usage, including dotenv loading and task execution instructions. - Enhanced the README and various index files to provide clearer navigation and task completion guidance. Made-with: Cursor
13 KiB
Explorer Token List Cross-Check
Last Updated: 2026-03-04
Purpose: Cross-check the token list shown at https://explorer.d-bis.org/tokens against repo token lists, canonical addresses, and CONTRACT_ADDRESSES_REFERENCE.
1. Where the Explorer Gets Its Token List
| Source | Used for | API / file |
|---|---|---|
| Blockscout API | The Tokens tab on the Explorer (/tokens) |
GET https://explorer.d-bis.org/api/v2/tokens?page=1&page_size=100 |
| Embedded token list (MetaMask) | Wallet “token list” URL for Chain 138 / multi-chain | Explorer backend GET /api/config/token-list → explorer-monorepo/backend/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json |
The Tokens page content is not from the repo’s static token list files. It is live from Blockscout: whatever Blockscout has indexed on-chain (ERC-20 contracts) for Chain 138.
2. Blockscout Token List (Live as of 2026-02-27)
Fetched from https://explorer.d-bis.org/api/v2/tokens?page=1&page_size=100:
| Address | Symbol | Name | Decimals | Match to repo canonical? |
|---|---|---|---|---|
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
(null) | (null) | 0 | ✅ WETH9 — metadata missing (name/symbol/decimals not set in response; on-chain may differ) |
0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03 |
LINK | Chainlink Token | 18 | ✅ Canonical LINK |
0x93E66202A11B1772E55407B32B44e5Cd8eda7f22 |
cUSDT | Tether USD (Compliant) | 6 | ✅ Canonical cUSDT |
0xf22258f57794CC8E06237084b353Ab30fFfa640b |
cUSDC | USD Coin (Compliant) | 6 | ✅ Canonical cUSDC |
0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F |
WETH10 | Wrapped Ether v10 | 18 | ✅ Canonical WETH10 |
0x8085961F9cF02b4d800A3c6d386D31da4B34266a |
cEURC | Euro Coin (Compliant) | 6 | ✅ Canonical cEURC |
0xdf4b71c61E5912712C1Bdd451416B9aC26949d72 |
cEURT | Tether EUR (Compliant) | 6 | ✅ Canonical cEURT |
0x003960f16D9d34F2e98d62723B6721Fb92074aD2 |
cGBPC | Pound Sterling (Compliant) | 6 | ✅ Canonical cGBPC |
0x350f54e4D23795f86A9c03988c7135357CCaD97c |
cGBPT | Tether GBP (Compliant) | 6 | ✅ Canonical cGBPT |
0xD51482e567c03899eecE3CAe8a058161FD56069D |
cAUDC | Australian Dollar (Compliant) | 6 | ✅ Canonical cAUDC |
0xEe269e1226a334182aace90056EE4ee5Cc8A6770 |
cJPYC | Japanese Yen (Compliant) | 6 | ✅ Canonical cJPYC |
0x873990849DDa5117d7C644f0aF24370797C03885 |
cCHFC | Swiss Franc (Compliant) | 6 | ✅ Canonical cCHFC |
0x54dBd40cF05e15906A2C21f600937e96787f5679 |
cCADC | Canadian Dollar (Compliant) | 6 | ✅ Canonical cCADC |
0x290E52a8819A4fbD0714E517225429aA2B70EC6b |
cXAUC | Gold (Compliant) | 6 | ✅ Canonical cXAUC |
0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E |
cXAUT | Tether XAU (Compliant) | 6 | ✅ Canonical cXAUT |
Additional contracts returned by Blockscout (same symbol, different addresses):
| Address | Symbol | Note |
|---|---|---|
0x362E9a45Ef6e554760f9671938235Cbc9b6E80Ed |
LINK | Non-canonical; likely test/deploy clone |
0xC158b6cD3A3088C52F797D41f5Aa02825361629e |
LINK | Non-canonical; likely test/deploy clone |
0x36927A5D9896CD6323cfEca1060A9aE932b05B05 |
cUSDT | Non-canonical |
0xFe6023265F3893C4cc98CE5Fe7ACBd79DB9cbB2D |
cUSDT | Non-canonical |
0x044032f30393c60138445061c941e2FB15fb0af2 |
cUSDC | Non-canonical |
0x98E6aF252C55020d99A32F46B541d9A95987Cd0e |
cUSDC | Non-canonical |
These extra addresses are on-chain ERC-20 contracts that Blockscout indexes; they are not in the repo’s canonical token list and may be legacy/test deployments.
2.1 WETH9 metadata quirk (confirmed live 2026-03)
The Explorer’s Blockscout endpoint returns WETH9 at 0xC02a… with name=null, symbol=null, decimals="0", while other tokens (cUSDT, cUSDC, WETH10) return correct metadata. The address is correct by design: Chain 138’s WETH9 is deployed at the same canonical Ethereum mainnet address (genesis/pre-deploy). The only issue is Blockscout’s metadata extraction for that contract.
Minimal diff for WETH9:
| Address | Field | Blockscout /api/v2/tokens |
Expected (tokenlist / override) |
|---|---|---|---|
0xC02a…6Cc2 |
name |
null |
"Wrapped Ether" |
0xC02a…6Cc2 |
symbol |
null |
"WETH" |
0xC02a…6Cc2 |
decimals |
"0" |
18 |
Root cause (likely): Either (1) the contract at 0xC02a… on 138 does not expose name()/symbol()/decimals() in the way Blockscout expects (or proxy/etch/genesis quirks), or (2) Blockscout’s token metadata indexer failed to decode that address and cached null/0.
Actionable fixes (practical order):
- Confirm WETH9 on-chain — Call
name(),symbol(),decimals()against Chain 138 RPC for0xC02a…. If any revert or return empty → fix deployment/etching or add a metadata wrapper. - Fix Blockscout — Force re-index/rescan token metadata for that address (Blockscout admin/indexer), or add a token metadata override for
0xC02a…if supported. - Keep Explorer UI override — The Explorer SPA already patches WETH9 via
knownTokensinexplorer-spa.js; keep as stopgap until Blockscout returns correct metadata.
To regenerate a full diff (missing_in_blockscout, missing_in_tokenlist, metadata_mismatches), run:
node token-lists/scripts/diff-blockscout-vs-tokenlist.js [--url URL] [--file path/to/blockscout-tokens.json]
and use dbis-138.tokenlist.json as the curated source. See §9.
3. Repo Token Lists vs Explorer (Blockscout)
3.1 token-lists/lists/dbis-138.tokenlist.json (Chain 138 only)
| In dbis-138.tokenlist.json | In Blockscout /v2/tokens? | Note |
|---|---|---|
| ETH-USD (0x3304… — Oracle) | No (not an ERC-20 supply token) | Expected; Oracle is a contract, not a supply token in Blockscout list |
| WETH (0xC02aa…) | Yes (name/symbol null, decimals 0) | Explorer: WETH9 metadata incomplete in API response |
| WETH10 (0xf4BB2e…) | Yes | Match |
| LINK (0xb7721d…) | Yes | Match |
| cUSDT (0x93E6…) | Yes | Match |
| cUSDC (0xf22258…) | Yes | Match |
| cEURC (0x808596…) | Yes | Match |
Missing from dbis-138.tokenlist.json but present on Explorer (Blockscout):
cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT.
So the curated token list is missing 9 compliant tokens that exist on-chain and appear on the Explorer.
3.2 explorer-monorepo/backend/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json
Chain 138 entries: same 7 as dbis-138 (ETH-USD, WETH, WETH10, LINK, cUSDT, cUSDC, cEURC). So same gap: the 9 additional compliant tokens (cEURT, cGBP*, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT) are not in the MetaMask token list.
3.3 ADDRESS_MATRIX_AND_STATUS.md / CONTRACT_ADDRESSES_REFERENCE.md
All canonical Chain 138 token addresses (WETH, WETH10, LINK, cUSDT, cUSDC, cEURC, cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT) match the Blockscout “canonical” set above. The matrix marks cEURT as “not deployed” but Blockscout shows it at 0xdf4b71… — update doc: cEURT is deployed.
4. Summary of Gaps and Actions
| Item | Status | Recommendation |
|---|---|---|
| Explorer token list source | Confirmed: Blockscout GET /api/v2/tokens |
No change; document only. |
| WETH9 on Blockscout | First token has decimals: "0", name/symbol: null |
Verify WETH9 contract metadata on-chain; fix in contract or in Blockscout indexing if needed. |
| dbis-138.tokenlist.json | Done (2026-02-28) | Added cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT. |
| DUAL_CHAIN_TOKEN_LIST (MetaMask) | Done (2026-02-28) | Added same 9 tokens to backend and api/rest copies. |
| ADDRESS_MATRIX / docs | Done | cEURT and all 16 tokens in §1.1; TransactionMirror 0x7131…; summary updated. |
| Extra LINK/cUSDT/cUSDC on Blockscout | 6 additional contracts | Non-canonical; use §5 canonical addresses only. |
5. Reference: Canonical Chain 138 Token Addresses (Single Source)
Use this table to align token lists and docs with the Explorer (Blockscout) and canonical-tokens.ts:
| Symbol | Address | Decimals |
|---|---|---|
| WETH (WETH9) | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
18 |
| WETH10 | 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f |
18 |
| LINK | 0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03 |
18 |
| cUSDT | 0x93E66202A11B1772E55407B32B44e5Cd8eda7f22 |
6 |
| cUSDC | 0xf22258f57794CC8E06237084b353Ab30fFfa640b |
6 |
| cEURC | 0x8085961F9cF02b4d800A3c6d386D31da4B34266a |
6 |
| cEURT | 0xdf4b71c61E5912712C1Bdd451416B9aC26949d72 |
6 |
| cGBPC | 0x003960f16D9d34F2e98d62723B6721Fb92074aD2 |
6 |
| cGBPT | 0x350f54e4D23795f86A9c03988c7135357CCaD97c |
6 |
| cAUDC | 0xD51482e567c03899eecE3CAe8a058161FD56069D |
6 |
| cJPYC | 0xEe269e1226a334182aace90056EE4ee5Cc8A6770 |
6 |
| cCHFC | 0x873990849DDa5117d7C644f0aF24370797C03885 |
6 |
| cCADC | 0x54dBd40cF05e15906A2C21f600937e96787f5679 |
6 |
| cXAUC | 0x290E52a8819A4fbD0714E517225429aA2B70EC6b |
6 |
| cXAUT | 0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E |
6 |
6. Related Files
| File | Role |
|---|---|
explorer-monorepo/frontend/public/explorer-spa.js |
Calls BLOCKSCOUT_API + '/v2/tokens?page=1&page_size=100' for the Tokens view |
explorer-monorepo/backend/api/rest/config.go |
Serves embedded DUAL_CHAIN_TOKEN_LIST.tokenlist.json at /api/config/token-list |
explorer-monorepo/backend/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json |
Multi-chain token list (138, 1, 651940, 25) for MetaMask |
token-lists/lists/dbis-138.tokenlist.json |
Chain 138 curated token list (Uniswap-style) |
smom-dbis-138/services/token-aggregation/src/config/canonical-tokens.ts |
Canonical addresses and env overrides for indexing/reporting |
docs/11-references/ADDRESS_MATRIX_AND_STATUS.md |
Correlated address matrix; §1.1 includes all 16 tokens; TransactionMirror and summary updated |
7. Pool / allowlist cross-check (Chain 138)
| Source | cUSDT/cUSDC pool | cUSDT/USDT pool | cUSDC/USDC pool |
|---|---|---|---|
| ai-mcp-pmm-controller/config/allowlist-138.json | 0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8 |
0xa3Ee6091696B28e5497b6F491fA1e99047250c59 |
0x90bd9Bf18Daa26Af3e814ea224032d015db58Ea5 |
| LIQUIDITY_POOLS_MASTER_MAP.md | Same | Same | Same |
| DEPLOYER_CONTRACTS_INVENTORY / ADDRESS_MATRIX | Same | Same | Same |
Result: Pool addresses are consistent across allowlist, docs, and deployer inventory. cross-chain-pmm-lps/config/deployment-status.json does not list Chain 138 pools (it tracks cW* edge pools on other chains); Chain 138 PMM state is in allowlist and docs.
8. On-chain verification: DODOPMMIntegration token addresses (2026-03-04)
Purpose: Confirm the deployed PMM integration uses the same cUSDT/cUSDC as Explorer canonical and mint/add-liquidity scripts.
| Check | Result |
|---|---|
| Contract | DODOPMMIntegration at 0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D (Chain 138) |
| Method | eth_call to compliantUSDT() and compliantUSDC() (RPC: http://192.168.11.211:8545) |
| compliantUSDT() | 0x93e66202a11b1772e55407b32b44e5cd8eda7f22 — matches §5 canonical cUSDT |
| compliantUSDC() | 0xf22258f57794cc8e06237084b353ab30fffa640b — matches §5 canonical cUSDC |
Result: Explorer canonical tokens, mint-for-liquidity.sh (and .env), and the deployed DODOPMMIntegration are aligned. Mint and add-liquidity use the correct contracts. Use §5 canonical addresses only; avoid non-canonical Blockscout addresses (§2).
9. Full diff script (Blockscout vs token list)
To regenerate missing_in_blockscout, missing_in_tokenlist, and metadata_mismatches (and source-of-truth recommendations), run:
# From repo root (or token-lists/)
node token-lists/scripts/diff-blockscout-vs-tokenlist.js
Optional:
--url URL— Blockscout tokens API base URL (default:https://explorer.d-bis.org/api/v2/tokens). The script paginates untilnext_page_paramsis null.--file path/to/blockscout-tokens.json— Use a saved snapshot instead of live fetch (e.g. when the Explorer is unreachable from the current host).
Curated list used for comparison: token-lists/lists/dbis-138.tokenlist.json (Chain 138 only). ETH-USD (oracle) is expected to appear in missing_in_blockscout with note Oracle; not ERC-20 supply token.
Output is JSON with: missing_in_blockscout, missing_in_tokenlist, metadata_mismatches, and source_of_truth (recommended source per field: address, symbol, name, decimals, logo).