Stabilize token and pool metadata
This commit is contained in:
8424
config/all-mainnet-pool-creation-matrix.json
Normal file
8424
config/all-mainnet-pool-creation-matrix.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "ALL Mainnet Non-DODO Protocol Surface",
|
||||
"version": "0.1.0",
|
||||
"updated": "2026-04-21",
|
||||
"updated": "2026-04-28",
|
||||
"chainId": 651940,
|
||||
"network": "ALL Mainnet (Alltra)",
|
||||
"status": "bridge_live_swap_inventory_pending",
|
||||
@@ -14,26 +14,340 @@
|
||||
"Promote protocols here into canonical route inventory only after real factory/router/pool addresses are committed and verified."
|
||||
]
|
||||
},
|
||||
"classificationFramework": {
|
||||
"category": [
|
||||
"tokenized-fiat",
|
||||
"stablecoin",
|
||||
"wrapped-native",
|
||||
"dex-token",
|
||||
"defi-token",
|
||||
"governance-token",
|
||||
"utility-token",
|
||||
"rwa-token",
|
||||
"commodity-token",
|
||||
"other"
|
||||
],
|
||||
"instrumentType": [
|
||||
"emoney",
|
||||
"deposit-token",
|
||||
"fiat-backed-stablecoin",
|
||||
"wrapped-native",
|
||||
"protocol-token",
|
||||
"governance-token",
|
||||
"utility-token",
|
||||
"other"
|
||||
],
|
||||
"backingAssets": [
|
||||
"cash",
|
||||
"cash-equivalents",
|
||||
"bank-deposits",
|
||||
"treasuries",
|
||||
"commodity-reserves",
|
||||
"protocol-utility",
|
||||
"native-gas-asset",
|
||||
"unknown"
|
||||
],
|
||||
"metadataDomains": [
|
||||
"backingMetadata",
|
||||
"bridgeMetadata",
|
||||
"cashMetadata",
|
||||
"commodityMetadata",
|
||||
"reserveMetadata",
|
||||
"securityMetadata",
|
||||
"settlementMetadata"
|
||||
],
|
||||
"notes": [
|
||||
"Use category for the broad asset bucket.",
|
||||
"Use instrumentType, issuerType, claimType, backingAssets, capabilities, and tags for legal, reserve, and integration semantics.",
|
||||
"Use cash only as a backing, redemption, or settlement asset descriptor; do not use cash as the token category unless the instrument is literally cash-equivalent legal tender.",
|
||||
"Use commodityMetadata only when the token directly references or is backed by a commodity reserve.",
|
||||
"Use securityMetadata for pause/admin/monitoring controls; unknown means not yet committed in this inventory, not absent on-chain.",
|
||||
"GRU tags use lowercase namespace:value strings and include the version, for example gru:v2."
|
||||
]
|
||||
},
|
||||
"documentedTokens": [
|
||||
{
|
||||
"symbol": "AUSDT",
|
||||
"address": "0x015B1897Ed5279930bC2Be46F661894d219292A6",
|
||||
"decimals": 18,
|
||||
"category": "stablecoin",
|
||||
"category": "tokenized-fiat",
|
||||
"instrumentType": "fiat-backed-stablecoin",
|
||||
"issuerType": "token-issuer-unverified",
|
||||
"currencyCode": "USD",
|
||||
"claimType": "claim-on-issuer-unverified",
|
||||
"settlementAssetClass": "fiat",
|
||||
"backingAssets": [
|
||||
"cash",
|
||||
"cash-equivalents"
|
||||
],
|
||||
"gruVersion": "v2",
|
||||
"gruFamilySymbol": "cAUSDT",
|
||||
"gruTransportRole": "all-mainnet-primary-surface",
|
||||
"tags": [
|
||||
"tokenized-fiat",
|
||||
"fiat:usd",
|
||||
"backing:cash",
|
||||
"backing:cash-equivalents",
|
||||
"gru:v2",
|
||||
"gru:m1",
|
||||
"gru:transport",
|
||||
"gru:all-mainnet",
|
||||
"gru:causdt-family"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "fiat-reserve-backed",
|
||||
"backingAssetClasses": [
|
||||
"cash",
|
||||
"cash-equivalents"
|
||||
],
|
||||
"backingVerificationStatus": "reserve-disclosure-not-committed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "live-canonical-target",
|
||||
"bridgeKind": "AlltraAdapter",
|
||||
"sourceChainId": 138,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": "cUSDT",
|
||||
"sourceAddress": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22",
|
||||
"destinationSymbol": "AUSDT",
|
||||
"destinationAddress": "0x015B1897Ed5279930bC2Be46F661894d219292A6",
|
||||
"adapterAddress": "0x66FEBA2fC9a0B47F26DD4284DAd24F970436B8Dc",
|
||||
"bridgeCanonicalAssetVersion": "gru-v2",
|
||||
"bridgeMirroredAssetVersion": "all-mainnet-surface"
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "reserve-and-redemption-asset-class",
|
||||
"currency": "USD",
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "issuer-or-bridge-reserve-unverified",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "pending-disclosure",
|
||||
"riskTier": "policy-review-required",
|
||||
"registryStatus": "documented-surface-not-stablecoin-registry-entry"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "corridor-halt-required-for-issuer-bridge-or-peg-risk",
|
||||
"monitoring": [
|
||||
"peg-deviation",
|
||||
"bridge-health",
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "fiat",
|
||||
"settlementCurrency": "USD",
|
||||
"settlementFinalityDomain": "off-chain-regulated-ledger-or-issuer-domain",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": true,
|
||||
"redemptionPath": "issuer-or-bridge-redemption-unverified",
|
||||
"parRedemption": "unverified"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
"symbol": "USDT",
|
||||
"address": "0x66D8Efa0AF63B0e84eb1Dd72bf00f00cd1e2234e",
|
||||
"decimals": 18,
|
||||
"category": "stablecoin",
|
||||
"category": "tokenized-fiat",
|
||||
"instrumentType": "fiat-backed-stablecoin",
|
||||
"issuerType": "token-issuer-unverified",
|
||||
"currencyCode": "USD",
|
||||
"claimType": "claim-on-issuer-unverified",
|
||||
"settlementAssetClass": "fiat",
|
||||
"backingAssets": [
|
||||
"cash",
|
||||
"cash-equivalents"
|
||||
],
|
||||
"gruVersion": "v2",
|
||||
"gruFamilySymbol": "cUSDT",
|
||||
"gruTransportRole": "all-mainnet-usdt-surface",
|
||||
"tags": [
|
||||
"tokenized-fiat",
|
||||
"fiat:usd",
|
||||
"backing:cash",
|
||||
"backing:cash-equivalents",
|
||||
"gru:v2",
|
||||
"gru:m1",
|
||||
"gru:transport",
|
||||
"gru:all-mainnet",
|
||||
"gru:cusdt-family"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "fiat-reserve-backed",
|
||||
"backingAssetClasses": [
|
||||
"cash",
|
||||
"cash-equivalents"
|
||||
],
|
||||
"backingVerificationStatus": "reserve-disclosure-not-committed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "documented-token-not-canonical-138-to-651940-target",
|
||||
"bridgeKind": "unknown-or-noncanonical",
|
||||
"sourceChainId": null,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": null,
|
||||
"sourceAddress": null,
|
||||
"destinationSymbol": "USDT",
|
||||
"destinationAddress": "0x66D8Efa0AF63B0e84eb1Dd72bf00f00cd1e2234e",
|
||||
"adapterAddress": null,
|
||||
"bridgeCanonicalAssetVersion": null,
|
||||
"bridgeMirroredAssetVersion": "all-mainnet-surface"
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "reserve-and-redemption-asset-class",
|
||||
"currency": "USD",
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "issuer-reserve-unverified",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "pending-disclosure",
|
||||
"riskTier": "policy-review-required",
|
||||
"registryStatus": "documented-surface-not-stablecoin-registry-entry"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "corridor-halt-required-for-issuer-or-peg-risk",
|
||||
"monitoring": [
|
||||
"peg-deviation",
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "fiat",
|
||||
"settlementCurrency": "USD",
|
||||
"settlementFinalityDomain": "off-chain-issuer-domain",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": true,
|
||||
"redemptionPath": "issuer-redemption-unverified",
|
||||
"parRedemption": "unverified"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
"symbol": "USDC",
|
||||
"address": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881",
|
||||
"decimals": 18,
|
||||
"category": "stablecoin",
|
||||
"category": "tokenized-fiat",
|
||||
"instrumentType": "fiat-backed-stablecoin",
|
||||
"issuerType": "token-issuer-unverified",
|
||||
"currencyCode": "USD",
|
||||
"claimType": "claim-on-issuer-unverified",
|
||||
"settlementAssetClass": "fiat",
|
||||
"backingAssets": [
|
||||
"cash",
|
||||
"cash-equivalents"
|
||||
],
|
||||
"gruVersion": "v2",
|
||||
"gruFamilySymbol": "cUSDC",
|
||||
"gruTransportRole": "all-mainnet-usdc-surface",
|
||||
"tags": [
|
||||
"tokenized-fiat",
|
||||
"fiat:usd",
|
||||
"backing:cash",
|
||||
"backing:cash-equivalents",
|
||||
"gru:v2",
|
||||
"gru:m1",
|
||||
"gru:transport",
|
||||
"gru:all-mainnet",
|
||||
"gru:cusdc-family"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "fiat-reserve-backed",
|
||||
"backingAssetClasses": [
|
||||
"cash",
|
||||
"cash-equivalents"
|
||||
],
|
||||
"backingVerificationStatus": "reserve-disclosure-not-committed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "live-canonical-target",
|
||||
"bridgeKind": "AlltraAdapter",
|
||||
"sourceChainId": 138,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": "cUSDC",
|
||||
"sourceAddress": "0xf22258f57794CC8E06237084b353Ab30fFfa640b",
|
||||
"destinationSymbol": "USDC",
|
||||
"destinationAddress": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881",
|
||||
"adapterAddress": "0x66FEBA2fC9a0B47F26DD4284DAd24F970436B8Dc",
|
||||
"bridgeCanonicalAssetVersion": "gru-v2",
|
||||
"bridgeMirroredAssetVersion": "all-mainnet-surface"
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "reserve-and-redemption-asset-class",
|
||||
"currency": "USD",
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "issuer-or-bridge-reserve-unverified",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "pending-disclosure",
|
||||
"riskTier": "policy-review-required",
|
||||
"registryStatus": "documented-surface-not-stablecoin-registry-entry"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "corridor-halt-required-for-issuer-bridge-or-peg-risk",
|
||||
"monitoring": [
|
||||
"peg-deviation",
|
||||
"bridge-health",
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "fiat",
|
||||
"settlementCurrency": "USD",
|
||||
"settlementFinalityDomain": "off-chain-regulated-ledger-or-issuer-domain",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": true,
|
||||
"redemptionPath": "issuer-or-bridge-redemption-unverified",
|
||||
"parRedemption": "unverified"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
@@ -41,6 +355,80 @@
|
||||
"address": "0x798F6762BB40d6801A593459d08F890603D3979C",
|
||||
"decimals": 18,
|
||||
"category": "wrapped-native",
|
||||
"instrumentType": "wrapped-native",
|
||||
"issuerType": "wrapper-contract",
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"backingAssets": [
|
||||
"native-gas-asset"
|
||||
],
|
||||
"gruVersion": null,
|
||||
"tags": [
|
||||
"wrapped-native",
|
||||
"gas:eth",
|
||||
"all-mainnet"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "wrapped-native-escrow",
|
||||
"backingAssetClasses": [
|
||||
"native-gas-asset"
|
||||
],
|
||||
"backingVerificationStatus": "wrapper-contract-address-verified",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "mapped-138-to-651940",
|
||||
"bridgeKind": "AlltraAdapter",
|
||||
"sourceChainId": 138,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": "WETH9",
|
||||
"sourceAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
||||
"destinationSymbol": "WETH",
|
||||
"destinationAddress": "0x798F6762BB40d6801A593459d08F890603D3979C",
|
||||
"adapterAddress": "0x66FEBA2fC9a0B47F26DD4284DAd24F970436B8Dc"
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "none",
|
||||
"currency": null,
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "native-asset-wrapper-escrow",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": "wrapper-contract-balance",
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "contract-balance-verifiable-on-chain",
|
||||
"riskTier": "bridge-and-wrapper-risk",
|
||||
"registryStatus": "documented-token-surface"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "corridor-halt-required-for-bridge-or-wrapper-risk",
|
||||
"monitoring": [
|
||||
"bridge-health",
|
||||
"wrapper-contract-balance",
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"settlementCurrency": "ETH",
|
||||
"settlementFinalityDomain": "chain-finality",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": false,
|
||||
"redemptionPath": "unwrap-or-bridge-withdrawal",
|
||||
"parRedemption": "one-to-one-native-asset-when-wrapper-solvent"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
@@ -48,6 +436,79 @@
|
||||
"address": "0x2da2b8f961F161ab6320acB3377e2e844a3C3ce4",
|
||||
"decimals": 18,
|
||||
"category": "wrapped-native",
|
||||
"instrumentType": "wrapped-native",
|
||||
"issuerType": "wrapper-contract",
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"backingAssets": [
|
||||
"native-gas-asset"
|
||||
],
|
||||
"gruVersion": null,
|
||||
"tags": [
|
||||
"wrapped-native",
|
||||
"gas:all",
|
||||
"all-mainnet"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "wrapped-native-escrow",
|
||||
"backingAssetClasses": [
|
||||
"native-gas-asset"
|
||||
],
|
||||
"backingVerificationStatus": "wrapper-contract-address-verified",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "documented-all-mainnet-native-wrapper",
|
||||
"bridgeKind": "native-wrapper",
|
||||
"sourceChainId": 651940,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": "ALL",
|
||||
"sourceAddress": null,
|
||||
"destinationSymbol": "WALL",
|
||||
"destinationAddress": "0x2da2b8f961F161ab6320acB3377e2e844a3C3ce4",
|
||||
"adapterAddress": null
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "none",
|
||||
"currency": null,
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "native-asset-wrapper-escrow",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": "wrapper-contract-balance",
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "contract-balance-verifiable-on-chain",
|
||||
"riskTier": "wrapper-risk",
|
||||
"registryStatus": "documented-token-surface"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "corridor-halt-required-for-wrapper-risk",
|
||||
"monitoring": [
|
||||
"wrapper-contract-balance",
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"settlementCurrency": "ALL",
|
||||
"settlementFinalityDomain": "chain-finality",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": false,
|
||||
"redemptionPath": "unwrap-to-native-all",
|
||||
"parRedemption": "one-to-one-native-asset-when-wrapper-solvent"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
@@ -55,6 +516,79 @@
|
||||
"address": "0x0d9793861AEB9244AD1B34375a83A6730F6AdD38",
|
||||
"decimals": 18,
|
||||
"category": "dex-token",
|
||||
"instrumentType": "protocol-token",
|
||||
"issuerType": "protocol",
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"backingAssets": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"gruVersion": null,
|
||||
"tags": [
|
||||
"dex-token",
|
||||
"protocol:hydx",
|
||||
"all-mainnet"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "protocol-utility",
|
||||
"backingAssetClasses": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"backingVerificationStatus": "not-reserve-backed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "not-bridge-canonical-in-this-inventory",
|
||||
"bridgeKind": null,
|
||||
"sourceChainId": null,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": null,
|
||||
"sourceAddress": null,
|
||||
"destinationSymbol": "HYDX",
|
||||
"destinationAddress": "0x0d9793861AEB9244AD1B34375a83A6730F6AdD38",
|
||||
"adapterAddress": null
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "none",
|
||||
"currency": null,
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "none-protocol-token",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "not-applicable",
|
||||
"riskTier": "protocol-token-risk",
|
||||
"registryStatus": "documented-token-surface"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "routing-halt-required-for-protocol-or-contract-risk",
|
||||
"monitoring": [
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes",
|
||||
"protocol-surface-confirmation"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"settlementCurrency": "HYDX",
|
||||
"settlementFinalityDomain": "chain-finality",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": false,
|
||||
"redemptionPath": "not-applicable",
|
||||
"parRedemption": "not-applicable"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
@@ -62,6 +596,78 @@
|
||||
"address": "0x1839f77eBed7F388c7035f7061B4B8Ef0E72317a",
|
||||
"decimals": 8,
|
||||
"category": "defi-token",
|
||||
"instrumentType": "protocol-token",
|
||||
"issuerType": "protocol",
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"backingAssets": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"gruVersion": null,
|
||||
"tags": [
|
||||
"defi-token",
|
||||
"protocol:hybx",
|
||||
"all-mainnet"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "protocol-utility",
|
||||
"backingAssetClasses": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"backingVerificationStatus": "not-reserve-backed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "not-bridge-canonical-in-this-inventory",
|
||||
"bridgeKind": null,
|
||||
"sourceChainId": null,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": null,
|
||||
"sourceAddress": null,
|
||||
"destinationSymbol": "HYBX",
|
||||
"destinationAddress": "0x1839f77eBed7F388c7035f7061B4B8Ef0E72317a",
|
||||
"adapterAddress": null
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "none",
|
||||
"currency": null,
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "none-protocol-token",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "not-applicable",
|
||||
"riskTier": "protocol-token-risk",
|
||||
"registryStatus": "documented-token-surface"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "routing-halt-required-for-protocol-or-contract-risk",
|
||||
"monitoring": [
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"settlementCurrency": "HYBX",
|
||||
"settlementFinalityDomain": "chain-finality",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": false,
|
||||
"redemptionPath": "not-applicable",
|
||||
"parRedemption": "not-applicable"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
@@ -69,6 +675,79 @@
|
||||
"address": "0xE59Bb804F4884FcEA183a4A67B1bb04f4a4567bc",
|
||||
"decimals": 8,
|
||||
"category": "defi-token",
|
||||
"instrumentType": "utility-token",
|
||||
"issuerType": "protocol",
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"backingAssets": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"gruVersion": null,
|
||||
"tags": [
|
||||
"defi-token",
|
||||
"utility-token",
|
||||
"protocol:cht",
|
||||
"all-mainnet"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "protocol-utility",
|
||||
"backingAssetClasses": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"backingVerificationStatus": "not-reserve-backed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "not-bridge-canonical-in-this-inventory",
|
||||
"bridgeKind": null,
|
||||
"sourceChainId": null,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": null,
|
||||
"sourceAddress": null,
|
||||
"destinationSymbol": "CHT",
|
||||
"destinationAddress": "0xE59Bb804F4884FcEA183a4A67B1bb04f4a4567bc",
|
||||
"adapterAddress": null
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "none",
|
||||
"currency": null,
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "none-utility-token",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "not-applicable",
|
||||
"riskTier": "utility-token-risk",
|
||||
"registryStatus": "documented-token-surface"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "routing-halt-required-for-protocol-or-contract-risk",
|
||||
"monitoring": [
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"settlementCurrency": "CHT",
|
||||
"settlementFinalityDomain": "chain-finality",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": false,
|
||||
"redemptionPath": "not-applicable",
|
||||
"parRedemption": "not-applicable"
|
||||
},
|
||||
"status": "verified"
|
||||
},
|
||||
{
|
||||
@@ -76,6 +755,78 @@
|
||||
"address": "0x690740f055A41FA7669f5a379Bf71B0cDF353073",
|
||||
"decimals": 18,
|
||||
"category": "defi-token",
|
||||
"instrumentType": "protocol-token",
|
||||
"issuerType": "protocol",
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"backingAssets": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"gruVersion": null,
|
||||
"tags": [
|
||||
"defi-token",
|
||||
"protocol:auda",
|
||||
"all-mainnet"
|
||||
],
|
||||
"backingMetadata": {
|
||||
"backingModel": "protocol-utility",
|
||||
"backingAssetClasses": [
|
||||
"protocol-utility"
|
||||
],
|
||||
"backingVerificationStatus": "not-reserve-backed",
|
||||
"overcollateralizationRequired": false
|
||||
},
|
||||
"bridgeMetadata": {
|
||||
"bridgeStatus": "not-bridge-canonical-in-this-inventory",
|
||||
"bridgeKind": null,
|
||||
"sourceChainId": null,
|
||||
"destinationChainId": 651940,
|
||||
"sourceSymbol": null,
|
||||
"sourceAddress": null,
|
||||
"destinationSymbol": "AUDA",
|
||||
"destinationAddress": "0x690740f055A41FA7669f5a379Bf71B0cDF353073",
|
||||
"adapterAddress": null
|
||||
},
|
||||
"cashMetadata": {
|
||||
"cashRole": "none",
|
||||
"currency": null,
|
||||
"cashBackingAssertedByRepo": false,
|
||||
"cashBackingEvidenceRef": null
|
||||
},
|
||||
"commodityMetadata": {
|
||||
"commodityBacked": false,
|
||||
"commodityType": null,
|
||||
"commodityUnit": null,
|
||||
"reserveLocationRef": null
|
||||
},
|
||||
"reserveMetadata": {
|
||||
"reserveModel": "none-protocol-token",
|
||||
"reserveDisclosureRef": null,
|
||||
"reserveAccountRef": null,
|
||||
"proofOfReserveRef": null,
|
||||
"reserveVerificationStatus": "not-applicable",
|
||||
"riskTier": "protocol-token-risk",
|
||||
"registryStatus": "documented-token-surface"
|
||||
},
|
||||
"securityMetadata": {
|
||||
"pauseAuthority": "unknown",
|
||||
"adminAuthority": "unknown",
|
||||
"upgradeability": "unknown",
|
||||
"keyManagement": "unknown",
|
||||
"emergencyHalt": "routing-halt-required-for-protocol-or-contract-risk",
|
||||
"monitoring": [
|
||||
"liquidity-depth",
|
||||
"contract-admin-changes"
|
||||
]
|
||||
},
|
||||
"settlementMetadata": {
|
||||
"settlementAssetClass": "crypto-native",
|
||||
"settlementCurrency": "AUDA",
|
||||
"settlementFinalityDomain": "chain-finality",
|
||||
"onChainFinality": "token-transfer-final-on-chain-651940-after-confirmation",
|
||||
"accountingEvidenceRequired": false,
|
||||
"redemptionPath": "not-applicable",
|
||||
"parRedemption": "not-applicable"
|
||||
},
|
||||
"status": "verified"
|
||||
}
|
||||
],
|
||||
|
||||
Submodule metamask-integration updated: b15b13c57e...8896234a8d
@@ -43,7 +43,9 @@
|
||||
"mission-control:dev": "pnpm --filter mission-control dev",
|
||||
"mission-control:build": "pnpm --filter mission-control build",
|
||||
"mission-control:start": "pnpm --filter mission-control start",
|
||||
"mission-control:test": "pnpm --filter mission-control test"
|
||||
"mission-control:test": "pnpm --filter mission-control test",
|
||||
"token-lists:validate-metadata": "node scripts/validation/validate-token-list-metadata.mjs",
|
||||
"pool-matrix:validate": "node scripts/validation/validate-pool-creation-matrix.mjs"
|
||||
},
|
||||
"keywords": [
|
||||
"proxmox",
|
||||
|
||||
@@ -146,6 +146,22 @@ else
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [[ -f "$PROJECT_ROOT/scripts/validation/validate-token-list-metadata.mjs" ]]; then
|
||||
if node "$PROJECT_ROOT/scripts/validation/validate-token-list-metadata.mjs"; then
|
||||
log_ok "Token-list metadata conventions valid"
|
||||
else
|
||||
log_err "Token-list metadata conventions invalid"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
fi
|
||||
if [[ -f "$PROJECT_ROOT/config/all-mainnet-pool-creation-matrix.json" ]] && [[ -f "$PROJECT_ROOT/scripts/validation/validate-pool-creation-matrix.mjs" ]]; then
|
||||
if node "$PROJECT_ROOT/scripts/validation/validate-pool-creation-matrix.mjs"; then
|
||||
log_ok "ALL Mainnet pool-creation matrix valid"
|
||||
else
|
||||
log_err "ALL Mainnet pool-creation matrix invalid"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
fi
|
||||
# DUAL_CHAIN config (explorer deploy source)
|
||||
if [[ -f "$PROJECT_ROOT/explorer-monorepo/backend/api/rest/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json" ]] && command -v jq &>/dev/null; then
|
||||
if jq -e '(.tokens | type == "array") and (.tokens | length > 0)' "$PROJECT_ROOT/explorer-monorepo/backend/api/rest/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json" &>/dev/null; then
|
||||
|
||||
345
scripts/validation/validate-pool-creation-matrix.mjs
Executable file
345
scripts/validation/validate-pool-creation-matrix.mjs
Executable file
@@ -0,0 +1,345 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Validate the ALL Mainnet pool-creation matrix.
|
||||
*
|
||||
* This file is an operational dependency: pool rows are used to decide what can
|
||||
* be created, funded, or promoted. The checks here keep the matrix internally
|
||||
* consistent and cross-check token addresses against the repo token lists.
|
||||
*/
|
||||
|
||||
import { existsSync, readFileSync } from "node:fs";
|
||||
import { basename, resolve } from "node:path";
|
||||
|
||||
const repoRoot = resolve(new URL("../..", import.meta.url).pathname);
|
||||
const defaultMatrix = "config/all-mainnet-pool-creation-matrix.json";
|
||||
const defaultTokenLists = [
|
||||
"token-lists/lists/all-mainnet.tokenlist.json",
|
||||
"token-lists/lists/dbis-138.tokenlist.json",
|
||||
"token-lists/lists/ethereum-mainnet.tokenlist.json",
|
||||
"token-lists/lists/arbitrum.tokenlist.json",
|
||||
"token-lists/lists/avalanche.tokenlist.json",
|
||||
"token-lists/lists/cronos.tokenlist.json",
|
||||
"metamask-integration/config/token-list.json",
|
||||
"smom-dbis-138/metamask/token-list.json",
|
||||
];
|
||||
|
||||
const requiredVaultRoles = [
|
||||
"treasury_reserve",
|
||||
"bridge_liquidity",
|
||||
"single_sided_inventory",
|
||||
"protocol_adapter",
|
||||
"emergency_withdraw",
|
||||
];
|
||||
|
||||
const statusesRequiringPoolAddress = new Set(["created", "funded", "live_read", "canary_passed", "production"]);
|
||||
const addressPattern = /^0x[a-fA-F0-9]{40}$/;
|
||||
|
||||
function parseArgs() {
|
||||
const args = process.argv.slice(2);
|
||||
if (args.includes("--help") || args.includes("-h")) {
|
||||
console.log(`Usage: node scripts/validation/validate-pool-creation-matrix.mjs [matrix-path]\n\nDefaults to ${defaultMatrix}.`);
|
||||
process.exit(0);
|
||||
}
|
||||
return args[0] || defaultMatrix;
|
||||
}
|
||||
|
||||
function readJson(file, errors) {
|
||||
const abs = resolve(repoRoot, file);
|
||||
if (!existsSync(abs)) {
|
||||
errors.push(`${file}: missing`);
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return JSON.parse(readFileSync(abs, "utf8"));
|
||||
} catch (error) {
|
||||
errors.push(`${file}: invalid JSON: ${error.message}`);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function tokenKey(chainId, symbol) {
|
||||
return `${chainId}:${String(symbol).toUpperCase()}`;
|
||||
}
|
||||
|
||||
function buildTokenIndex(warnings) {
|
||||
const index = new Map();
|
||||
|
||||
for (const file of defaultTokenLists) {
|
||||
const abs = resolve(repoRoot, file);
|
||||
if (!existsSync(abs)) {
|
||||
warnings.push(`${file}: token list missing; address cross-check skipped for that file`);
|
||||
continue;
|
||||
}
|
||||
|
||||
let list;
|
||||
try {
|
||||
list = JSON.parse(readFileSync(abs, "utf8"));
|
||||
} catch (error) {
|
||||
warnings.push(`${file}: invalid JSON; address cross-check skipped for that file: ${error.message}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!Array.isArray(list.tokens)) {
|
||||
warnings.push(`${file}: missing tokens[]; address cross-check skipped for that file`);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const token of list.tokens) {
|
||||
if (!token?.chainId || !token?.symbol || !addressPattern.test(String(token.address || ""))) {
|
||||
continue;
|
||||
}
|
||||
const key = tokenKey(token.chainId, token.symbol);
|
||||
if (!index.has(key)) {
|
||||
index.set(key, new Map());
|
||||
}
|
||||
index.get(key).set(String(token.address).toLowerCase(), `${file}:${token.symbol}`);
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
function ref(row, index) {
|
||||
return `rows[${index}] ${row.poolId || "<missing-poolId>"}`;
|
||||
}
|
||||
|
||||
function slug(value) {
|
||||
return String(value || "").toLowerCase();
|
||||
}
|
||||
|
||||
function sortedStrings(values) {
|
||||
return [...values].sort((a, b) => a.localeCompare(b));
|
||||
}
|
||||
|
||||
function countBy(rows, key) {
|
||||
const counts = {};
|
||||
for (const row of rows) {
|
||||
const value = row[key];
|
||||
counts[value] = (counts[value] || 0) + 1;
|
||||
}
|
||||
return counts;
|
||||
}
|
||||
|
||||
function sameCounts(actual, expected) {
|
||||
const keys = new Set([...Object.keys(actual || {}), ...Object.keys(expected || {})]);
|
||||
for (const key of keys) {
|
||||
if ((actual?.[key] || 0) !== (expected?.[key] || 0)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function validateAddress(value, path, errors, { allowNull = true } = {}) {
|
||||
if (value === null && allowNull) {
|
||||
return;
|
||||
}
|
||||
if (typeof value !== "string" || !addressPattern.test(value)) {
|
||||
errors.push(`${path}: expected ${allowNull ? "null or " : ""}0x-prefixed 20-byte address`);
|
||||
}
|
||||
}
|
||||
|
||||
function validateTokenAddress(row, index, side, tokenIndex, errors, warnings) {
|
||||
const token = row[side];
|
||||
const rowRef = ref(row, index);
|
||||
if (!token || typeof token !== "object") {
|
||||
errors.push(`${rowRef}: ${side} must be an object`);
|
||||
return;
|
||||
}
|
||||
if (typeof token.symbol !== "string" || token.symbol.length === 0) {
|
||||
errors.push(`${rowRef}: ${side}.symbol is required`);
|
||||
}
|
||||
validateAddress(token.address, `${rowRef}: ${side}.address`, errors);
|
||||
|
||||
const known = tokenIndex.get(tokenKey(row.chainId, token.symbol));
|
||||
if (!known || known.size !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
const [knownAddress, source] = [...known.entries()][0];
|
||||
if (token.address === null) {
|
||||
if (row.status !== "planned" || row.publicRoutingEnabled === true) {
|
||||
errors.push(`${rowRef}: ${side} ${token.symbol} address is missing but ${source} has ${knownAddress}`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (String(token.address).toLowerCase() !== knownAddress) {
|
||||
warnings.push(`${rowRef}: ${side} ${token.symbol} address ${token.address} differs from ${source} ${knownAddress}`);
|
||||
}
|
||||
}
|
||||
|
||||
function validateMatrix(file, matrix, tokenIndex) {
|
||||
const errors = [];
|
||||
const warnings = [];
|
||||
|
||||
if (!matrix || typeof matrix !== "object" || Array.isArray(matrix)) {
|
||||
errors.push(`${file}: root must be an object`);
|
||||
return { errors, warnings };
|
||||
}
|
||||
|
||||
if (typeof matrix.version !== "string" || matrix.version.length === 0) {
|
||||
errors.push(`${file}: version is required`);
|
||||
}
|
||||
if (typeof matrix.generatedAt !== "string" || Number.isNaN(Date.parse(matrix.generatedAt))) {
|
||||
errors.push(`${file}: generatedAt must be an ISO-like date string`);
|
||||
}
|
||||
if (!Array.isArray(matrix.rows) || matrix.rows.length === 0) {
|
||||
errors.push(`${file}: rows[] is required`);
|
||||
return { errors, warnings };
|
||||
}
|
||||
if (!Array.isArray(matrix.lifecycle) || matrix.lifecycle.length === 0) {
|
||||
errors.push(`${file}: lifecycle[] is required`);
|
||||
}
|
||||
if (!Array.isArray(matrix.protocolRolloutOrder) || matrix.protocolRolloutOrder.length === 0) {
|
||||
errors.push(`${file}: protocolRolloutOrder[] is required`);
|
||||
}
|
||||
|
||||
const protocolCounts = countBy(matrix.rows, "protocol");
|
||||
const statusCounts = countBy(matrix.rows, "status");
|
||||
if (!sameCounts(protocolCounts, matrix.protocolCounts)) {
|
||||
errors.push(`${file}: protocolCounts does not match rows (${JSON.stringify(protocolCounts)})`);
|
||||
}
|
||||
if (!sameCounts(statusCounts, matrix.statusCounts)) {
|
||||
errors.push(`${file}: statusCounts does not match rows (${JSON.stringify(statusCounts)})`);
|
||||
}
|
||||
|
||||
const lifecycle = new Set(matrix.lifecycle || []);
|
||||
const rollout = new Set(matrix.protocolRolloutOrder || []);
|
||||
const poolIds = new Set();
|
||||
|
||||
matrix.rows.forEach((row, index) => {
|
||||
const rowRef = ref(row, index);
|
||||
if (!row || typeof row !== "object" || Array.isArray(row)) {
|
||||
errors.push(`rows[${index}]: row must be an object`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof row.poolId !== "string" || row.poolId.length === 0) {
|
||||
errors.push(`${rowRef}: poolId is required`);
|
||||
} else if (poolIds.has(row.poolId)) {
|
||||
errors.push(`${rowRef}: duplicate poolId`);
|
||||
} else {
|
||||
poolIds.add(row.poolId);
|
||||
}
|
||||
|
||||
if (!Number.isInteger(row.chainId)) {
|
||||
errors.push(`${rowRef}: chainId must be an integer`);
|
||||
}
|
||||
if (!rollout.has(row.protocol)) {
|
||||
errors.push(`${rowRef}: protocol ${row.protocol} is not in protocolRolloutOrder`);
|
||||
}
|
||||
if (!lifecycle.has(row.status)) {
|
||||
errors.push(`${rowRef}: status ${row.status} is not in lifecycle`);
|
||||
}
|
||||
|
||||
const expectedPoolId = `${row.chainId}-${row.protocol}-${slug(row.baseToken?.symbol)}-${slug(row.quoteToken?.symbol)}`;
|
||||
if (row.poolId && row.poolId !== expectedPoolId) {
|
||||
errors.push(`${rowRef}: poolId should be ${expectedPoolId}`);
|
||||
}
|
||||
|
||||
validateTokenAddress(row, index, "baseToken", tokenIndex, errors, warnings);
|
||||
validateTokenAddress(row, index, "quoteToken", tokenIndex, errors, warnings);
|
||||
|
||||
validateAddress(row.factoryAddress, `${rowRef}: factoryAddress`, errors);
|
||||
validateAddress(row.routerAddress, `${rowRef}: routerAddress`, errors);
|
||||
validateAddress(row.poolAddress, `${rowRef}: poolAddress`, errors, {
|
||||
allowNull: !statusesRequiringPoolAddress.has(row.status),
|
||||
});
|
||||
validateAddress(row.vaultAddress, `${rowRef}: vaultAddress`, errors);
|
||||
|
||||
if (statusesRequiringPoolAddress.has(row.status) && row.poolAddress === null) {
|
||||
errors.push(`${rowRef}: status ${row.status} requires poolAddress`);
|
||||
}
|
||||
|
||||
const shouldBeSingleSided = row.protocol === "single_sided_pmm" || row.poolType === "single_sided";
|
||||
if (row.singleSided !== shouldBeSingleSided) {
|
||||
errors.push(`${rowRef}: singleSided should be ${shouldBeSingleSided}`);
|
||||
}
|
||||
|
||||
if (!Array.isArray(row.vaultAssignments)) {
|
||||
errors.push(`${rowRef}: vaultAssignments[] is required`);
|
||||
} else {
|
||||
const roles = row.vaultAssignments.map((assignment) => assignment?.role);
|
||||
const roleSet = new Set(roles);
|
||||
const expectedRoles = new Set(requiredVaultRoles);
|
||||
if (roleSet.size !== expectedRoles.size || requiredVaultRoles.some((role) => !roleSet.has(role))) {
|
||||
errors.push(`${rowRef}: vaultAssignments roles must be ${requiredVaultRoles.join(",")}`);
|
||||
}
|
||||
for (const assignment of row.vaultAssignments) {
|
||||
if (!assignment || typeof assignment !== "object") {
|
||||
errors.push(`${rowRef}: vaultAssignments entries must be objects`);
|
||||
continue;
|
||||
}
|
||||
validateAddress(assignment.vaultAddress, `${rowRef}: vaultAssignments.${assignment.role || "<missing-role>"}.vaultAddress`, errors);
|
||||
if (typeof assignment.requiredBeforeFunding !== "boolean") {
|
||||
errors.push(`${rowRef}: vaultAssignments.${assignment.role || "<missing-role>"}.requiredBeforeFunding must be boolean`);
|
||||
}
|
||||
}
|
||||
|
||||
const actualMissing = sortedStrings(
|
||||
row.vaultAssignments
|
||||
.filter((assignment) => assignment?.requiredBeforeFunding === true && assignment.vaultAddress === null)
|
||||
.map((assignment) => assignment.role),
|
||||
);
|
||||
const declaredMissing = sortedStrings(row.missingRequiredVaultRoles || []);
|
||||
if (actualMissing.join("|") !== declaredMissing.join("|")) {
|
||||
errors.push(`${rowRef}: missingRequiredVaultRoles should be [${actualMissing.join(", ")}]`);
|
||||
}
|
||||
const expectedStatus = actualMissing.length > 0 ? "missing_required_vaults" : "ready";
|
||||
if (row.vaultAssignmentStatus !== expectedStatus) {
|
||||
errors.push(`${rowRef}: vaultAssignmentStatus should be ${expectedStatus}`);
|
||||
}
|
||||
}
|
||||
|
||||
const tiers = row.fundingTiersUsd;
|
||||
if (!tiers || typeof tiers !== "object") {
|
||||
errors.push(`${rowRef}: fundingTiersUsd is required`);
|
||||
} else if (!(tiers.seed > 0 && tiers.smoke >= tiers.seed && tiers.productionMinimum >= tiers.smoke)) {
|
||||
errors.push(`${rowRef}: fundingTiersUsd must satisfy seed > 0, smoke >= seed, productionMinimum >= smoke`);
|
||||
}
|
||||
|
||||
const policy = row.policy;
|
||||
if (!policy || typeof policy !== "object") {
|
||||
errors.push(`${rowRef}: policy is required`);
|
||||
} else {
|
||||
for (const key of ["maxPriceImpactBps", "minReserveUsd", "refillTriggerBps"]) {
|
||||
if (typeof policy[key] !== "number" || policy[key] < 0) {
|
||||
errors.push(`${rowRef}: policy.${key} must be a non-negative number`);
|
||||
}
|
||||
}
|
||||
if (typeof policy.pauseOnReserveReadFailure !== "boolean") {
|
||||
errors.push(`${rowRef}: policy.pauseOnReserveReadFailure must be boolean`);
|
||||
}
|
||||
}
|
||||
|
||||
if (!Array.isArray(row.notes)) {
|
||||
errors.push(`${rowRef}: notes[] is required`);
|
||||
}
|
||||
});
|
||||
|
||||
return { errors, warnings };
|
||||
}
|
||||
|
||||
const matrixPath = parseArgs();
|
||||
const bootstrapErrors = [];
|
||||
const bootstrapWarnings = [];
|
||||
const matrix = readJson(matrixPath, bootstrapErrors);
|
||||
const tokenIndex = buildTokenIndex(bootstrapWarnings);
|
||||
const { errors, warnings } = matrix ? validateMatrix(matrixPath, matrix, tokenIndex) : { errors: [], warnings: [] };
|
||||
const allErrors = [...bootstrapErrors, ...errors];
|
||||
const allWarnings = [...bootstrapWarnings, ...warnings];
|
||||
|
||||
for (const warning of allWarnings) {
|
||||
console.warn(`[WARN] ${warning}`);
|
||||
}
|
||||
|
||||
if (allErrors.length > 0) {
|
||||
console.error(`[ERROR] Pool-creation matrix validation failed with ${allErrors.length} issue(s):`);
|
||||
for (const error of allErrors) {
|
||||
console.error(` - ${error}`);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`[OK] ${basename(matrixPath)} valid: ${matrix.rows.length} row(s), ${Object.keys(matrix.protocolCounts || {}).length} protocol(s).`);
|
||||
240
scripts/validation/validate-token-list-metadata.mjs
Executable file
240
scripts/validation/validate-token-list-metadata.mjs
Executable file
@@ -0,0 +1,240 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Validate DBIS token-list metadata conventions.
|
||||
*
|
||||
* This complements the Uniswap token-list schema validator. The schema checks
|
||||
* shape; this script checks the meaning of the compact tags/extensions we use
|
||||
* for fiat, cash-like, GRU, commodity, and wrapped-token presentation.
|
||||
*/
|
||||
|
||||
import { existsSync, readFileSync } from "node:fs";
|
||||
import { resolve } from "node:path";
|
||||
|
||||
const repoRoot = resolve(new URL("../..", import.meta.url).pathname);
|
||||
|
||||
const defaultTokenLists = [
|
||||
"token-lists/lists/all-mainnet.tokenlist.json",
|
||||
"token-lists/lists/arbitrum.tokenlist.json",
|
||||
"token-lists/lists/avalanche.tokenlist.json",
|
||||
"token-lists/lists/cronos.tokenlist.json",
|
||||
"token-lists/lists/dbis-138.tokenlist.json",
|
||||
"token-lists/lists/ethereum-mainnet.tokenlist.json",
|
||||
"metamask-integration/config/token-list.json",
|
||||
"metamask-integration/provider/config/DUAL_CHAIN_TOKEN_LIST.tokenlist.json",
|
||||
"metamask-integration/docs/METAMASK_TOKEN_LIST.json",
|
||||
"smom-dbis-138/metamask/token-list.json",
|
||||
];
|
||||
|
||||
const conventionTags = new Set(["fiat", "cash", "gru", "commodity"]);
|
||||
const protocolSymbols = new Set(["AUDA", "HYDX", "HYBX", "CHT"]);
|
||||
const cryptoCollateralStablecoins = new Set(["DAI"]);
|
||||
const fiatCurrencies = new Set(["USD", "EUR", "GBP", "AUD", "JPY", "CHF", "CAD"]);
|
||||
const allowedCategories = new Set([
|
||||
"tokenized-fiat",
|
||||
"stablecoin",
|
||||
"wrapped-native",
|
||||
"defi-token",
|
||||
"dex-token",
|
||||
"utility-token",
|
||||
"commodity-token",
|
||||
]);
|
||||
|
||||
function parseArgs() {
|
||||
const args = process.argv.slice(2);
|
||||
if (args.includes("--help") || args.includes("-h")) {
|
||||
console.log(`Usage: node scripts/validation/validate-token-list-metadata.mjs [token-list ...]\n\nIf no token-list paths are supplied, validates the repo's canonical token-list files that exist.`);
|
||||
process.exit(0);
|
||||
}
|
||||
return args.length > 0 ? args : defaultTokenLists;
|
||||
}
|
||||
|
||||
function isScalar(value) {
|
||||
return value === null || ["string", "number", "boolean"].includes(typeof value);
|
||||
}
|
||||
|
||||
function tokenRef(file, index, token) {
|
||||
return `${file} tokens[${index}] ${token.symbol || "<missing-symbol>"} ${token.chainId || "<missing-chain>"} ${token.address || "<missing-address>"}`;
|
||||
}
|
||||
|
||||
function hasTag(token, tag) {
|
||||
return Array.isArray(token.tags) && token.tags.includes(tag);
|
||||
}
|
||||
|
||||
function tagDefs(list) {
|
||||
return list.tags && typeof list.tags === "object" && !Array.isArray(list.tags)
|
||||
? list.tags
|
||||
: {};
|
||||
}
|
||||
|
||||
function validateList(file, list) {
|
||||
const errors = [];
|
||||
const warnings = [];
|
||||
const tags = tagDefs(list);
|
||||
|
||||
if (!Array.isArray(list.tokens)) {
|
||||
errors.push(`${file}: missing tokens[]`);
|
||||
return { errors, warnings };
|
||||
}
|
||||
|
||||
for (const conventionTag of conventionTags) {
|
||||
const used = list.tokens.some((token) => hasTag(token, conventionTag));
|
||||
if (used && !tags[conventionTag]) {
|
||||
errors.push(`${file}: tag "${conventionTag}" is used but missing from top-level tags`);
|
||||
}
|
||||
}
|
||||
|
||||
list.tokens.forEach((token, index) => {
|
||||
const ref = tokenRef(file, index, token);
|
||||
const tokenTags = Array.isArray(token.tags) ? token.tags : [];
|
||||
const extensions = token.extensions ?? {};
|
||||
|
||||
for (const tag of tokenTags) {
|
||||
if (typeof tag !== "string") {
|
||||
errors.push(`${ref}: tag values must be strings`);
|
||||
} else if (tag.length > 10) {
|
||||
errors.push(`${ref}: tag "${tag}" is longer than 10 characters`);
|
||||
}
|
||||
}
|
||||
|
||||
if (token.extensions !== undefined) {
|
||||
if (!extensions || typeof extensions !== "object" || Array.isArray(extensions)) {
|
||||
errors.push(`${ref}: extensions must be an object when present`);
|
||||
} else {
|
||||
const keys = Object.keys(extensions);
|
||||
if (keys.length > 10) {
|
||||
errors.push(`${ref}: extensions has ${keys.length} keys; max is 10`);
|
||||
}
|
||||
for (const [key, value] of Object.entries(extensions)) {
|
||||
if (!isScalar(value)) {
|
||||
errors.push(`${ref}: extensions.${key} must be scalar/null, not ${Array.isArray(value) ? "array" : typeof value}`);
|
||||
}
|
||||
if (typeof value === "string" && value.length > 42) {
|
||||
errors.push(`${ref}: extensions.${key} is longer than 42 characters`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (extensions.category && !allowedCategories.has(extensions.category)) {
|
||||
errors.push(`${ref}: extensions.category "${extensions.category}" is not in the allowed metadata category set`);
|
||||
}
|
||||
|
||||
if (hasTag(token, "cash")) {
|
||||
if (!hasTag(token, "fiat")) {
|
||||
errors.push(`${ref}: cash tag requires fiat tag`);
|
||||
}
|
||||
if (extensions.category !== "tokenized-fiat") {
|
||||
errors.push(`${ref}: cash tag requires extensions.category=tokenized-fiat`);
|
||||
}
|
||||
if (extensions.cashLike !== true) {
|
||||
errors.push(`${ref}: cash tag requires extensions.cashLike=true`);
|
||||
}
|
||||
if (extensions.settlement !== "fiat") {
|
||||
errors.push(`${ref}: cash tag requires extensions.settlement=fiat`);
|
||||
}
|
||||
if (typeof extensions.backing !== "string" || !extensions.backing.includes("cash")) {
|
||||
errors.push(`${ref}: cash tag requires extensions.backing to include cash`);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasTag(token, "fiat")) {
|
||||
if (extensions.category !== "tokenized-fiat") {
|
||||
errors.push(`${ref}: fiat tag requires extensions.category=tokenized-fiat`);
|
||||
}
|
||||
if (!fiatCurrencies.has(extensions.currency)) {
|
||||
errors.push(`${ref}: fiat tag requires extensions.currency to be one of ${[...fiatCurrencies].join(",")}`);
|
||||
}
|
||||
if (extensions.settlement !== "fiat") {
|
||||
errors.push(`${ref}: fiat tag requires extensions.settlement=fiat`);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasTag(token, "gru")) {
|
||||
if (typeof extensions.gruVersion !== "string" || !/^v\d+$/.test(extensions.gruVersion)) {
|
||||
errors.push(`${ref}: gru tag requires extensions.gruVersion like v1 or v2`);
|
||||
}
|
||||
if (typeof extensions.gruFamily !== "string" || extensions.gruFamily.length === 0) {
|
||||
errors.push(`${ref}: gru tag requires extensions.gruFamily`);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasTag(token, "commodity")) {
|
||||
if (hasTag(token, "cash") || hasTag(token, "fiat")) {
|
||||
errors.push(`${ref}: commodity token must not be tagged cash or fiat`);
|
||||
}
|
||||
if (extensions.category !== "commodity-token") {
|
||||
errors.push(`${ref}: commodity tag requires extensions.category=commodity-token`);
|
||||
}
|
||||
if (extensions.cashLike !== false) {
|
||||
errors.push(`${ref}: commodity tag requires extensions.cashLike=false`);
|
||||
}
|
||||
if (extensions.backing !== "commodity-reserves") {
|
||||
errors.push(`${ref}: commodity tag requires extensions.backing=commodity-reserves`);
|
||||
}
|
||||
}
|
||||
|
||||
if (protocolSymbols.has(token.symbol)) {
|
||||
if (hasTag(token, "cash") || hasTag(token, "fiat") || hasTag(token, "gru")) {
|
||||
errors.push(`${ref}: protocol token ${token.symbol} must not be tagged cash, fiat, or gru`);
|
||||
}
|
||||
if (extensions.category === "tokenized-fiat") {
|
||||
errors.push(`${ref}: protocol token ${token.symbol} must not use category tokenized-fiat`);
|
||||
}
|
||||
if (extensions.cashLike === true) {
|
||||
errors.push(`${ref}: protocol token ${token.symbol} must not be cashLike`);
|
||||
}
|
||||
}
|
||||
|
||||
if (cryptoCollateralStablecoins.has(token.symbol)) {
|
||||
if (hasTag(token, "cash") || hasTag(token, "fiat")) {
|
||||
errors.push(`${ref}: ${token.symbol} must not be tagged cash or fiat`);
|
||||
}
|
||||
if (extensions.instrument !== "crypto-collateralized-stablecoin") {
|
||||
errors.push(`${ref}: ${token.symbol} requires extensions.instrument=crypto-collateralized-stablecoin`);
|
||||
}
|
||||
if (extensions.cashLike !== false) {
|
||||
errors.push(`${ref}: ${token.symbol} requires extensions.cashLike=false`);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return { errors, warnings };
|
||||
}
|
||||
|
||||
const files = parseArgs();
|
||||
const allErrors = [];
|
||||
const allWarnings = [];
|
||||
let validated = 0;
|
||||
|
||||
for (const file of files) {
|
||||
const abs = resolve(repoRoot, file);
|
||||
if (!existsSync(abs)) {
|
||||
allWarnings.push(`${file}: missing; skipped`);
|
||||
continue;
|
||||
}
|
||||
let list;
|
||||
try {
|
||||
list = JSON.parse(readFileSync(abs, "utf8"));
|
||||
} catch (error) {
|
||||
allErrors.push(`${file}: invalid JSON: ${error.message}`);
|
||||
continue;
|
||||
}
|
||||
const { errors, warnings } = validateList(file, list);
|
||||
allErrors.push(...errors);
|
||||
allWarnings.push(...warnings);
|
||||
validated += 1;
|
||||
}
|
||||
|
||||
for (const warning of allWarnings) {
|
||||
console.warn(`[WARN] ${warning}`);
|
||||
}
|
||||
|
||||
if (allErrors.length > 0) {
|
||||
console.error(`[ERROR] Token-list metadata validation failed with ${allErrors.length} issue(s):`);
|
||||
for (const error of allErrors) {
|
||||
console.error(` - ${error}`);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`[OK] Token-list metadata conventions valid for ${validated} file(s).`);
|
||||
Submodule smom-dbis-138 updated: fcd55aa9c4...12ba59a3f2
@@ -3,7 +3,7 @@
|
||||
"version": {
|
||||
"major": 1,
|
||||
"minor": 1,
|
||||
"patch": 0
|
||||
"patch": 1
|
||||
},
|
||||
"timestamp": "2026-02-28T00:00:00.000Z",
|
||||
"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png",
|
||||
@@ -23,8 +23,22 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"defi"
|
||||
]
|
||||
"defi",
|
||||
"fiat",
|
||||
"cash"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "fiat-backed-stablecoin",
|
||||
"currency": "USD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"x402Ready": false,
|
||||
"fwdCanon": false,
|
||||
"walletClass": "cash-like-token",
|
||||
"bridge": "AlltraAdapter:cUSDT->AUSDT"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 651940,
|
||||
@@ -35,8 +49,22 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"defi"
|
||||
]
|
||||
"defi",
|
||||
"fiat",
|
||||
"cash"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "fiat-backed-stablecoin",
|
||||
"currency": "USD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"x402Ready": false,
|
||||
"fwdCanon": false,
|
||||
"walletClass": "cash-like-token",
|
||||
"bridge": "unknown-or-noncanonical:documented-token-n"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 651940,
|
||||
@@ -47,8 +75,22 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"defi"
|
||||
]
|
||||
"defi",
|
||||
"fiat",
|
||||
"cash"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "fiat-backed-stablecoin",
|
||||
"currency": "USD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"x402Ready": false,
|
||||
"fwdCanon": false,
|
||||
"walletClass": "cash-like-token",
|
||||
"bridge": "AlltraAdapter:cUSDC->USDC"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 651940,
|
||||
@@ -60,7 +102,15 @@
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
]
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset",
|
||||
"walletClass": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 651940,
|
||||
@@ -72,7 +122,15 @@
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
]
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset",
|
||||
"walletClass": "token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 651940,
|
||||
@@ -116,21 +174,36 @@
|
||||
"tags": [
|
||||
"defi"
|
||||
],
|
||||
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong"
|
||||
"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong",
|
||||
"extensions": {
|
||||
"category": "defi-token",
|
||||
"instrument": "protocol-token",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "protocol-utility"
|
||||
}
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"stablecoin": {
|
||||
"name": "Stablecoin",
|
||||
"description": "Stable value tokens pegged to fiat currencies"
|
||||
"description": "Stable value tokens pegged to fiat"
|
||||
},
|
||||
"defi": {
|
||||
"name": "DeFi",
|
||||
"description": "Decentralized Finance tokens"
|
||||
},
|
||||
"fiat": {
|
||||
"name": "Fiat",
|
||||
"description": "Fiat referenced tokens"
|
||||
},
|
||||
"cash": {
|
||||
"name": "Cashlike",
|
||||
"description": "Cash reserve or cash rail assets"
|
||||
},
|
||||
"wrapped": {
|
||||
"name": "Wrapped",
|
||||
"description": "Wrapped tokens representing native assets"
|
||||
"description": "Wrapped tokens representing assets"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,67 @@
|
||||
{
|
||||
"name": "Arbitrum DBIS Token List",
|
||||
"version": {"major": 1, "minor": 0, "patch": 0},
|
||||
"version": {
|
||||
"major": 1,
|
||||
"minor": 0,
|
||||
"patch": 0
|
||||
},
|
||||
"timestamp": "2026-02-16T00:00:00.000Z",
|
||||
"logoURI": "https://arbitrum.io/favicon.png",
|
||||
"keywords": ["arbitrum", "42161", "dbis", "ccip", "weth"],
|
||||
"keywords": [
|
||||
"arbitrum",
|
||||
"42161",
|
||||
"dbis",
|
||||
"ccip",
|
||||
"weth"
|
||||
],
|
||||
"tokens": [
|
||||
{"chainId": 42161, "address": "0x89dd12025bfCD38A168455A44B400e913ED33BE2", "name": "Wrapped Ether (WETH9)", "symbol": "WETH9", "decimals": 18, "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", "tags": ["defi", "wrapped"]},
|
||||
{"chainId": 42161, "address": "0xe0E93247376aa097dB308B92e6Ba36bA015535D0", "name": "Wrapped Ether v10", "symbol": "WETH10", "decimals": 18, "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", "tags": ["defi", "wrapped"]}
|
||||
{
|
||||
"chainId": 42161,
|
||||
"address": "0x89dd12025bfCD38A168455A44B400e913ED33BE2",
|
||||
"name": "Wrapped Ether (WETH9)",
|
||||
"symbol": "WETH9",
|
||||
"decimals": 18,
|
||||
"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png",
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 42161,
|
||||
"address": "0xe0E93247376aa097dB308B92e6Ba36bA015535D0",
|
||||
"name": "Wrapped Ether v10",
|
||||
"symbol": "WETH10",
|
||||
"decimals": 18,
|
||||
"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png",
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset"
|
||||
}
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"defi": {"name": "DeFi", "description": "Decentralized Finance tokens"},
|
||||
"wrapped": {"name": "Wrapped", "description": "Wrapped tokens representing native assets"}
|
||||
"defi": {
|
||||
"name": "DeFi",
|
||||
"description": "Decentralized Finance tokens"
|
||||
},
|
||||
"wrapped": {
|
||||
"name": "Wrapped",
|
||||
"description": "Wrapped tokens representing assets"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,67 @@
|
||||
{
|
||||
"name": "Avalanche DBIS Token List",
|
||||
"version": {"major": 1, "minor": 0, "patch": 0},
|
||||
"version": {
|
||||
"major": 1,
|
||||
"minor": 0,
|
||||
"patch": 0
|
||||
},
|
||||
"timestamp": "2026-02-16T00:00:00.000Z",
|
||||
"logoURI": "https://crypto.com/defi/static/avalanche-avax-logo.png",
|
||||
"keywords": ["avalanche", "43114", "dbis", "ccip", "weth"],
|
||||
"keywords": [
|
||||
"avalanche",
|
||||
"43114",
|
||||
"dbis",
|
||||
"ccip",
|
||||
"weth"
|
||||
],
|
||||
"tokens": [
|
||||
{"chainId": 43114, "address": "0xa4B9DD039565AeD9641D45b57061f99d9cA6Df08", "name": "Wrapped Ether (WETH9)", "symbol": "WETH9", "decimals": 18, "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", "tags": ["defi", "wrapped"]},
|
||||
{"chainId": 43114, "address": "0x89dd12025bfCD38A168455A44B400e913ED33BE2", "name": "Wrapped Ether v10", "symbol": "WETH10", "decimals": 18, "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", "tags": ["defi", "wrapped"]}
|
||||
{
|
||||
"chainId": 43114,
|
||||
"address": "0xa4B9DD039565AeD9641D45b57061f99d9cA6Df08",
|
||||
"name": "Wrapped Ether (WETH9)",
|
||||
"symbol": "WETH9",
|
||||
"decimals": 18,
|
||||
"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png",
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 43114,
|
||||
"address": "0x89dd12025bfCD38A168455A44B400e913ED33BE2",
|
||||
"name": "Wrapped Ether v10",
|
||||
"symbol": "WETH10",
|
||||
"decimals": 18,
|
||||
"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png",
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset"
|
||||
}
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"defi": {"name": "DeFi", "description": "Decentralized Finance tokens"},
|
||||
"wrapped": {"name": "Wrapped", "description": "Wrapped tokens representing native assets"}
|
||||
"defi": {
|
||||
"name": "DeFi",
|
||||
"description": "Decentralized Finance tokens"
|
||||
},
|
||||
"wrapped": {
|
||||
"name": "Wrapped",
|
||||
"description": "Wrapped tokens representing assets"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,14 @@
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
]
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -37,7 +44,14 @@
|
||||
"tags": [
|
||||
"defi",
|
||||
"wrapped"
|
||||
]
|
||||
],
|
||||
"extensions": {
|
||||
"category": "wrapped-native",
|
||||
"instrument": "wrapped-native",
|
||||
"settlement": "crypto-native",
|
||||
"cashLike": false,
|
||||
"backing": "native-gas-asset"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -61,8 +75,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "USD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cUSD",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -73,8 +102,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "EUR",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cEUR",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -85,8 +129,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/QmT2nJ6WyhYBCsYJ6NfS1BPAqiGKkCEuMxiC8ye93Co1hF",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "GBP",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cGBP",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -97,8 +156,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "AUD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cAUD",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -109,8 +183,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "JPY",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cJPY",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -121,8 +210,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "CHF",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cCHF",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"chainId": 25,
|
||||
@@ -133,8 +237,23 @@
|
||||
"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"iso4217w"
|
||||
]
|
||||
"iso4217w",
|
||||
"fiat",
|
||||
"cash",
|
||||
"compliant",
|
||||
"gru"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "emoney-or-fiat-backed-stablecoin",
|
||||
"currency": "CAD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"gruVersion": "v1",
|
||||
"gruFamily": "cCAD",
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
@@ -144,16 +263,32 @@
|
||||
},
|
||||
"wrapped": {
|
||||
"name": "Wrapped",
|
||||
"description": "Wrapped tokens representing native assets"
|
||||
"description": "Wrapped tokens representing assets"
|
||||
},
|
||||
"stablecoin": {
|
||||
"name": "Stablecoin",
|
||||
"description": "Stable value tokens pegged to fiat currencies"
|
||||
"description": "Stable value tokens pegged to fiat"
|
||||
},
|
||||
"iso4217w": {
|
||||
"name": "ISO4217W",
|
||||
"description": "ISO 4217 compliant wrapped fiat tokens"
|
||||
},
|
||||
"fiat": {
|
||||
"name": "Fiat",
|
||||
"description": "Fiat referenced tokens"
|
||||
},
|
||||
"cash": {
|
||||
"name": "Cashlike",
|
||||
"description": "Cash reserve or cash rail assets"
|
||||
},
|
||||
"compliant": {
|
||||
"name": "Compliant",
|
||||
"description": "Regulatory compliant assets"
|
||||
},
|
||||
"gru": {
|
||||
"name": "GRU",
|
||||
"description": "GRU transport assets"
|
||||
},
|
||||
"oracle": {
|
||||
"name": "Oracle",
|
||||
"description": "Oracle and oracle fee tokens"
|
||||
@@ -163,4 +298,4 @@
|
||||
"description": "Cross Chain Interoperability Protocol tokens"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -3,7 +3,7 @@
|
||||
"version": {
|
||||
"major": 1,
|
||||
"minor": 0,
|
||||
"patch": 0
|
||||
"patch": 1
|
||||
},
|
||||
"timestamp": "2026-02-16T00:00:00.000Z",
|
||||
"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png",
|
||||
@@ -22,18 +22,39 @@
|
||||
"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png",
|
||||
"tags": [
|
||||
"stablecoin",
|
||||
"defi"
|
||||
]
|
||||
"defi",
|
||||
"fiat",
|
||||
"cash"
|
||||
],
|
||||
"extensions": {
|
||||
"category": "tokenized-fiat",
|
||||
"instrument": "fiat-backed-stablecoin",
|
||||
"currency": "USD",
|
||||
"settlement": "fiat",
|
||||
"cashLike": true,
|
||||
"backing": "cash,cash-equivalents",
|
||||
"x402Ready": false,
|
||||
"fwdCanon": false,
|
||||
"walletClass": "cash-like-token"
|
||||
}
|
||||
}
|
||||
],
|
||||
"tags": {
|
||||
"stablecoin": {
|
||||
"name": "Stablecoin",
|
||||
"description": "Stable value tokens pegged to fiat currencies"
|
||||
"description": "Stable value tokens pegged to fiat"
|
||||
},
|
||||
"defi": {
|
||||
"name": "DeFi",
|
||||
"description": "Decentralized Finance tokens"
|
||||
},
|
||||
"fiat": {
|
||||
"name": "Fiat",
|
||||
"description": "Fiat referenced tokens"
|
||||
},
|
||||
"cash": {
|
||||
"name": "Cashlike",
|
||||
"description": "Cash reserve or cash rail assets"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user