chore: refresh deployment status and solana policies
This commit is contained in:
@@ -1,15 +1,18 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"description": "Public chain IDs and hub stable per chain for cW* edge pools (EVM). Non-EVM networks used for interoperability are listed under nonEvm (no EIP-155 id).",
|
||||
"version": "1.1.0",
|
||||
"updated": "2026-04-03",
|
||||
"description": "Public chain IDs and hub stable per chain for cW* edge pools (EVM). Non-EVM networks used for interoperability are listed under nonEvm (no EIP-155 id) with their own execution/oracle topology references.",
|
||||
"version": "1.2.0",
|
||||
"updated": "2026-04-17",
|
||||
"nonEvm": [
|
||||
{
|
||||
"identifier": "Solana",
|
||||
"vmKind": "SVM",
|
||||
"caip2": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
||||
"hubStableNote": "SPL USDC/USDT hubs differ from EVM; cW* edge PMM topology TBD when a wrapped representation is defined",
|
||||
"adapter": "SolanaAdapter"
|
||||
"hubStableNote": "Primary Solana hubs are SPL USDC then SPL USDT; deep liquidity and single-sided edge pools are defined in the dedicated Solana configs rather than the EVM DODO PMM matrix.",
|
||||
"adapter": "SolanaAdapter",
|
||||
"liquidityMode": "non_evm_deep_plus_single_sided_edge",
|
||||
"oraclePolicy": "cross-chain-pmm-lps/config/solana-oracle-policy.json",
|
||||
"poolMatrix": "cross-chain-pmm-lps/config/solana-pool-matrix.json"
|
||||
}
|
||||
],
|
||||
"chains": [
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
149
config/solana-oracle-policy.json
Normal file
149
config/solana-oracle-policy.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"description": "Solana execution-oracle policy for the GRU v2 launch set bridged from Chain 138. Reference primacy remains upstream of public execution pools.",
|
||||
"version": "1.0.0",
|
||||
"updated": "2026-04-17",
|
||||
"references": {
|
||||
"referencePrimacyDoc": "docs/04-configuration/GRU_REFERENCE_PRIMACY_AND_MESH_EXECUTION_MODEL.md",
|
||||
"solanaRuntimeConfig": "config/solana-relay-runtime.json",
|
||||
"lineupManifest": "config/solana-gru-bridge-lineup.json"
|
||||
},
|
||||
"hubStables": {
|
||||
"primary": {
|
||||
"symbol": "USDC",
|
||||
"mintEnv": "SOLANA_HUB_USDC_MINT",
|
||||
"mintFallback": "operator_fill_before_pool_deploy",
|
||||
"role": "deep_and_edge_primary_quote"
|
||||
},
|
||||
"secondary": {
|
||||
"symbol": "USDT",
|
||||
"mintEnv": "SOLANA_HUB_USDT_MINT",
|
||||
"mintFallback": "operator_fill_before_secondary_pool_deploy",
|
||||
"role": "overflow_quote_and_route_diversifier"
|
||||
}
|
||||
},
|
||||
"oracleClasses": {
|
||||
"weth_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 30,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_eth_usd",
|
||||
"chain138_wrapper_parity_eth_usd",
|
||||
"svm_market_sanity_eth_usd"
|
||||
]
|
||||
},
|
||||
"usd_parity": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 60,
|
||||
"maxExecutionDeviationBps": 25,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_usd_parity",
|
||||
"chain138_canonical_reserve_parity",
|
||||
"svm_market_sanity_stable_usd"
|
||||
]
|
||||
},
|
||||
"eur_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 90,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_eur_usd",
|
||||
"chain138_canonical_eur_usd",
|
||||
"institutional_fx_backup_eur_usd"
|
||||
]
|
||||
},
|
||||
"gbp_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 90,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_gbp_usd",
|
||||
"chain138_canonical_gbp_usd",
|
||||
"institutional_fx_backup_gbp_usd"
|
||||
]
|
||||
},
|
||||
"aud_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 90,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_aud_usd",
|
||||
"chain138_canonical_aud_usd",
|
||||
"institutional_fx_backup_aud_usd"
|
||||
]
|
||||
},
|
||||
"cad_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 90,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_cad_usd",
|
||||
"chain138_canonical_cad_usd",
|
||||
"institutional_fx_backup_cad_usd"
|
||||
]
|
||||
},
|
||||
"chf_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 90,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_chf_usd",
|
||||
"chain138_canonical_chf_usd",
|
||||
"institutional_fx_backup_chf_usd"
|
||||
]
|
||||
},
|
||||
"jpy_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 90,
|
||||
"maxExecutionDeviationBps": 50,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_jpy_usd",
|
||||
"chain138_canonical_jpy_usd",
|
||||
"institutional_fx_backup_jpy_usd"
|
||||
]
|
||||
},
|
||||
"xau_usd": {
|
||||
"targetQuote": "USDC",
|
||||
"maxOracleAgeSeconds": 60,
|
||||
"maxExecutionDeviationBps": 40,
|
||||
"pauseOnStale": true,
|
||||
"sources": [
|
||||
"gru_reference_service_xau_usd",
|
||||
"chain138_canonical_xau_usd",
|
||||
"institutional_commodity_backup_xau_usd"
|
||||
]
|
||||
}
|
||||
},
|
||||
"assetOracleAssignments": {
|
||||
"WETH": "weth_usd",
|
||||
"WETH10": "weth_usd",
|
||||
"cWUSDT": "usd_parity",
|
||||
"cWUSDC": "usd_parity",
|
||||
"cWAUSDT": "usd_parity",
|
||||
"cWEURC": "eur_usd",
|
||||
"cWEURT": "eur_usd",
|
||||
"cWGBPC": "gbp_usd",
|
||||
"cWGBPT": "gbp_usd",
|
||||
"cWAUDC": "aud_usd",
|
||||
"cWCADC": "cad_usd",
|
||||
"cWCHFC": "chf_usd",
|
||||
"cWJPYC": "jpy_usd",
|
||||
"cWXAUC": "xau_usd",
|
||||
"cWXAUT": "xau_usd"
|
||||
},
|
||||
"operatorRequirements": {
|
||||
"requireFreshReference": true,
|
||||
"requireDualSourceForFiatAndGold": true,
|
||||
"pausePoolActionsWhenReferenceMissing": true,
|
||||
"recordOracleSnapshotWithEachPoolAction": true
|
||||
}
|
||||
}
|
||||
185
config/solana-pool-matrix.json
Normal file
185
config/solana-pool-matrix.json
Normal file
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"description": "Deep-pool and single-sided edge-pool topology for the Solana GRU v2 launch set.",
|
||||
"version": "1.0.0",
|
||||
"updated": "2026-04-17",
|
||||
"references": {
|
||||
"solanaRuntimeConfig": "config/solana-relay-runtime.json",
|
||||
"oraclePolicy": "cross-chain-pmm-lps/config/solana-oracle-policy.json",
|
||||
"lineupManifest": "config/solana-gru-bridge-lineup.json"
|
||||
},
|
||||
"hubStables": [
|
||||
{
|
||||
"symbol": "USDC",
|
||||
"role": "primary",
|
||||
"mintEnv": "SOLANA_HUB_USDC_MINT"
|
||||
},
|
||||
{
|
||||
"symbol": "USDT",
|
||||
"role": "secondary",
|
||||
"mintEnv": "SOLANA_HUB_USDT_MINT"
|
||||
}
|
||||
],
|
||||
"deepVenueOrder": [
|
||||
"phoenix_clob",
|
||||
"orca_clmm"
|
||||
],
|
||||
"edgeVenueOrder": [
|
||||
"meteora_dlmm",
|
||||
"orca_clmm"
|
||||
],
|
||||
"assets": [
|
||||
{
|
||||
"symbol": "WETH",
|
||||
"oracleClass": "weth_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 500000, "singleSided": false },
|
||||
{ "quoteSymbol": "USDC", "venue": "orca_clmm", "targetDepthUsd": 250000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 100000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "WETH10",
|
||||
"oracleClass": "weth_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 250000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 75000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWUSDT",
|
||||
"oracleClass": "usd_parity",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 400000, "singleSided": false },
|
||||
{ "quoteSymbol": "USDT", "venue": "orca_clmm", "targetDepthUsd": 300000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 125000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWUSDC",
|
||||
"oracleClass": "usd_parity",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 400000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDT", "venue": "meteora_dlmm", "targetDepthUsd": 125000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWAUSDT",
|
||||
"oracleClass": "usd_parity",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 250000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 100000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWEURC",
|
||||
"oracleClass": "eur_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 200000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 75000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWEURT",
|
||||
"oracleClass": "eur_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 150000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 60000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWGBPC",
|
||||
"oracleClass": "gbp_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 150000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 60000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWGBPT",
|
||||
"oracleClass": "gbp_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 125000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 50000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWAUDC",
|
||||
"oracleClass": "aud_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 125000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 50000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWCADC",
|
||||
"oracleClass": "cad_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 125000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 50000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWCHFC",
|
||||
"oracleClass": "chf_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 125000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 50000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWJPYC",
|
||||
"oracleClass": "jpy_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 125000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 50000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWXAUC",
|
||||
"oracleClass": "xau_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 225000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 80000, "singleSided": true }
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "cWXAUT",
|
||||
"oracleClass": "xau_usd",
|
||||
"deepPools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "phoenix_clob", "targetDepthUsd": 225000, "singleSided": false }
|
||||
],
|
||||
"edgePools": [
|
||||
{ "quoteSymbol": "USDC", "venue": "meteora_dlmm", "targetDepthUsd": 80000, "singleSided": true }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -31,6 +31,8 @@ Validates `config/deployment-status.json` for minimum viable deployed graph. Use
|
||||
|
||||
- If `bridgeAvailable === true` on a chain, `cwTokens` must include at least **cWUSDT** and **cWUSDC** (phase 1).
|
||||
- For each `pmmPool` and each `pmmPoolsVolatile[]` entry: `role` ∈ {defense, public_routing, truu_routing}; `feeBps` and `k` present; `base`/`quote` (or `tokenIn`/`tokenOut`) exist in `cwTokens` or `anchorAddresses` (e.g. mainnet **TRUU** under `anchorAddresses.TRUU`). Non-zero `poolAddress` must not be the zero address.
|
||||
- For each `gasReferenceVenues[]` entry: `supported` must be explicit, `aggregatorOnly` is only valid for `1inch`, `supported=false` means the lane is explicitly unsupported (and can never be live), and `supported=true` with `live=false` / `routingVisible=false` means the lane is planned or staged.
|
||||
- `aggregatorOnly=true` rows are routing overlays, not stand-alone live venues.
|
||||
|
||||
**Run:**
|
||||
|
||||
|
||||
@@ -78,6 +78,30 @@ function validatePoolEntries(chainId, pools, listLabel, knownTokens, errors) {
|
||||
}
|
||||
}
|
||||
|
||||
function validateUniswapV2Entries(chainId, pools, knownTokens, errors) {
|
||||
for (let i = 0; i < pools.length; i++) {
|
||||
const pool = pools[i];
|
||||
const base = pool.base;
|
||||
const quote = pool.quote;
|
||||
|
||||
if (!base || !knownTokens.has(base)) {
|
||||
errors.push(`Chain ${chainId} uniswapV2Pools[${i}]: base "${base}" not in cwTokens or anchorAddresses`);
|
||||
}
|
||||
if (!quote || !knownTokens.has(quote)) {
|
||||
errors.push(`Chain ${chainId} uniswapV2Pools[${i}]: quote "${quote}" not in cwTokens or anchorAddresses`);
|
||||
}
|
||||
if (!pool.poolAddress || looksPlaceholderAddress(String(pool.poolAddress).toLowerCase())) {
|
||||
errors.push(`Chain ${chainId} uniswapV2Pools[${i}]: poolAddress must use a real deployed pair address`);
|
||||
}
|
||||
if (pool.venue && pool.venue !== 'uniswap_v2_pair') {
|
||||
errors.push(`Chain ${chainId} uniswapV2Pools[${i}]: venue must be "uniswap_v2_pair" when set`);
|
||||
}
|
||||
if (pool.publicRoutingEnabled === true && (!pool.factoryAddress || !pool.routerAddress)) {
|
||||
errors.push(`Chain ${chainId} uniswapV2Pools[${i}]: publicRoutingEnabled rows require factoryAddress and routerAddress`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function main() {
|
||||
const status = loadJson(DEPLOYMENT_STATUS_PATH);
|
||||
const chains = status.chains || {};
|
||||
@@ -89,6 +113,7 @@ function main() {
|
||||
const anchorAddresses = chain.anchorAddresses || {};
|
||||
const gasQuoteAddresses = chain.gasQuoteAddresses || {};
|
||||
const pmmPools = chain.pmmPools || [];
|
||||
const uniswapV2Pools = chain.uniswapV2Pools || [];
|
||||
const pmmPoolsVolatile = chain.pmmPoolsVolatile || [];
|
||||
const gasPmmPools = chain.gasPmmPools || [];
|
||||
const gasReferenceVenues = chain.gasReferenceVenues || [];
|
||||
@@ -110,6 +135,7 @@ function main() {
|
||||
]);
|
||||
|
||||
validatePoolEntries(chainId, pmmPools, 'pmmPools', knownTokens, errors);
|
||||
validateUniswapV2Entries(chainId, uniswapV2Pools, knownTokens, errors);
|
||||
validatePoolEntries(chainId, pmmPoolsVolatile, 'pmmPoolsVolatile', knownTokens, errors);
|
||||
validatePoolEntries(chainId, gasPmmPools, 'gasPmmPools', knownTokens, errors);
|
||||
|
||||
@@ -139,12 +165,18 @@ function main() {
|
||||
if (!VALID_REFERENCE_PROTOCOLS.includes(venue.protocol)) {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: protocol must be one of ${VALID_REFERENCE_PROTOCOLS.join(', ')}`);
|
||||
}
|
||||
if (typeof venue.supported !== 'boolean') {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: supported must be set explicitly to true or false`);
|
||||
}
|
||||
if (!venue.familyKey || typeof venue.familyKey !== 'string') {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: familyKey required`);
|
||||
continue;
|
||||
}
|
||||
if (!referenceVenuesByFamily.has(venue.familyKey)) referenceVenuesByFamily.set(venue.familyKey, []);
|
||||
referenceVenuesByFamily.get(venue.familyKey).push(venue);
|
||||
if (venue.aggregatorOnly === true && venue.protocol !== '1inch') {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: aggregatorOnly rows must use protocol "1inch"`);
|
||||
}
|
||||
if (isLiveRow(venue)) {
|
||||
if (!VALID_NATIVE_REFERENCE_PROTOCOLS.includes(venue.protocol)) {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: live/routingVisible rows must use a native protocol contract, not "${venue.protocol}"`);
|
||||
@@ -153,6 +185,12 @@ function main() {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: live/routingVisible venueAddress must use a native protocol contract, not a placeholder scaffold (${venue.venueAddress})`);
|
||||
}
|
||||
}
|
||||
if (venue.supported === false && isLiveRow(venue)) {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: supported=false rows cannot be live/routingVisible`);
|
||||
}
|
||||
if (venue.supported === false && venue.protocol === '1inch' && venue.aggregatorOnly !== true) {
|
||||
errors.push(`Chain ${chainId} gasReferenceVenues[${i}]: unsupported 1inch rows must be marked aggregatorOnly=true`);
|
||||
}
|
||||
}
|
||||
|
||||
for (const [familyKey, venues] of referenceVenuesByFamily.entries()) {
|
||||
|
||||
Reference in New Issue
Block a user