diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index b6d478963a2..f876a10b8f0 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T21:03:30Z", + "timestamp": "2026-02-08T21:05:44Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -14,12 +14,19 @@ "arbitrum-1inch-usd-premium-prod-v03", "arbitrum-aapl-usd", "arbitrum-aapl-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-aapl-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-aapl-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-aapl-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-aaplx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-aaplx-usd-streams-cexprice-mainnet-production", "arbitrum-aave-usd", "arbitrum-aave-usd-premium-prod", + "arbitrum-aave-usd-svr", "arbitrum-ab-usd", "arbitrum-abbv-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-abbv-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-abbv-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-abbv-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-abt-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-ace-usd-premium-prod-v03", "arbitrum-ada-usd", @@ -41,6 +48,9 @@ "arbitrum-amgn-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-amzn-usd", "arbitrum-amzn-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-amzn-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-amzn-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-amzn-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-amznx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-amznx-usd-streams-cexprice-mainnet-production", "arbitrum-anime-usd-premium-prod-v03", @@ -58,6 +68,8 @@ "arbitrum-ar-usd-refprice-ds-premium-global-003-prod", "arbitrum-arb-usd", "arbitrum-arb-usd-premium-prod", + "arbitrum-arb-usd-shared-svr", + "arbitrum-arb-usd-svr", "arbitrum-arkm-usd-premium-prod-v03", "arbitrum-aster-usd-streams-cexprice-mainnet-production", "arbitrum-astr-usd", @@ -69,6 +81,7 @@ "arbitrum-aud-usd", "arbitrum-aud-usd-refprice-timestamped-mainnet-production", "arbitrum-aud-usd-rwa-prod-v04", + "arbitrum-ausd-usd-streams-dexprice-mainnet-production", "arbitrum-avax-usd", "arbitrum-avax-usd-premium-prod", "arbitrum-avgo-usd-streams-equityprice-timestamped-mainnet-production", @@ -94,9 +107,13 @@ "arbitrum-blue-usd-refprice-mainnet-production", "arbitrum-blur-usd-premium-prod-v03", "arbitrum-bmnr-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-bmnr-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-bmnr-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-bmnr-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-bnb-usd", "arbitrum-bnb-usd-premium-prod", "arbitrum-bnsol-usd-refprice-mainnet-production", + "arbitrum-bob-usd-streams-cexprice-mainnet-production", "arbitrum-bome-usd-refprice-ds-premium-global-003-prod", "arbitrum-bone-usd", "arbitrum-bone-usd-refprice-mainnet-production", @@ -106,10 +123,13 @@ "arbitrum-brl-usd", "arbitrum-bsol-usd-refprice-mainnet-production", "arbitrum-bsv-usd-refprice-mainnet-production", + "arbitrum-btc-b-usd-streams-dexprice-mainnet-production", "arbitrum-btc-eth", "arbitrum-btc-usd", "arbitrum-btc-usd-marketcap", "arbitrum-btc-usd-premium-prod", + "arbitrum-btc-usd-shared-svr", + "arbitrum-btc-usd-svr", "arbitrum-btr-usd-streams-cexprice-mainnet-production", "arbitrum-btt-usd-refprice-mainnet-production", "arbitrum-c98-usd-premium-prod-v03", @@ -121,6 +141,8 @@ "arbitrum-cbbtc-usd-refprice-mainnet-production", "arbitrum-cbeth-eth", "arbitrum-cbeth-eth-exchange", + "arbitrum-cbtc-por-datalink-proofofreserves-mainnet-production", + "arbitrum-cc-usd-streams-cexprice-mainnet-production", "arbitrum-celo-usd-refprice-mainnet-production", "arbitrum-cfx-usd-refprice-mainnet-production", "arbitrum-chf-usd", @@ -129,6 +151,9 @@ "arbitrum-cny-usd", "arbitrum-coin-usd", "arbitrum-coin-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-coin-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-coin-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-coin-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-coinx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-coinx-usd-streams-cexprice-mainnet-production", "arbitrum-comp-usd", @@ -138,6 +163,9 @@ "arbitrum-core-usd-refprice-mainnet-production", "arbitrum-cost-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-crcl-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-crcl-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-crcl-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-crcl-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-crclx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-crclx-usd-streams-cexprice-mainnet-production", "arbitrum-crm-usd-streams-equityprice-timestamped-mainnet-production", @@ -149,14 +177,18 @@ "arbitrum-csco-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-ctc-usd-refprice-mainnet-production", "arbitrum-cusdo-usd-streams-dexprice-mainnet-production", + "arbitrum-cusdo-usdo-streams-exchangerate-mainnet-production", "arbitrum-cvx-usd", "arbitrum-cvx-usd-refprice-mainnet-production", "arbitrum-cvx-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-cyber-usd-premium-prod-v03", "arbitrum-dai-usd", "arbitrum-dai-usd-premium-prod", + "arbitrum-dai-usd-shared-svr", + "arbitrum-dai-usd-svr", "arbitrum-dash-usd-refprice-mainnet-production", "arbitrum-deep-usd-refprice-mainnet-production", + "arbitrum-degen-usd-streams-cexprice-mainnet-production", "arbitrum-deusd-usd", "arbitrum-dodo-usd", "arbitrum-dodo-usd-refprice-mainnet-production", @@ -172,6 +204,7 @@ "arbitrum-dusk-usd-refprice-mainnet-production", "arbitrum-dydx-usd-refprice-ds-premium-global-003-prod", "arbitrum-dym-usd-refprice-mainnet-production", + "arbitrum-eden-usd-streams-cexprice-mainnet-production", "arbitrum-edu-usd-premium-prod-v03", "arbitrum-efa-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-egeth-eth-exchange-rate", @@ -185,12 +218,17 @@ "arbitrum-eth-usd", "arbitrum-eth-usd-marketcap", "arbitrum-eth-usd-premium-prod", + "arbitrum-eth-usd-shared-svr", + "arbitrum-eth-usd-svr", "arbitrum-ethfi-usd-premium-prod", "arbitrum-ethx-eth-exchange-rate", "arbitrum-eur-usd", "arbitrum-eur-usd-refprice-timestamped-mainnet-production", "arbitrum-eur-usd-rwa-prod-v04", "arbitrum-eurc-usd", + "arbitrum-eurc-usd-shared-svr", + "arbitrum-eurc-usd-streams-dexprice-mainnet-production", + "arbitrum-eurc-usd-svr", "arbitrum-eusx-usx-streams-exchangerate-mainnet-production", "arbitrum-ewj-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-ezeth-eth", @@ -200,6 +238,7 @@ "arbitrum-ezu-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-fartcoin-usd-premium-prod-v03", "arbitrum-fbtc-btc-exchange-rate", + "arbitrum-fbtc-btc-streams-exchangerate-mainnet-production", "arbitrum-fbtc-por", "arbitrum-fdusd-usd-refprice-mainnet-production", "arbitrum-fet-usd-refprice-ds-premium-global-003-prod", @@ -212,6 +251,8 @@ "arbitrum-fragsol-sol-exchange-rate", "arbitrum-frax-usd", "arbitrum-frax-usd-refprice-mainnet-production", + "arbitrum-frax-usd-shared-svr", + "arbitrum-frax-usd-svr", "arbitrum-frxeth-eth-high", "arbitrum-frxeth-eth-low", "arbitrum-frxusd-usd", @@ -225,6 +266,7 @@ "arbitrum-ge-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-gho-usd", "arbitrum-gho-usd-refprice-mainnet-production", + "arbitrum-gho-usd-svr", "arbitrum-giga-usd-refprice-mainnet-production", "arbitrum-gld-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-gm-btc-usd-wbtc-wbtc", @@ -240,6 +282,9 @@ "arbitrum-goat-usd-premium-prod-v03", "arbitrum-googl-usd", "arbitrum-googl-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-googl-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-googl-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-googl-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-googlx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-googlx-usd-streams-cexprice-mainnet-production", "arbitrum-grass-usd", @@ -255,6 +300,9 @@ "arbitrum-hmstr-usd-premium-prod-v03", "arbitrum-hnt-usd-refprice-mainnet-production", "arbitrum-hood-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-hood-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-hood-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-hood-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-hoodx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-hoodx-usd-streams-cexprice-mainnet-production", "arbitrum-hook-usd-premium-prod-v03", @@ -305,6 +353,7 @@ "arbitrum-kava-usd-refprice-mainnet-production", "arbitrum-kcs-usd-refprice-mainnet-production", "arbitrum-khype-usd-refprice-mainnet-production", + "arbitrum-kmhype-hype-streams-exchangerate-mainnet-production", "arbitrum-kmno-usd-refprice-mainnet-production", "arbitrum-knc-usd", "arbitrum-ko-usd-streams-equityprice-timestamped-mainnet-production", @@ -322,7 +371,10 @@ "arbitrum-link-eth", "arbitrum-link-usd", "arbitrum-link-usd-premium-prod", + "arbitrum-link-usd-shared-svr", + "arbitrum-link-usd-svr", "arbitrum-lista-usd-premium-prod-v03", + "arbitrum-lit-usd-streams-cexprice-mainnet-production", "arbitrum-lly-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-low-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-lpt-usd-refprice-mainnet-production", @@ -333,6 +385,8 @@ "arbitrum-ltc-usd-premium-prod", "arbitrum-lusd-usd", "arbitrum-lusd-usd-refprice-mainnet-production", + "arbitrum-lusd-usd-shared-svr", + "arbitrum-lusd-usd-svr", "arbitrum-m-nav-arbitrum", "arbitrum-m-usd-streams-cexprice-mainnet-production", "arbitrum-ma-usd-streams-equityprice-timestamped-mainnet-production", @@ -350,8 +404,12 @@ "arbitrum-melania-usd-premium-prod-v03", "arbitrum-meme-usd-premium-prod", "arbitrum-merl-usd-premium-prod-v03", + "arbitrum-met-usd-streams-cexprice-mainnet-production", "arbitrum-meta-usd", "arbitrum-meta-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-meta-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-meta-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-meta-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-metax-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-metax-usd-streams-cexprice-mainnet-production", "arbitrum-metis-usd-refprice-mainnet-production", @@ -365,18 +423,30 @@ "arbitrum-mnt-usd", "arbitrum-mnt-usd-refprice-mainnet-production", "arbitrum-mog-usd-premium-prod-v03", + "arbitrum-mon-usd", + "arbitrum-mon-usd-streams-cexprice-mainnet-production", "arbitrum-moodeng-usd-premium-prod-v03", "arbitrum-morpho-usd-refprice-mainnet-production", "arbitrum-mplx-usd-streams-cexprice-mainnet-production", "arbitrum-mrk-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-mrk-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-mrk-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-mrk-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-ms-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-msft-usd", "arbitrum-msft-usd-refprice-timestamped-mainnet-production", + "arbitrum-msft-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-msft-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-msft-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-msftx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-msol-usd-refprice-mainnet-production", "arbitrum-mstr-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-mstr-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-mstr-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-mstr-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-mstrx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-mstrx-usd-streams-cexprice-mainnet-production", + "arbitrum-musd-usd-streams-dexprice-mainnet-production", "arbitrum-mvi-usd", "arbitrum-myx-usd-streams-cexprice-mainnet-production", "arbitrum-near-usd", @@ -388,6 +458,9 @@ "arbitrum-not-usd-refprice-ds-premium-global-003-prod", "arbitrum-nvda-usd", "arbitrum-nvda-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-nvda-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-nvda-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-nvda-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-nvdax-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-nvdax-usd-streams-cexprice-mainnet-production", "arbitrum-nzd-usd-refprice-timestamped-mainnet-production", @@ -400,6 +473,9 @@ "arbitrum-op-usd-premium-prod", "arbitrum-orca-usd-refprice-mainnet-production", "arbitrum-orcl-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-orcl-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-orcl-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-orcl-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-order-usd", "arbitrum-order-usd-premium-prod-v03", "arbitrum-ordi-usd", @@ -420,6 +496,10 @@ "arbitrum-php-usd", "arbitrum-pi-usd-refprice-mainnet-production", "arbitrum-pixel-usd-premium-prod-v03", + "arbitrum-pltr-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-pltr-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-pltr-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-pltr-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-plume-usd", "arbitrum-plume-usd-refprice-mainnet-production", "arbitrum-pm-usd-streams-equityprice-timestamped-mainnet-production", @@ -434,10 +514,14 @@ "arbitrum-pump-usd", "arbitrum-pump-usd-refprice-mainnet-production", "arbitrum-pyth-usd-premium-prod-v03", + "arbitrum-pyusd-usd", "arbitrum-pyusd-usd-refprice-mainnet-production", "arbitrum-qcom-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-qnt-usd-refprice-ds-premium-global-003-prod", "arbitrum-qqq-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-qqq-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-qqq-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-qqq-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-qqqx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-qqqx-usd-streams-cexprice-mainnet-production", "arbitrum-qtum-usd-refprice-mainnet-production", @@ -449,6 +533,7 @@ "arbitrum-real-gdp-level", "arbitrum-real-gdp-percentage", "arbitrum-render-usd-refprice-ds-premium-global-003-prod", + "arbitrum-resolv-usd-streams-cexprice-mainnet-production", "arbitrum-reth-eth", "arbitrum-reth-eth-exchange-rate", "arbitrum-rez-usd-premium-prod-v03", @@ -490,11 +575,15 @@ "arbitrum-sol-usd", "arbitrum-sol-usd-premium-prod", "arbitrum-solvbtc-btc", + "arbitrum-solvbtc-btc-streams-exchangerate-mainnet-production", "arbitrum-spell-usd", "arbitrum-spk-usd-refprice-mainnet-production", "arbitrum-spx-usd-refprice-mainnet-production", "arbitrum-spy-usd", "arbitrum-spy-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-spy-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-spy-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-spy-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-spyx-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-spyx-usd-streams-cexprice-mainnet-production", "arbitrum-stafi-staked-eth-reth-eth-exchange-rate", @@ -545,16 +634,22 @@ "arbitrum-ton-usd-premium-prod", "arbitrum-toshi-usd-refprice-mainnet-production", "arbitrum-trb-usd-refprice-mainnet-production", + "arbitrum-trex-usd-streams-dexprice-mainnet-production", "arbitrum-tru-usd-refprice-mainnet-production", "arbitrum-trump-usd", "arbitrum-trump-usd-premium-prod-v03", "arbitrum-trx-usd-premium-prod", "arbitrum-try-usd", + "arbitrum-try-usd-streams-forexprice-timestamped-mainnet-production", "arbitrum-tsla-usd", "arbitrum-tsla-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-tsla-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-tsla-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-tsla-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-tslax-usd-datalink-backed-totalreturnmultiplier-timestamped-mainnet-production", "arbitrum-tslax-usd-streams-cexprice-mainnet-production", "arbitrum-turbo-usd-premium-prod-v03", + "arbitrum-turtle-usd-streams-cexprice-mainnet-production", "arbitrum-tusd-usd", "arbitrum-twt-usd-refprice-mainnet-production", "arbitrum-txn-usd-streams-equityprice-timestamped-mainnet-production", @@ -563,6 +658,9 @@ "arbitrum-ulti-usd", "arbitrum-ultraeths-eth-exchange-rate", "arbitrum-unh-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-unh-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-unh-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-unh-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-uni-usd", "arbitrum-uni-usd-premium-prod", "arbitrum-unibtc-btc-exchange-rate", @@ -570,6 +668,7 @@ "arbitrum-unibtc-btc-streams-exchangerate-mainnet-production", "arbitrum-unieth-eth-exchange-rate", "arbitrum-unp-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-uscc-nav-smartdata-netassetvalue-mainnet-production", "arbitrum-usd-cad-refprice-timestamped-mainnet-production", "arbitrum-usd-cad-rwa-prod-v04", "arbitrum-usd-chf-refprice-timestamped-mainnet-production", @@ -585,20 +684,28 @@ "arbitrum-usdai-usd", "arbitrum-usdc-usd", "arbitrum-usdc-usd-premium-prod", + "arbitrum-usdc-usd-shared-svr", + "arbitrum-usdc-usd-svr", "arbitrum-usdd-usd", "arbitrum-usde-usd", "arbitrum-usde-usd-premium-prod", "arbitrum-usdf-usd-streams-dexprice-mainnet-production", "arbitrum-usdg-usd", + "arbitrum-usdm-usd-streams-dexprice-mainnet-production", "arbitrum-usds-usd", "arbitrum-usds-usd-refprice-mainnet-production", "arbitrum-usdt-usd", "arbitrum-usdt-usd-premium-prod", + "arbitrum-usdt-usd-shared-svr", + "arbitrum-usdt-usd-svr", + "arbitrum-usdt0-usd-streams-dexprice-mainnet-production", + "arbitrum-usdtb-usd-streams-dexprice-mainnet-production", "arbitrum-usol-usd-streams-cexprice-mainnet-production", "arbitrum-usr-usd", "arbitrum-usr-usd-exchange-rate", "arbitrum-usr-usd-refprice-mainnet-production", "arbitrum-usr-usd-streams-exchangerate-mainnet-production", + "arbitrum-ustb-nav-smartdata-netassetvalue-mainnet-production", "arbitrum-usual-usd-refprice-mainnet-production", "arbitrum-usx-usd-streams-dexprice-mainnet-production", "arbitrum-v-usd-streams-equityprice-timestamped-mainnet-production", @@ -625,6 +732,7 @@ "arbitrum-wen-usd-refprice-mainnet-production", "arbitrum-weth-uniswap-usd-streams-dexprice-mainnet-production", "arbitrum-wfc-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-whitewhale-usd-streams-cexprice-mainnet-production", "arbitrum-wif-usd", "arbitrum-wif-usd-premium-prod", "arbitrum-wld-usd-refprice-ds-premium-global-003-prod", @@ -638,6 +746,7 @@ "arbitrum-wsrusd-rusd-streams-exchangerate-mainnet-production", "arbitrum-wsteth-eth", "arbitrum-wsteth-steth exchangerate", + "arbitrum-wsteth-steth-streams-exchangerate-mainnet-production", "arbitrum-wsteth-usd-refprice-mainnet-production", "arbitrum-wstusr-stusr", "arbitrum-wstusr-stusr-exchange-rate", @@ -720,6 +829,7 @@ "avalanche-fsbtc-reserves", "avalanche-fxs-usd", "avalanche-gho-usd", + "avalanche-glv-[avax-usdc]-usd", "avalanche-gmx-usd", "avalanche-ion-digital-total-reserve", "avalanche-joe-usd", @@ -750,6 +860,7 @@ "avalanche-solvbtc-btc", "avalanche-solvbtc.bbn-solvbtc-exchange-rate", "avalanche-spell-usd", + "avalanche-spsei-sei-exchange-rate", "avalanche-susde-usd", "avalanche-susde-usde-exchange-rate", "avalanche-sushi-usd", @@ -775,6 +886,7 @@ "avalanche-wstpol-pol-exchange-rate", "avalanche-xag-usd", "avalanche-xau-usd", + "avalanche-xcu-usd", "avalanche-xsolvbtc-nav", "avalanche-ybtc-btc-exchange-rate", "avalanche-ybtc.b-btc", @@ -788,6 +900,7 @@ "base-anon-usd", "base-apt-usd", "base-arkb-reserves", + "base-arsx-base-por", "base-aud-usd", "base-avail-usd", "base-avax-usd", @@ -796,6 +909,7 @@ "base-bnb-usd", "base-brl-usd", "base-btc-usd", + "base-btc-usd-shared-svr", "base-btc-usd-svr", "base-cad-usd", "base-cbbtc-por", @@ -814,12 +928,15 @@ "base-doge-usd", "base-dola-usd", "base-eth-usd", + "base-eth-usd-shared-svr", "base-eth-usd-svr", "base-eur-usd", "base-eurc-usd", + "base-eurc-usd-shared-svr", "base-eurc-usd-svr", "base-ezeth-eth", "base-ezeth-eth-exchange-rate", + "base-ezeth-eth-exchange-rate-svr", "base-gbp-usd", "base-gho-usd", "base-gho-usd-svr", @@ -862,6 +979,7 @@ "base-reth-eth-exchange-rate", "base-rseth-eth", "base-rseth-eth-exchange-rate", + "base-rseth-eth-exchange-rate-svr", "base-rsr-usd", "base-rsweth-eth", "base-rsweth-eth-exchange-rate", @@ -891,20 +1009,25 @@ "base-try-usd", "base-ultraeths-eth-exchange-rate", "base-unibtc-btc-exchange-rate", + "base-usd+-usd", "base-usdai-usd", "base-usdc-usd", + "base-usdc-usd-shared-svr", "base-usdc-usd-svr", "base-usde-usd", "base-usdo-por", "base-usds-usd", "base-usdt-usd", + "base-usdt-usd-shared-svr", "base-usdt-usd-svr", + "base-usdz-usd", "base-usr-usd", "base-virtual-usd", "base-vvv-usd", "base-vyusd-usd-exchange-rate", "base-wbtc-usd", "base-weeth-eeth-exchange-rate", + "base-weeth-eeth-exchange-rate-svr", "base-weeth-eth", "base-well-usd", "base-wif-usd", @@ -913,6 +1036,7 @@ "base-wrseth-eth-exchange-rate", "base-wsteth-eth", "base-wsteth-steth exchangerate", + "base-wsteth-steth-exchange-rate-svr", "base-wstusr-stusr-exchange-rate", "base-xau-usd", "base-xrp-usd", @@ -929,8 +1053,10 @@ "bnb-chain-1inch-usd", "bnb-chain-aapl-usd", "bnb-chain-aave-usd", + "bnb-chain-aave-usd-shared-svr", "bnb-chain-ada-bnb", "bnb-chain-ada-usd", + "bnb-chain-ada-usd-shared-svr", "bnb-chain-alpaca-usd", "bnb-chain-amzn-usd", "bnb-chain-aster-usd", @@ -942,16 +1068,22 @@ "bnb-chain-band-usd", "bnb-chain-bch-bnb", "bnb-chain-bch-usd", + "bnb-chain-bch-usd-shared-svr", "bnb-chain-bnb-usd", + "bnb-chain-bnb-usd-shared-svr", + "bnb-chain-bnb-usd-svr", "bnb-chain-br-usd", "bnb-chain-brl-usd", "bnb-chain-bsw-usd", "bnb-chain-btc-bnb", "bnb-chain-btc-eth", "bnb-chain-btc-usd", + "bnb-chain-btc-usd-shared-svr", + "bnb-chain-btc-usd-svr", "bnb-chain-c98-usd", "bnb-chain-cake-bnb", "bnb-chain-cake-usd", + "bnb-chain-cake-usd-shared-svr", "bnb-chain-calculated-bnbx-usd", "bnb-chain-calculated-savax-usd", "bnb-chain-cashplus-nav", @@ -963,8 +1095,10 @@ "bnb-chain-crv-usd", "bnb-chain-dai-bnb", "bnb-chain-dai-usd", + "bnb-chain-dai-usd-shared-svr", "bnb-chain-dodo-usd", "bnb-chain-doge-usd", + "bnb-chain-doge-usd-shared-svr", "bnb-chain-dot-bnb", "bnb-chain-dot-usd", "bnb-chain-enzobtc-por", @@ -972,12 +1106,16 @@ "bnb-chain-eos-usd", "bnb-chain-eth-bnb", "bnb-chain-eth-usd", + "bnb-chain-eth-usd-shared-svr", + "bnb-chain-eth-usd-svr", "bnb-chain-eur-usd", "bnb-chain-ezeth-eth", "bnb-chain-ezeth-eth-exchange-rate", "bnb-chain-fdusd-usd", + "bnb-chain-fdusd-usd-shared-svr", "bnb-chain-fet-usd", "bnb-chain-fil-usd", + "bnb-chain-fil-usd-shared-svr", "bnb-chain-frax-usd", "bnb-chain-fxs-usd", "bnb-chain-gbp-usd", @@ -996,9 +1134,11 @@ "bnb-chain-lina-usd", "bnb-chain-link-bnb", "bnb-chain-link-usd", + "bnb-chain-link-usd-shared-svr", "bnb-chain-lista-usd", "bnb-chain-ltc-bnb", "bnb-chain-ltc-usd", + "bnb-chain-ltc-usd-shared-svr", "bnb-chain-mask-usd", "bnb-chain-matic-usd", "bnb-chain-meta-usd", @@ -1030,6 +1170,7 @@ "bnb-chain-sgd-usd", "bnb-chain-shib-usd", "bnb-chain-sol-usd", + "bnb-chain-sol-usd-shared-svr", "bnb-chain-solv-por", "bnb-chain-solvbtc-btc", "bnb-chain-solvbtc.bbn-solvbtc-exchange-rate", @@ -1040,25 +1181,39 @@ "bnb-chain-susd1+-usd1-exchange-rate", "bnb-chain-susdd-usdd-exchange-rate", "bnb-chain-susde-usde-exchange-rate", + "bnb-chain-susde-usde-exchange-rate-shared-svr", "bnb-chain-susdf-usdf-exchange-rate", "bnb-chain-sushi-usd", "bnb-chain-sxp-usd", + "bnb-chain-syrupusdt-usdt-exchange-rate", "bnb-chain-tree-usd", "bnb-chain-trx-usd", + "bnb-chain-trx-usd-shared-svr", "bnb-chain-tsla-usd", "bnb-chain-tusd-usd", + "bnb-chain-tusd-usd-shared-svr", "bnb-chain-twt-bnb", + "bnb-chain-twt-bnb-shared-svr", + "bnb-chain-u-usd", "bnb-chain-uni-bnb", "bnb-chain-uni-usd", + "bnb-chain-uni-usd-shared-svr", "bnb-chain-unibtc-btc-exchange-rate", "bnb-chain-usd1-usd", + "bnb-chain-usd1-usd-shared-svr", "bnb-chain-usdc-bnb", "bnb-chain-usdc-usd", + "bnb-chain-usdc-usd-shared-svr", + "bnb-chain-usdc-usd-svr", "bnb-chain-usdd-usdc-exchange-rate", "bnb-chain-usdd-usdt-exchange-rate", "bnb-chain-usde-usd", + "bnb-chain-usde-usd-shared-svr", "bnb-chain-usdt-bnb", "bnb-chain-usdt-usd", + "bnb-chain-usdt-usd-shared-svr", + "bnb-chain-usdt-usd-svr", + "bnb-chain-usdu-por", "bnb-chain-usr-usd", "bnb-chain-vet-usd", "bnb-chain-weeth-eeth-exchange-rate", @@ -1068,6 +1223,7 @@ "bnb-chain-woo-usd", "bnb-chain-wsrusd-rusd-exchange-rate", "bnb-chain-wsteth-steth-exchange-rate", + "bnb-chain-wsteth-steth-exchange-rate-svr", "bnb-chain-wsteth-usd", "bnb-chain-wstusr-stusr-exchange-rate", "bnb-chain-wti-usd", @@ -1076,11 +1232,14 @@ "bnb-chain-xlm-usd", "bnb-chain-xrp-bnb", "bnb-chain-xrp-usd", + "bnb-chain-xrp-usd-shared-svr", "bnb-chain-xsolvbtc-nav", + "bnb-chain-xsolvbtc-solvbtc-exchange-rate-shared-svr", "bnb-chain-xtz-bnb", "bnb-chain-xtz-usd", "bnb-chain-xvs-bnb", "bnb-chain-xvs-usd", + "bnb-chain-xvs-usd-shared-svr", "bnb-chain-ybtc-btc-exchange-rate", "bnb-chain-yeth-eth-exchange-rate", "bnb-chain-yfi-bnb", @@ -1089,6 +1248,7 @@ "bnb-chain-zar-usd", "bnb-chain-zbu-usd", "bob-baby-usd", + "bob-bob-usd", "bob-btc-usd", "bob-eth-usd", "bob-lbtc-btc", @@ -1151,6 +1311,7 @@ "celo-ngn-usd", "celo-ngn-usd-fx", "celo-php-usd", + "celo-stcelo-celo-exchange-rate", "celo-usdc-usd", "celo-usdt-usd", "celo-xof-usd", @@ -1183,6 +1344,7 @@ "ethereum-c3m-eur", "ethereum-cad-usd", "ethereum-calc-xsushi-eth", + "ethereum-calculated-ethplus-usd", "ethereum-cashplus-nav", "ethereum-cbbtc-por", "ethereum-cbbtc-usd", @@ -1197,6 +1359,7 @@ "ethereum-crv-usd", "ethereum-crvusd-usd", "ethereum-cspx-usd", + "ethereum-cusdo-usd", "ethereum-cvx-eth", "ethereum-cvx-usd", "ethereum-dai-eth", @@ -1247,6 +1410,7 @@ "ethereum-link-usd", "ethereum-link-usd-shared-svr", "ethereum-link-usd-svr", + "ethereum-lombard-por", "ethereum-lrc-eth", "ethereum-lseth-eth-exchange-rate", "ethereum-lusd-usd", @@ -1292,6 +1456,8 @@ "ethereum-rsr-usd", "ethereum-rsweth-eth", "ethereum-sand-usd", + "ethereum-savbtc-avbtc-exchange-rate", + "ethereum-savusd-avusd-exchange-rate", "ethereum-sgd-usd", "ethereum-shib-eth", "ethereum-shv-usd", @@ -1354,6 +1520,7 @@ "ethereum-usdt-usd", "ethereum-usdt-usd-shared-svr", "ethereum-usdt-usd-svr", + "ethereum-usdtb-usd", "ethereum-usr-usd", "ethereum-ustb-aum", "ethereum-ustb-nav", @@ -1460,29 +1627,48 @@ "hedera-usdt-usd", "hedera-xrp-usd", "hyperevm-behype-hype-exchange-rate", + "hyperevm-behype-hype-exchange-rate-shared-svr", "hyperevm-btc-usd", + "hyperevm-btc-usd-shared-svr", "hyperevm-eth-usd", + "hyperevm-eth-usd-shared-svr", + "hyperevm-feusd-usd", "hyperevm-hype-usd", + "hyperevm-hype-usd-shared-svr", "hyperevm-hyped-hype-exchange-rate", "hyperevm-khype-hype-exchange-rate", + "hyperevm-khype-hype-exchange-rate-shared-svr", "hyperevm-khype-usd", + "hyperevm-khype-usd-shared-svr", "hyperevm-lhype-khype-exchange-rate", "hyperevm-lhype-sthype-exchange-rate", + "hyperevm-purr-usd", "hyperevm-sol-usd", + "hyperevm-sol-usd-shared-svr", "hyperevm-susde-usd", "hyperevm-thbill-usd", + "hyperevm-thbill-usd-shared-svr", "hyperevm-ubtc-usd", + "hyperevm-ubtc-usd-shared-svr", "hyperevm-ueth-usd", "hyperevm-usdc-usd", + "hyperevm-usdc-usd-shared-svr", "hyperevm-usde-usd", + "hyperevm-usde-usd-shared-svr", "hyperevm-usdh-usd", + "hyperevm-usdh-usd-shared-svr", + "hyperevm-usdhl-usd", "hyperevm-usdt-usd", + "hyperevm-usdt-usd-shared-svr", "hyperevm-usol-usd", + "hyperevm-usol-usd-shared-svr", "hyperevm-usr-usd", "hyperevm-whlp-usdt0-exchange-rate", "hyperevm-wsthype-sthype-exchange-rate", + "hyperevm-wsthype-sthype-exchange-rate-shared-svr", "hyperevm-wsthype-usd", "hyperevm-xaut-usd", + "hyperevm-xaut-usd-shared-svr", "linea-aave-usd", "linea-ageth-eth-exchange-rate", "linea-arb-usd", @@ -1499,6 +1685,7 @@ "linea-linea-usd", "linea-link-eth", "linea-link-usd", + "linea-m-nav-linea", "linea-matic-usd", "linea-musd-usd", "linea-oseth-eth-exchange-rate", @@ -1512,6 +1699,7 @@ "linea-rseth-eth", "linea-rsweth-eth-exchange-rate", "linea-savbtc-avbtc-exchange-rate", + "linea-saveth-aveth-exchange-rate", "linea-savusd-avusd-exchange-rate", "linea-ultraeths-eth-exchange-rate", "linea-usd1-usd", @@ -1543,12 +1731,39 @@ "mantle-real-final-sales-to-private-domestic-purchasers-percentage", "mantle-real-gdp-level", "mantle-real-gdp-percentage", + "mantle-rseth-eth-exchange-rate", "mantle-susde-usd", + "mantle-susde-usde-exchange-rate", + "mantle-syrupusdc-usdc-exchange-rate", + "mantle-syrupusdt-usdt-exchange-rate", "mantle-usd1-usd", "mantle-usdc-usd", "mantle-usde-usd", "mantle-usdt-usd", "mantle-ynethx-eth-exchange-rate", + "megaeth-btc-usd", + "megaeth-btc.b-usd", + "megaeth-eth-usd", + "megaeth-eth-usd-old", + "megaeth-ezeth-eth-exchange-rate", + "megaeth-hype-usd", + "megaeth-lbtc-btc-exchange-rate", + "megaeth-lbtc-usd", + "megaeth-musd-usd", + "megaeth-rseth-eth-exchange-rate", + "megaeth-sol-usd", + "megaeth-stcapusd-capusd-exchange-rate", + "megaeth-susde-usde-exchange-rate", + "megaeth-usdc-usd", + "megaeth-usdc-usd-old", + "megaeth-usde-usd", + "megaeth-usdm-usd", + "megaeth-usdt-usd", + "megaeth-usdt-usd-old", + "megaeth-usdt0-usd", + "megaeth-usdtb-usd", + "megaeth-wsrusd-rusd-exchange-rate", + "megaeth-wsteth-steth-exchange-rate", "metis-aave-usd", "metis-btc-usd", "metis-dai-usd", @@ -1557,6 +1772,7 @@ "metis-frxeth-eth-exchange-rate-low", "metis-link-usd", "metis-metis-usd", + "metis-mimatic-usd", "metis-sfrxeth-frxeth-exchange-rate", "metis-usdc-usd", "metis-usdt-usd", @@ -1591,6 +1807,7 @@ "optimism-ada-usd", "optimism-ageth-eth-exchange-rate", "optimism-algo-usd", + "optimism-ankr-usd", "optimism-ankreth-eth-exchange-rate", "optimism-anon-usd", "optimism-ape-usd", @@ -1621,11 +1838,13 @@ "optimism-etc-usd", "optimism-eth-btc", "optimism-eth-usd", + "optimism-ethx-eth", "optimism-eur-usd", "optimism-ezeth-eth-exchange-rate", "optimism-fil-usd", "optimism-flow-usd", "optimism-frax-usd", + "optimism-ftm-usd", "optimism-fxs-usd", "optimism-gmx-usd", "optimism-grt-usd", @@ -1701,10 +1920,12 @@ "optimism-virtune-avax-etp-por", "optimism-virtune-btc-etp-por", "optimism-virtune-btc-prime-etp-por", + "optimism-virtune-dot-etp-por", "optimism-virtune-link-etp-por", "optimism-virtune-pol-etp-por", "optimism-virtune-sol-etp-por", "optimism-virtune-staked-eth-etp-por", + "optimism-virtune-xlm-etp-por", "optimism-virtune-xrp-etp-por", "optimism-vyusd-usd-exchange-rate", "optimism-wbtc-usd", @@ -1776,6 +1997,7 @@ "polygon-aave-eth", "polygon-aave-usd", "polygon-ada-usd", + "polygon-ageur-usd", "polygon-alcx-usd", "polygon-algo-usd", "polygon-amzn-usd", @@ -1841,6 +2063,7 @@ "polygon-grt-usd", "polygon-hbar-usd", "polygon-icp-usd", + "polygon-idr-usd", "polygon-ils-usd", "polygon-ilv-eth", "polygon-inr-usd", @@ -1868,6 +2091,7 @@ "polygon-pln-usd", "polygon-qnt-usd", "polygon-quick-usd", + "polygon-rcusd+-nav", "polygon-rdnt-usd", "polygon-ryt-nav", "polygon-ryt-polygon", @@ -1918,6 +2142,7 @@ "polygon-yeth-eth-exchange-rate", "polygon-yfi-eth", "polygon-yfi-usd", + "polygon-zar-usd", "polygon-zec-usd", "polygonkatana-ausd-usd", "polygonkatana-btc-usd", @@ -2013,6 +2238,8 @@ "solana-dai-usd", "solana-eth-usd", "solana-eurc-usd", + "solana-jlp-usd", + "solana-jup-usd", "solana-lbtc-btc-exchange-rate", "solana-link-usd", "solana-matic-usd", @@ -2020,9 +2247,11 @@ "solana-msol-usd", "solana-op-usd", "solana-sol-usd", + "solana-solvbtc-btc-exchange-rate", "solana-syrupusdc-usdc-exchange-rate", "solana-usdc-usd", "solana-usdt-usd", + "solana-wbtc-usd", "solana-zbtc-por", "soneium-astr-usd", "soneium-btc-usd", @@ -2090,6 +2319,7 @@ "sonic-ybtc-btc", "sonic-yeth-eth", "sonic-yusd-usd-exchange-rate", + "sonic-zar-usd", "starknet-btc-usd", "starknet-dai-usd", "starknet-eth-usd", diff --git a/.github/scripts/data/detect-data.sh b/.github/scripts/data/detect-data.sh index d48e3f7c068..ae3b9f944b4 100755 --- a/.github/scripts/data/detect-data.sh +++ b/.github/scripts/data/detect-data.sh @@ -156,7 +156,7 @@ node <- + --root-dir $GITHUB_WORKSPACE/.vercel/output/static + --config lychee.toml + '.vercel/output/static/**/*.html' + fail: true + format: markdown + jobSummary: true # Job 4: Check Types typecheck: @@ -173,7 +189,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -205,19 +221,15 @@ jobs: jest: needs: [setup] runs-on: ubuntu-latest - strategy: - matrix: - node-version: [20.x] - fail-fast: false steps: - name: Checkout Repo uses: actions/checkout@v6 - - name: Setup Node.js ${{ matrix.node-version }} + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: ${{ matrix.node-version }} + node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -242,6 +254,6 @@ jobs: if: always() uses: actions/upload-artifact@v5 with: - name: coverage-report-node-${{ matrix.node-version }} + name: coverage-report-node-${{ env.NODE_VERSION }} path: coverage/ retention-days: 30 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4e2f3dac873..25ad8c0628e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ dist/ node_modules/ temp/ +reports/ # logs npm-debug.log* diff --git a/LICENSE b/LICENSE index 764519dc3fa..e7195c674c4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 SmartContract Chainlink Limited SEZC +Copyright (c) 2026 SmartContract Chainlink Limited SEZC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/astro.config.ts b/astro.config.ts index 16ae5388f55..9d551d4f88b 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -15,6 +15,8 @@ import trailingSlashMiddleware from "./src/integrations/trailing-slash-middlewar import redirectsJson from "./src/features/redirects/redirects.json" import tailwind from "@astrojs/tailwind" import { extractCanonicalUrlsWithLanguageVariants } from "./src/utils/sidebar" +import remarkCodeFenceFilename from "./src/lib/markdown/remarkCodeFenceFilename" +import rehypeCodeSampleFences from "./src/lib/markdown/rehypeCodeSampleFences" config() // Load .env file @@ -105,9 +107,13 @@ export default defineConfig({ return item }, }), - mdx(), + // Ensure our fence-meta parser runs for `.mdx` pages (in addition to `markdown.remarkPlugins`). + mdx({ + remarkPlugins: [remarkCodeFenceFilename], + }), ], markdown: { + remarkPlugins: [remarkCodeFenceFilename], rehypePlugins: [ rehypeSlug, // Required for autolink to work properly [ @@ -118,6 +124,7 @@ export default defineConfig({ ], // Wrap tables in div with overflow supported [rehypeWrapAll, { selector: "table", wrapper: "div.overflow-wrapper" }], + rehypeCodeSampleFences, ] as RehypePlugins, syntaxHighlight: "prism", smartypants: false, diff --git a/context7.json b/context7.json new file mode 100644 index 00000000000..89021e03ca0 --- /dev/null +++ b/context7.json @@ -0,0 +1,4 @@ +{ + "url": "https://context7.com/smartcontractkit/documentation", + "public_key": "pk_nsBvFzEpWNJq5XpYfKBFc" +} diff --git a/jest.config.cjs b/jest.config.cjs index fba12927624..74c6196488c 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -13,6 +13,7 @@ module.exports = { extensionsToTreatAsEsm: [".ts", ".tsx"], moduleFileExtensions: ["js", "jsx", "ts", "tsx", "json", "node"], moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", "\\.(css)$": "/src/__mocks__/styleMock.ts", "^~/(.*)$": "/src/$1", "^@api/(.*)$": "/src/pages/api/$1", @@ -29,6 +30,7 @@ module.exports = { "^@variables$": "/src/config/markdown-variables.ts", "^@abi$": "/src/features/abi/index.ts", "^@lib$": "/src/lib/index.ts", + "^@lib/(.*)\\.js$": "/src/lib/$1", "^@lib/(.*)$": "/src/lib/$1", "\\.ya?ml$": "/src/__mocks__/yamlMock.ts", }, diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 00000000000..e0ebbf2d985 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,41 @@ +# Lychee Link Checker Configuration +# https://lychee.cli.rs/ + +# Only check local files (no network requests) +offline = true + +# Check links in code blocks +include_verbatim = true + +# Don't show progress bar (better for CI) +no_progress = true + +# Patterns to exclude from link checking +exclude = [ + # CSS files + 'assets/.*\.css$', + '_astro/.*\.css$', + + # Dynamic pages with query params + '/ccip/directory/.*', + '/data-feeds/price-feeds/addresses\?.*', + '/data-feeds/smartdata/addresses\?.*', + + # Other files + 'sitemap-index\.xml', + '@vite/client', + + # Database connection strings + 'postgresql:', + 'mysql:', +] + +# Paths to exclude from scanning (won't check links on these pages) +exclude_path = [ + 'ccip/api-reference/evm/v162/.*', + 'ccip/api-reference/evm/v163/.*', +] + +# TODO: Re-enable fragment checking once Astro slug generation compatibility is resolved +# include_fragments = true +# Astro's heading ID generation and lychee's GitHub-style kebab-case expectations \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c76e8b670d9..370c2bbe4fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,13 +12,13 @@ "@11ty/eleventy-fetch": "^4.0.1", "@algolia/client-search": "^5.41.0", "@apollo/client": "^3.14.0", - "@astro-community/astro-embed-youtube": "^0.5.9", - "@astrojs/mdx": "^4.3.12", + "@astro-community/astro-embed-youtube": "^0.5.10", + "@astrojs/mdx": "^4.3.13", "@astrojs/partytown": "^2.1.4", "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", + "@astrojs/sitemap": "^3.7.0", "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.2.11", "@chainlink/blocks": "^1.3.1", @@ -31,43 +31,44 @@ "@chainlink/local": "0.2.7-beta", "@chainlink/solana-sdk": "^0.2.2", "@metamask/providers": "^22.1.1", - "@nanostores/persistent": "^1.1.0", + "@nanostores/persistent": "^1.3.3", "@nanostores/preact": "^0.5.2", "@nanostores/react": "^0.8.4", "@openzeppelin/contracts": "5.4.0", - "@solana-program/compute-budget": "^0.11.0", + "@solana-program/compute-budget": "^0.12.0", "@solana-program/system": "^0.10.0", "@solana-program/token": "^0.9.0", - "@solana-program/token-2022": "^0.6.1", - "@solana/kit": "^5.0.0", - "@solana/react": "^5.0.0", + "@solana-program/token-2022": "^0.8.0", + "@solana/kit": "^5.5.1", + "@solana/react": "^5.5.1", "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/wallet-adapter-react": "^0.15.39", "@solana/wallet-adapter-react-ui": "^0.9.39", "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", - "@supabase/supabase-js": "^2.84.0", - "astro": "^5.16.0", + "@supabase/supabase-js": "^2.95.3", + "astro": "^5.17.1", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", "dotenv": "^16.6.1", - "ethers": "^6.15.0", - "focus-trap-react": "^11.0.4", + "ethers": "^6.16.0", + "focus-trap-react": "^11.0.6", "github-slugger": "^2.0.0", - "lodash": "^4.17.21", + "lodash": "^4.17.23", "marked": "^15.0.12", "nanostores": "^0.11.4", + "next": "14.2.35", "pino": "^9.14.0", - "preact": "^10.27.2", - "react-instantsearch": "^7.20.0", + "preact": "^10.28.3", + "react-instantsearch": "^7.23.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", "remark-directive": "^3.0.1", - "swagger-ui-dist": "^5.30.1", - "swagger-ui-react": "^5.30.1", + "swagger-ui-dist": "^5.31.0", + "swagger-ui-react": "^5.31.0", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, @@ -77,11 +78,11 @@ "@project-serum/anchor": "^0.26.0", "@rollup/plugin-yaml": "^4.1.2", "@types/jest": "^29.5.14", - "@types/lodash": "^4.17.21", - "@types/node": "^20.19.25", + "@types/lodash": "^4.17.23", + "@types/node": "^20.19.33", "@types/node-fetch": "^2.6.13", "@types/prismjs": "^1.26.5", - "@types/react": "^19.2.7", + "@types/react": "^19.2.13", "@types/react-dom": "^19.2.3", "@types/swagger-ui-dist": "^3.30.6", "@types/swagger-ui-react": "^5.18.0", @@ -92,31 +93,31 @@ "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-n": "^15.7.0", - "eslint-plugin-prettier": "^5.5.0", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.70.1", + "knip": "^5.83.1", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", - "pino-pretty": "^13.1.2", - "prettier": "^3.5.3", + "pino-pretty": "^13.1.3", + "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-solidity": "^1.4.3", "remark-gfm": "^4.0.0", "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "solhint": "^6.0.1", + "solhint": "^6.0.3", "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", "solhint-plugin-prettier": "^0.1.0", "tailwindcss": "^3.4.18", - "ts-jest": "^29.4.5", + "ts-jest": "^29.4.6", "tsconfig-paths": "^4.2.0", - "tsx": "^4.20.6", + "tsx": "^4.21.0", "typescript": "^5.9.3", "unified": "^11.0.4", - "unist-util-visit": "^5.0.0", + "unist-util-visit": "^5.1.0", "vite": "^6.4.1" }, "engines": { @@ -148,176 +149,121 @@ "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", "license": "MIT" }, - "node_modules/@ai-sdk/gateway": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.15.tgz", - "integrity": "sha512-i1YVKzC1dg9LGvt+GthhD7NlRhz9J4+ZRj3KELU14IZ/MHPsOBiFeEoCCIDLR+3tqT8/+5nIsK3eZ7DFRfMfdw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.17", - "@vercel/oidc": "3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/gateway/node_modules/@vercel/oidc": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", - "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.17.tgz", - "integrity": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/@algolia/abtesting": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.11.0.tgz", - "integrity": "sha512-a7oQ8dwiyoyVmzLY0FcuBqyqcNSq78qlcOtHmNBumRlHCSnXDcuoYGBGPN1F6n8JoGhviDDsIaF/oQrzTzs6Lg==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.14.0.tgz", + "integrity": "sha512-cZfj+1Z1dgrk3YPtNQNt0H9Rr67P8b4M79JjUKGS0d7/EbFbGxGgSu6zby5f22KXo3LT0LZa4O2c6VVbupJuDg==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.45.0.tgz", - "integrity": "sha512-WTW0VZA8xHMbzuQD5b3f41ovKZ0MNTIXkWfm0F2PU+XGcLxmxX15UqODzF2sWab0vSbi3URM1xLhJx+bXbd1eQ==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.48.0.tgz", + "integrity": "sha512-n17WSJ7vazmM6yDkWBAjY12J8ERkW9toOqNgQ1GEZu/Kc4dJDJod1iy+QP5T/UlR3WICgZDi/7a/VX5TY5LAPQ==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.45.0.tgz", - "integrity": "sha512-I3g7VtvG/QJOH3tQO7E7zWTwBfK/nIQXShFLR8RvPgWburZ626JNj332M3wHCYcaAMivN9WJG66S2JNXhm6+Xg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.48.0.tgz", + "integrity": "sha512-v5bMZMEqW9U2l40/tTAaRyn4AKrYLio7KcRuHmLaJtxuJAhvZiE7Y62XIsF070juz4MN3eyvfQmI+y5+OVbZuA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.45.0.tgz", - "integrity": "sha512-/nTqm1tLiPtbUr+8kHKyFiCOfhRfgC+JxLvOCq471gFZZOlsh6VtFRiKI60/zGmHTojFC6B0mD80PB7KeK94og==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.48.0.tgz", + "integrity": "sha512-7H3DgRyi7UByScc0wz7EMrhgNl7fKPDjKX9OcWixLwCj7yrRXDSIzwunykuYUUO7V7HD4s319e15FlJ9CQIIFQ==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.45.0.tgz", - "integrity": "sha512-suQTx/1bRL1g/K2hRtbK3ANmbzaZCi13487sxxmqok+alBDKKw0/TI73ZiHjjFXM2NV52inwwcmW4fUR45206Q==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.48.0.tgz", + "integrity": "sha512-tXmkB6qrIGAXrtRYHQNpfW0ekru/qymV02bjT0w5QGaGw0W91yT+53WB6dTtRRsIrgS30Al6efBvyaEosjZ5uw==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.45.0.tgz", - "integrity": "sha512-CId/dbjpzI3eoUhPU6rt/z4GrRsDesqFISEMOwrqWNSrf4FJhiUIzN42Ac+Gzg69uC0RnzRYy60K1y4Na5VSMw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.48.0.tgz", + "integrity": "sha512-4tXEsrdtcBZbDF73u14Kb3otN+xUdTVGop1tBjict+Rc/FhsJQVIwJIcTrOJqmvhtBfc56Bu65FiVOnpAZCxcw==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.45.0.tgz", - "integrity": "sha512-tjbBKfA8fjAiFtvl9g/MpIPiD6pf3fj7rirVfh1eMIUi8ybHP4ovDzIaE216vHuRXoePQVCkMd2CokKvYq1CLw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.48.0.tgz", + "integrity": "sha512-unzSUwWFpsDrO8935RhMAlyK0Ttua/5XveVIwzfjs5w+GVBsHgIkbOe8VbBJccMU/z1LCwvu1AY3kffuSLAR5Q==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.45.0.tgz", - "integrity": "sha512-nxuCid+Nszs4xqwIMDw11pRJPes2c+Th1yup/+LtpjFH8QWXkr3SirNYSD3OXAeM060HgWWPLA8/Fxk+vwxQOA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.48.0.tgz", + "integrity": "sha512-RB9bKgYTVUiOcEb5bOcZ169jiiVW811dCsJoLT19DcbbFmU4QaK0ghSTssij35QBQ3SCOitXOUrHcGgNVwS7sQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" @@ -330,84 +276,84 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.45.0.tgz", - "integrity": "sha512-t+1doBzhkQTeOOjLHMlm4slmXBhvgtEGQhOmNpMPTnIgWOyZyESWdm+XD984qM4Ej1i9FRh8VttOGrdGnAjAng==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.48.0.tgz", + "integrity": "sha512-rhoSoPu+TDzDpvpk3cY/pYgbeWXr23DxnAIH/AkN0dUC+GCnVIeNSQkLaJ+CL4NZ51cjLIjksrzb4KC5Xu+ktw==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.45.0.tgz", - "integrity": "sha512-IaX3ZX1A/0wlgWZue+1BNWlq5xtJgsRo7uUk/aSiYD7lPbJ7dFuZ+yTLFLKgbl4O0QcyHTj1/mSBj9ryF1Lizg==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.48.0.tgz", + "integrity": "sha512-aSe6jKvWt+8VdjOaq2ERtsXp9+qMXNJ3mTyTc1VMhNfgPl7ArOhRMRSQ8QBnY8ZL4yV5Xpezb7lAg8pdGrrulg==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.45.0.tgz", - "integrity": "sha512-1jeMLoOhkgezCCPsOqkScwYzAAc1Jr5T2hisZl0s32D94ZV7d1OHozBukgOjf8Dw+6Hgi6j52jlAdUWTtkX9Mg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.48.0.tgz", + "integrity": "sha512-p9tfI1bimAaZrdiVExL/dDyGUZ8gyiSHsktP1ZWGzt5hXpM3nhv4tSjyHtXjEKtA0UvsaHKwSfFE8aAAm1eIQA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/client-common": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.45.0.tgz", - "integrity": "sha512-46FIoUkQ9N7wq4/YkHS5/W9Yjm4Ab+q5kfbahdyMpkBPJ7IBlwuNEGnWUZIQ6JfUZuJVojRujPRHMihX4awUMg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.48.0.tgz", + "integrity": "sha512-XshyfpsQB7BLnHseMinp3fVHOGlTv6uEHOzNK/3XrEF9mjxoZAcdVfY1OCXObfwRWX5qXZOq8FnrndFd44iVsQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.45.0.tgz", - "integrity": "sha512-XFTSAtCwy4HdBhSReN2rhSyH/nZOM3q3qe5ERG2FLbYId62heIlJBGVyAPRbltRwNlotlydbvSJ+SQ0ruWC2cw==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.48.0.tgz", + "integrity": "sha512-Q4XNSVQU89bKNAPuvzSYqTH9AcbOOiIo6AeYMQTxgSJ2+uvT78CLPMG89RIIloYuAtSfE07s40OLV50++l1Bbw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.45.0.tgz", - "integrity": "sha512-8mTg6lHx5i44raCU52APsu0EqMsdm4+7Hch/e4ZsYZw0hzwkuaMFh826ngnkYf9XOl58nHoou63aZ874m8AbpQ==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.48.0.tgz", + "integrity": "sha512-ZgxV2+5qt3NLeUYBTsi6PLyHcENQWC0iFppFZekHSEDA2wcLdTUjnaJzimTEULHIvJuLRCkUs4JABdhuJktEag==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.48.0" }, "engines": { "node": ">= 14.0.0" @@ -547,15 +493,12 @@ "license": "MIT" }, "node_modules/@astro-community/astro-embed-youtube": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-youtube/-/astro-embed-youtube-0.5.9.tgz", - "integrity": "sha512-8Uk2SKbyZVb+jxwqSAMoEpQo+063XYwCI3yRy9cbkyHpu09mDabGZNTF5XrL8CKr3NtR5haBkeYK/kSuKUkJ/g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-youtube/-/astro-embed-youtube-0.5.10.tgz", + "integrity": "sha512-hVlx77KQLjKzElVQnrU5znQ5/E60keVSAPrhuWvQQHuqva5auJtt8YBpOThkwDMuEKXjQybEF1/3C07RZ8MAOQ==", "license": "MIT", "dependencies": { "lite-youtube-embed": "^0.3.4" - }, - "peerDependencies": { - "astro": "^2.0.0 || ^3.0.0-beta || ^4.0.0-beta || ^5.0.0-beta" } }, "node_modules/@astrojs/compiler": { @@ -571,9 +514,9 @@ "license": "MIT" }, "node_modules/@astrojs/markdown-remark": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.9.tgz", - "integrity": "sha512-hX2cLC/KW74Io1zIbn92kI482j9J7LleBLGCVU9EP3BeH5MVrnFawOnqD0t/q6D1Z+ZNeQG2gNKMslCcO36wng==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", "license": "MIT", "dependencies": { "@astrojs/internal-helpers": "0.7.5", @@ -582,7 +525,7 @@ "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", @@ -590,8 +533,8 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", - "shiki": "^3.13.0", - "smol-toml": "^1.4.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", @@ -600,12 +543,12 @@ } }, "node_modules/@astrojs/mdx": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.12.tgz", - "integrity": "sha512-pL3CVPtuQrPnDhWjy7zqbOibNyPaxP4VpQS8T8spwKqKzauJ4yoKyNkVTD8jrP7EAJHmBhZ7PTmUGZqOpKKp8g==", + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", "license": "MIT", "dependencies": { - "@astrojs/markdown-remark": "6.3.9", + "@astrojs/markdown-remark": "6.3.10", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", @@ -687,12 +630,12 @@ } }, "node_modules/@astrojs/sitemap": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.6.0.tgz", - "integrity": "sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", "license": "MIT", "dependencies": { - "sitemap": "^8.0.0", + "sitemap": "^8.0.2", "stream-replace-string": "^2.0.0", "zod": "^3.25.76" } @@ -1379,12 +1322,12 @@ "peer": true }, "node_modules/@capsizecss/unpack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-3.0.1.tgz", - "integrity": "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", "license": "MIT", "dependencies": { - "fontkit": "^2.0.2" + "fontkitten": "^1.0.0" }, "engines": { "node": ">=18" @@ -1844,42 +1787,6 @@ } } }, - "node_modules/@chainlink/blocks/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@chainlink/blocks/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@chainlink/blocks/node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -1897,18 +1804,6 @@ "node": ">=10" } }, - "node_modules/@chainlink/blocks/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/@chainlink/blocks/node_modules/tailwindcss": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", @@ -1997,42 +1892,6 @@ "next": "^14.2.4" } }, - "node_modules/@chainlink/components/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@chainlink/components/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@chainlink/components/node_modules/ethers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", @@ -2070,18 +1929,6 @@ "node": ">=10" } }, - "node_modules/@chainlink/components/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/@chainlink/components/node_modules/tailwindcss": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", @@ -2379,25 +2226,6 @@ "bn.js": "^5.2.1" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/bytes": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", - "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/constants": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", @@ -2557,22 +2385,6 @@ "js-sha3": "0.8.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/logger": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", - "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/networks": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", @@ -2592,46 +2404,6 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/pbkdf2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", - "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/sha2": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/properties": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/providers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", @@ -2712,28 +2484,6 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/sha2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", - "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "hash.js": "1.1.7" - } - }, "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/signing-key": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", @@ -3307,25 +3057,6 @@ "bn.js": "^5.2.1" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/bytes": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", - "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/constants": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", @@ -3485,22 +3216,6 @@ "js-sha3": "0.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/logger": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", - "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/networks": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", @@ -3520,46 +3235,6 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/pbkdf2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", - "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/sha2": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/properties": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/providers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", @@ -3640,28 +3315,6 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/sha2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", - "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "hash.js": "1.1.7" - } - }, "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/signing-key": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", @@ -4737,42 +4390,6 @@ "tailwindcss-animate": "1.0.7" } }, - "node_modules/@chainlink/design-system/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@chainlink/design-system/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@chainlink/design-system/node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -4790,18 +4407,6 @@ "node": ">=10" } }, - "node_modules/@chainlink/design-system/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/@chainlink/design-system/node_modules/tailwindcss": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", @@ -8987,9 +8592,9 @@ } }, "node_modules/@nanostores/persistent": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@nanostores/persistent/-/persistent-1.2.0.tgz", - "integrity": "sha512-kf5WOLpVI9Pk+AwXHIax4in3pesNe8299BEGQ2H8kgI05SZw7KKWCDv7bt2FOlND8E5y7rO5PRW34q0UCAl/DA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@nanostores/persistent/-/persistent-1.3.3.tgz", + "integrity": "sha512-+b4I8xrmjhKE3hQ9V7/b4Xa+MBMkM2P4Ulv33zFEF/+2Hucsb24vTjYiWR8R97y8YdRptmRKlL5Qwy0q1Jj5nQ==", "funding": [ { "type": "github", @@ -9043,24 +8648,23 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", + "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "node_modules/@next/env": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz", - "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==", - "license": "MIT", - "peer": true + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", + "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.33", @@ -9074,7 +8678,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9091,7 +8694,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9108,7 +8710,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9125,7 +8726,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9142,7 +8742,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9159,7 +8758,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9176,7 +8774,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9193,7 +8790,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9210,7 +8806,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9299,15 +8894,6 @@ "integrity": "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==", "license": "MIT" }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@openzeppelin/contracts": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.4.0.tgz", @@ -9362,9 +8948,9 @@ "license": "MIT" }, "node_modules/@oxc-resolver/binding-android-arm-eabi": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.14.0.tgz", - "integrity": "sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.15.0.tgz", + "integrity": "sha512-Q+lWuFfq7whNelNJIP1dhXaVz4zO9Tu77GcQHyxDWh3MaCoO2Bisphgzmsh4ZoUe2zIchQh6OvQL99GlWHg9Tw==", "cpu": [ "arm" ], @@ -9376,9 +8962,9 @@ ] }, "node_modules/@oxc-resolver/binding-android-arm64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.14.0.tgz", - "integrity": "sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.15.0.tgz", + "integrity": "sha512-vbdBttesHR0W1oJaxgWVTboyMUuu+VnPsHXJ6jrXf4czELzB6GIg5DrmlyhAmFBhjwov+yJH/DfTnHS+2sDgOw==", "cpu": [ "arm64" ], @@ -9390,9 +8976,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.14.0.tgz", - "integrity": "sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.15.0.tgz", + "integrity": "sha512-R67lsOe1UzNjqVBCwCZX1rlItTsj/cVtBw4Uy19CvTicqEWvwaTn8t34zLD75LQwDDPCY3C8n7NbD+LIdw+ZoA==", "cpu": [ "arm64" ], @@ -9404,9 +8990,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.14.0.tgz", - "integrity": "sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.15.0.tgz", + "integrity": "sha512-77mya5F8WV0EtCxI0MlVZcqkYlaQpfNwl/tZlfg4jRsoLpFbaTeWv75hFm6TE84WULVlJtSgvf7DhoWBxp9+ZQ==", "cpu": [ "x64" ], @@ -9418,9 +9004,9 @@ ] }, "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.14.0.tgz", - "integrity": "sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.15.0.tgz", + "integrity": "sha512-X1Sz7m5PC+6D3KWIDXMUtux+0Imj6HfHGdBStSvgdI60OravzI1t83eyn6eN0LPTrynuPrUgjk7tOnOsBzSWHw==", "cpu": [ "x64" ], @@ -9432,9 +9018,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.14.0.tgz", - "integrity": "sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.15.0.tgz", + "integrity": "sha512-L1x/wCaIRre+18I4cH/lTqSAymlV0k4HqfSYNNuI9oeL28Ks86lI6O5VfYL6sxxWYgjuWB98gNGo7tq7d4GarQ==", "cpu": [ "arm" ], @@ -9446,9 +9032,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.14.0.tgz", - "integrity": "sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.15.0.tgz", + "integrity": "sha512-abGXd/zMGa0tH8nKlAXdOnRy4G7jZmkU0J85kMKWns161bxIgGn/j7zxqh3DKEW98wAzzU9GofZMJ0P5YCVPVw==", "cpu": [ "arm" ], @@ -9460,9 +9046,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.14.0.tgz", - "integrity": "sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.15.0.tgz", + "integrity": "sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg==", "cpu": [ "arm64" ], @@ -9474,9 +9060,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.14.0.tgz", - "integrity": "sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.15.0.tgz", + "integrity": "sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g==", "cpu": [ "arm64" ], @@ -9488,9 +9074,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.14.0.tgz", - "integrity": "sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.15.0.tgz", + "integrity": "sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg==", "cpu": [ "ppc64" ], @@ -9502,9 +9088,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.14.0.tgz", - "integrity": "sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.15.0.tgz", + "integrity": "sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg==", "cpu": [ "riscv64" ], @@ -9516,9 +9102,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.14.0.tgz", - "integrity": "sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.15.0.tgz", + "integrity": "sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg==", "cpu": [ "riscv64" ], @@ -9530,9 +9116,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.14.0.tgz", - "integrity": "sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.15.0.tgz", + "integrity": "sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q==", "cpu": [ "s390x" ], @@ -9544,9 +9130,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.14.0.tgz", - "integrity": "sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.15.0.tgz", + "integrity": "sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg==", "cpu": [ "x64" ], @@ -9558,9 +9144,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.14.0.tgz", - "integrity": "sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.15.0.tgz", + "integrity": "sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg==", "cpu": [ "x64" ], @@ -9571,10 +9157,24 @@ "linux" ] }, + "node_modules/@oxc-resolver/binding-openharmony-arm64": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.15.0.tgz", + "integrity": "sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.14.0.tgz", - "integrity": "sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.15.0.tgz", + "integrity": "sha512-q5rn2eIMQLuc/AVGR2rQKb2EVlgreATGG8xXg8f4XbbYCVgpxaq+dgMbiPStyNywW1MH8VU2T09UEm30UtOQvg==", "cpu": [ "wasm32" ], @@ -9582,16 +9182,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.7" + "@napi-rs/wasm-runtime": "^1.1.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.14.0.tgz", - "integrity": "sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.15.0.tgz", + "integrity": "sha512-yCAh2RWjU/8wWTxQDgGPgzV9QBv0/Ojb5ej1c/58iOjyTuy/J1ZQtYi2SpULjKmwIxLJdTiCHpMilauWimE31w==", "cpu": [ "arm64" ], @@ -9603,9 +9203,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-ia32-msvc": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.14.0.tgz", - "integrity": "sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.15.0.tgz", + "integrity": "sha512-lmXKb6lvA6M6QIbtYfgjd+AryJqExZVSY2bfECC18OPu7Lv1mHFF171Mai5l9hG3r4IhHPPIwT10EHoilSCYeA==", "cpu": [ "ia32" ], @@ -9617,9 +9217,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.14.0.tgz", - "integrity": "sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.15.0.tgz", + "integrity": "sha512-HZsfne0s/tGOcJK9ZdTGxsNU2P/dH0Shf0jqrPvsC6wX0Wk+6AyhSpHFLQCnLOuFQiHHU0ePfM8iYsoJb5hHpQ==", "cpu": [ "x64" ], @@ -14571,60 +14171,60 @@ } }, "node_modules/@shikijs/core": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.15.0.tgz", - "integrity": "sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.21.0.tgz", + "integrity": "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0", + "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "node_modules/@shikijs/engine-javascript": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.15.0.tgz", - "integrity": "sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.21.0.tgz", + "integrity": "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0", + "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.3" + "oniguruma-to-es": "^4.3.4" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.15.0.tgz", - "integrity": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz", + "integrity": "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0", + "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.15.0.tgz", - "integrity": "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.21.0.tgz", + "integrity": "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0" + "@shikijs/types": "3.21.0" } }, "node_modules/@shikijs/themes": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.15.0.tgz", - "integrity": "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.21.0.tgz", + "integrity": "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0" + "@shikijs/types": "3.21.0" } }, "node_modules/@shikijs/types": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.15.0.tgz", - "integrity": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.21.0.tgz", + "integrity": "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -15291,10 +14891,157 @@ "react-native": "^0.0.0-0 || >=0.60 <1.0" } }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/assets-registry": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz", + "integrity": "sha512-AT7/T6UwQqO39bt/4UL5EXvidmrddXrt0yJa7ENXndAv+8yBzMsZn6fyiax6+ERMt9GLzAECikv3lj22cn2wJA==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/codegen": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", + "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/community-cli-plugin": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.1.tgz", + "integrity": "sha512-FqR1ftydr08PYlRbrDF06eRiiiGOK/hNmz5husv19sK6iN5nHj1SMaCIVjkH/a5vryxEddyFhU6PzO/uf4kOHg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@react-native/dev-middleware": "0.83.1", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.83.3", + "metro-config": "^0.83.3", + "metro-core": "^0.83.3", + "semver": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/debugger-frontend": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.1.tgz", + "integrity": "sha512-01Rn3goubFvPjHXONooLmsW0FLxJDKIUJNOlOS0cPtmmTIx9YIjxhe/DxwHXGk7OnULd7yl3aYy7WlBsEd5Xmg==", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/debugger-shell": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.1.tgz", + "integrity": "sha512-d+0w446Hxth5OP/cBHSSxOEpbj13p2zToUy6e5e3tTERNJ8ueGlW7iGwGTrSymNDgXXFjErX+dY4P4/3WokPIQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/dev-middleware": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.1.tgz", + "integrity": "sha512-QJaSfNRzj3Lp7MmlCRgSBlt1XZ38xaBNXypXAp/3H3OdFifnTZOeYOpFmcpjcXYnDqkxetuwZg8VL65SQhB8dg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.83.1", + "@react-native/debugger-shell": "0.83.1", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^7.5.10" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/gradle-plugin": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.1.tgz", + "integrity": "sha512-6ESDnwevp1CdvvxHNgXluil5OkqbjkJAkVy7SlpFsMGmVhrSxNAgD09SSRxMNdKsnLtzIvMsFCzyHLsU/S4PtQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/js-polyfills": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.1.tgz", + "integrity": "sha512-qgPpdWn/c5laA+3WoJ6Fak8uOm7CG50nBsLlPsF8kbT7rUHIVB9WaP6+GPsoKV/H15koW7jKuLRoNVT7c3Ht3w==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/normalize-colors": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.1.tgz", + "integrity": "sha512-84feABbmeWo1kg81726UOlMKAhcQyFXYz2SjRKYkS78QmfhVDhJ2o/ps1VjhFfBz0i/scDwT1XNv9GwmRIghkg==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/virtualized-lists": { - "version": "0.82.1", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.1.tgz", - "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.1.tgz", + "integrity": "sha512-MdmoAbQUTOdicCocm5XAFDJWsswxk7hxa6ALnm6Y88p01HFML0W593hAn6qOt9q6IM1KbAcebtH6oOd4gcQy8w==", "license": "MIT", "optional": true, "peer": true, @@ -15306,7 +15053,7 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.1", + "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, @@ -15426,6 +15173,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/hermes-compiler": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz", + "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", @@ -15530,9 +15285,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "optional": true, "peer": true, @@ -15541,21 +15296,21 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/react-native": { - "version": "0.82.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.82.1.tgz", - "integrity": "sha512-tFAqcU7Z4g49xf/KnyCEzI4nRTu1Opcx05Ov2helr8ZTg1z7AJR/3sr2rZ+AAVlAs2IXk+B0WOxXGmdD3+4czA==", + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.1.tgz", + "integrity": "sha512-mL1q5HPq5cWseVhWRLl+Fwvi5z1UO+3vGOpjr+sHFwcUletPRZ5Kv+d0tUfqHmvi73/53NjlQqX1Pyn4GguUfA==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.82.1", - "@react-native/codegen": "0.82.1", - "@react-native/community-cli-plugin": "0.82.1", - "@react-native/gradle-plugin": "0.82.1", - "@react-native/js-polyfills": "0.82.1", - "@react-native/normalize-colors": "0.82.1", - "@react-native/virtualized-lists": "0.82.1", + "@react-native/assets-registry": "0.83.1", + "@react-native/codegen": "0.83.1", + "@react-native/community-cli-plugin": "0.83.1", + "@react-native/gradle-plugin": "0.83.1", + "@react-native/js-polyfills": "0.83.1", + "@react-native/normalize-colors": "0.83.1", + "@react-native/virtualized-lists": "0.83.1", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", @@ -15565,23 +15320,23 @@ "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", - "hermes-compiler": "0.0.0", + "hermes-compiler": "0.14.0", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.1", - "metro-source-map": "^0.83.1", + "metro-runtime": "^0.83.3", + "metro-source-map": "^0.83.3", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", + "scheduler": "0.27.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", + "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { @@ -15592,7 +15347,7 @@ }, "peerDependencies": { "@types/react": "^19.1.1", - "react": "^19.1.1" + "react": "^19.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -15612,9 +15367,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT", "optional": true, "peer": true @@ -15674,14 +15429,26 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "optional": true, "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@solana-mobile/wallet-standard-mobile": { @@ -16244,9 +16011,9 @@ } }, "node_modules/@solana-program/compute-budget": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.11.0.tgz", - "integrity": "sha512-7f1ePqB/eURkTwTOO9TNIdUXZcyrZoX3Uy2hNo7cXMfNhPFWp9AVgIyRNBc2jf15sdUa9gNpW+PfP2iV8AYAaw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.12.0.tgz", + "integrity": "sha512-ysHNVfctUyuY9+mHzJqt97en9ly2quR4n1pvJMQjYf4olwoCqB7+E9b+XZmlj91lFQuAs5z48aw5qDekg78DbQ==", "license": "Apache-2.0", "peerDependencies": { "@solana/kit": "^5.0" @@ -16271,9 +16038,9 @@ } }, "node_modules/@solana-program/token-2022": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@solana-program/token-2022/-/token-2022-0.6.1.tgz", - "integrity": "sha512-Ex02cruDMGfBMvZZCrggVR45vdQQSI/unHVpt/7HPt/IwFYB4eTlXtO8otYZyqV/ce5GqZ8S6uwyRf0zy6fdbA==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@solana-program/token-2022/-/token-2022-0.8.0.tgz", + "integrity": "sha512-2K/eJjGJQ1LPTCdbytfleTcwyZBjojPIzu/vsvTxixwRxCgsEMvu+gNjvfxo/mi2liRHp0xsm2MR4XQJTM2OVQ==", "license": "Apache-2.0", "peerDependencies": { "@solana/kit": "^5.0", @@ -16281,57 +16048,72 @@ } }, "node_modules/@solana/accounts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.0.0.tgz", - "integrity": "sha512-0JzBdEobgp8NBdhhu+GgwNDh7e8KkHDsSTVZAnNQgvT3taOz0Mwv5E48MuEeDhW6DLFwWVAx/FO3pvibG/NGwA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.5.1.tgz", + "integrity": "sha512-TfOY9xixg5rizABuLVuZ9XI2x2tmWUC/OoN556xwfDlhBHBjKfszicYYOyD6nbFmwTGYarCmyGIdteXxTXIdhQ==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/rpc-spec": "5.0.0", - "@solana/rpc-types": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/rpc-spec": "5.5.1", + "@solana/rpc-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/addresses": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-5.0.0.tgz", - "integrity": "sha512-bVk+khc1ZZQHMri25csosM/ikuyPcB/CZidDM/ZMBX0CoJErpHJnmcID5mYOmv4/UHbqo2OANuEaGcFO0Q37sw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-5.5.1.tgz", + "integrity": "sha512-5xoah3Q9G30HQghu/9BiHLb5pzlPKRC3zydQDmE3O9H//WfayxTFppsUDCL6FjYUHqj/wzK6CWHySglc2RkpdA==", "license": "MIT", "dependencies": { - "@solana/assertions": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/nominal-types": "5.0.0" + "@solana/assertions": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/nominal-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/assertions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-5.0.0.tgz", - "integrity": "sha512-2kIykk90kYciQW6bp+KaE6jRd1Y2CgHPeJxxlc5chQnjhoG6eiD8VXvocs6AvqPTht0p/SoEj9jH5tT4oG/bcg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-5.5.1.tgz", + "integrity": "sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0" + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/buffer-layout": { @@ -16347,98 +16129,126 @@ } }, "node_modules/@solana/codecs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-5.0.0.tgz", - "integrity": "sha512-KOw0gFUSBxIMDWLJ3AkVFkEci91dw0Rpx3C6y83Our7fSW+SEP8vRZklCElieYR85LHVB1QIEhoeHR7rc+Ifkw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-5.5.1.tgz", + "integrity": "sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/codecs-data-structures": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/options": "5.0.0" + "@solana/codecs-core": "5.5.1", + "@solana/codecs-data-structures": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/options": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/codecs-core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-5.0.0.tgz", - "integrity": "sha512-rCG2d8OaamVF2/J//YyCgDqNJpUytVVltw9C8mJtEz5c6Se/LR6BFuG8g4xeJswq/ab4RFk5/HFdgbvNjKgQjA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-5.5.1.tgz", + "integrity": "sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0" + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/codecs-data-structures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-5.0.0.tgz", - "integrity": "sha512-y503Pqmv0LHcfcf0vQJGaxDvydQJbyCo8nK3nxn56EhFj5lBQ1NWb3WvTd83epigwuZurW2MhJARrpikfhQglQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-5.5.1.tgz", + "integrity": "sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/codecs-numbers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-5.0.0.tgz", - "integrity": "sha512-a2+skRLuUK02f/XFe4L0e1+wHCyfK25PkyseFps1v1l4pvevukFwth/EhSyrs6w5CsTJRVoR7MuE3E00PM4egw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-5.5.1.tgz", + "integrity": "sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.5.1", + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/codecs-strings": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-5.0.0.tgz", - "integrity": "sha512-ALkRwpV8bGR6qjAYw0YXZwp2YI4wzvKOJGmx04Ut8gMdbaUx7qOcJkhEQKI6ZVC3lAWSIS1N1wGccUZDwvfKxw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-5.5.1.tgz", + "integrity": "sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "fastestsmallesttextencoderdecoder": { + "optional": true + }, + "typescript": { + "optional": true + } } }, "node_modules/@solana/errors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-5.0.0.tgz", - "integrity": "sha512-gTuhzO6E+ydfAAzqmqdPcvFyJwAzFKKIrqtnZPpgAuomcPYu+HSo0tuwSM/cTX0djmHt+GoOsf/julph+nvs2w==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-5.5.1.tgz", + "integrity": "sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==", "license": "MIT", "dependencies": { "chalk": "5.6.2", - "commander": "14.0.1" + "commander": "14.0.2" }, "bin": { "errors": "bin/cli.mjs" @@ -16447,7 +16257,12 @@ "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/errors/node_modules/chalk": { @@ -16462,192 +16277,300 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@solana/errors/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/@solana/fast-stable-stringify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-5.0.0.tgz", - "integrity": "sha512-sGTbu7a4/olL+8EIOOJ7IZjzqOOpCJcK1UaVJ6015sRgo9vwGf4jg9KtXEYv5LVhLCTYmAb50L4BaIUcBph/Ig==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-5.5.1.tgz", + "integrity": "sha512-Ni7s2FN33zTzhTFgRjEbOVFO+UAmK8qi3Iu0/GRFYK4jN696OjKHnboSQH/EacQ+yGqS54bfxf409wU5dsLLCw==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/functional": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-5.0.0.tgz", - "integrity": "sha512-UNBrpfzBL4dKD2iucjNnrkFbnjz5ZYDu2OvrIBAcCSQsxxgHMamUj1n3EDe6kl1us49YG1r05Ho8QLqNrbkVbw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-5.5.1.tgz", + "integrity": "sha512-tTHoJcEQq3gQx5qsdsDJ0LEJeFzwNpXD80xApW9o/PPoCNimI3SALkZl+zNW8VnxRrV3l3yYvfHWBKe/X3WG3w==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/instruction-plans": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-5.0.0.tgz", - "integrity": "sha512-n9oFOMFUPYKEhsXzrXT97QBQ2WvOTar+5SFEj/IOtRuCn4gl2kh0369cjXZpFwUdE3tmKr1zfYFNwbtiNx5pvg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-5.5.1.tgz", + "integrity": "sha512-7z3CB7YMcFKuVvgcnNY8bY6IsZ8LG61Iytbz7HpNVGX2u1RthOs1tRW8luTzSG1MPL0Ox7afyAVMYeFqSPHnaQ==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/instructions": "5.0.0", - "@solana/promises": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/instructions": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/promises": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/instructions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-5.0.0.tgz", - "integrity": "sha512-12dbrmwERT1o6NTr/Uvrjj/ZsiteSXoT5Gi+dnjIeRNHWg9H+gEFuFzJvTDVKlNg34CZ71xdvbVdbV0V8gKGvg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-5.5.1.tgz", + "integrity": "sha512-h0G1CG6S+gUUSt0eo6rOtsaXRBwCq1+Js2a+Ps9Bzk9q7YHNFA75/X0NWugWLgC92waRp66hrjMTiYYnLBoWOQ==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.5.1", + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-5.0.0.tgz", - "integrity": "sha512-kWkR7NslpTttk5i1BhBNCDtVQDkEtgkdsM3Jp9TGPk0GFjBjBwrQStw3vvwLe8itEIvRFGFZU6JHEk8HLS0WLQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-5.5.1.tgz", + "integrity": "sha512-KRD61cL7CRL+b4r/eB9dEoVxIf/2EJ1Pm1DmRYhtSUAJD2dJ5Xw8QFuehobOGm9URqQ7gaQl+Fkc1qvDlsWqKg==", "license": "MIT", "dependencies": { - "@solana/assertions": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/nominal-types": "5.0.0" + "@solana/assertions": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/nominal-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/kit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.0.0.tgz", - "integrity": "sha512-3ahtzmmMgU+1l2YMhQJSKKm14IdvCycOE/m4XNMu/4icBIptmBgZxrmgRpPHqBilBa+Krp/hBuTg4HWl9IAgWw==", - "license": "MIT", - "dependencies": { - "@solana/accounts": "5.0.0", - "@solana/addresses": "5.0.0", - "@solana/codecs": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/instruction-plans": "5.0.0", - "@solana/instructions": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/programs": "5.0.0", - "@solana/rpc": "5.0.0", - "@solana/rpc-parsed-types": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", - "@solana/rpc-subscriptions": "5.0.0", - "@solana/rpc-types": "5.0.0", - "@solana/signers": "5.0.0", - "@solana/sysvars": "5.0.0", - "@solana/transaction-confirmation": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0" + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.5.1.tgz", + "integrity": "sha512-irKUGiV2yRoyf+4eGQ/ZeCRxa43yjFEL1DUI5B0DkcfZw3cr0VJtVJnrG8OtVF01vT0OUfYOcUn6zJW5TROHvQ==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "5.5.1", + "@solana/addresses": "5.5.1", + "@solana/codecs": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/instruction-plans": "5.5.1", + "@solana/instructions": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/offchain-messages": "5.5.1", + "@solana/plugin-core": "5.5.1", + "@solana/programs": "5.5.1", + "@solana/rpc": "5.5.1", + "@solana/rpc-api": "5.5.1", + "@solana/rpc-parsed-types": "5.5.1", + "@solana/rpc-spec-types": "5.5.1", + "@solana/rpc-subscriptions": "5.5.1", + "@solana/rpc-types": "5.5.1", + "@solana/signers": "5.5.1", + "@solana/sysvars": "5.5.1", + "@solana/transaction-confirmation": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/nominal-types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-5.0.0.tgz", - "integrity": "sha512-Qn7xH4UG2rDAv+wAyheP4jWvX3oQmbZ/woxFZwug7PaRLvyjUswGr38Hil+SjiQyFDo+un1UqWM9N9yusUeeZQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-5.5.1.tgz", + "integrity": "sha512-I1ImR+kfrLFxN5z22UDiTWLdRZeKtU0J/pkWkO8qm/8WxveiwdIv4hooi8pb6JnlR4mSrWhq0pCIOxDYrL9GIQ==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/offchain-messages": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/offchain-messages/-/offchain-messages-5.5.1.tgz", + "integrity": "sha512-g+xHH95prTU+KujtbOzj8wn+C7ZNoiLhf3hj6nYq3MTyxOXtBEysguc97jJveUZG0K97aIKG6xVUlMutg5yxhw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-data-structures": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/nominal-types": "5.5.1" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/options": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-5.0.0.tgz", - "integrity": "sha512-ezHVBFb9FXVSn8LUVRD2tLb6fejU0x8KtGEYyCYh0J0pQuXSITV0IQCjcEopvu/ZxWdXOJyzjvmymnhz90on5A==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-5.5.1.tgz", + "integrity": "sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/codecs-data-structures": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.5.1", + "@solana/codecs-data-structures": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/plugin-core": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/plugin-core/-/plugin-core-5.5.1.tgz", + "integrity": "sha512-VUZl30lDQFJeiSyNfzU1EjYt2QZvoBFKEwjn1lilUJw7KgqD5z7mbV7diJhT+dLFs36i0OsjXvq5kSygn8YJ3A==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/programs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-5.0.0.tgz", - "integrity": "sha512-BKOfBDrSUCJGZ+qKk2aFLu0nU9/84o6z/VDCJkLjaNNuTv8nOlSYq5flNzo1eyJmnpyW372qNvqqRN3AS23+FQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-5.5.1.tgz", + "integrity": "sha512-7U9kn0Jsx1NuBLn5HRTFYh78MV4XN145Yc3WP/q5BlqAVNlMoU9coG5IUTJIG847TUqC1lRto3Dnpwm6T4YRpA==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/promises": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-5.0.0.tgz", - "integrity": "sha512-Qmg3UfYfWINEUvBQL3DkPOq34tTg5cfrkPlDtJmi8RVifsPqb6hksbKZGu7ASLZohxIDGmnYQY6oELI7Me+5yw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-5.5.1.tgz", + "integrity": "sha512-T9lfuUYkGykJmppEcssNiCf6yiYQxJkhiLPP+pyAc2z84/7r3UVIb2tNJk4A9sucS66pzJnVHZKcZVGUUp6wzA==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/react": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/react/-/react-5.0.0.tgz", - "integrity": "sha512-OY5WsmFGxRCXuysG1uy9WmL3DlYOKwjvwynstXWbi+aks804BidBaTcyM9oxSvsbH3rHzCK/MtHH/ux0AGQ5Qg==", - "license": "MIT", - "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/promises": "5.0.0", - "@solana/signers": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/react/-/react-5.5.1.tgz", + "integrity": "sha512-kJE6XWWXnf74wTXrfWDRchfZ9WgI1ii1WsIftUd44rN1UP/C4sqrf9ltbr/u3j8OrErI3MEt3coyphq3gPicVg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/promises": "5.5.1", + "@solana/signers": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1", "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", "@wallet-standard/errors": "^0.1.1", + "@wallet-standard/react": "^1.0.1", "@wallet-standard/ui": "^1.0.1", "@wallet-standard/ui-registry": "^1.0.1" }, @@ -16656,362 +16579,458 @@ }, "peerDependencies": { "react": ">=18" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, "node_modules/@solana/rpc": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-5.0.0.tgz", - "integrity": "sha512-Myx/ZBmMHkgh9Di3tLzc+vd30f+6YC1JXr9+YmIHKEeqN/+iTHkDJU2E/hGRLy8vTOBOU7+2466A+dLnSVuGkg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-5.5.1.tgz", + "integrity": "sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/fast-stable-stringify": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/rpc-api": "5.0.0", - "@solana/rpc-spec": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", - "@solana/rpc-transformers": "5.0.0", - "@solana/rpc-transport-http": "5.0.0", - "@solana/rpc-types": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/fast-stable-stringify": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/rpc-api": "5.5.1", + "@solana/rpc-spec": "5.5.1", + "@solana/rpc-spec-types": "5.5.1", + "@solana/rpc-transformers": "5.5.1", + "@solana/rpc-transport-http": "5.5.1", + "@solana/rpc-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-api": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-5.0.0.tgz", - "integrity": "sha512-IJbZZnX2B1ldXPok1NhneXTYq9ZvdJbE5Pryr03pZTlPJaWGqDcZuQ14nwR4s6PoUUgdT+p87QlLZqLb8MusoQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-5.5.1.tgz", + "integrity": "sha512-XWOQQPhKl06Vj0xi3RYHAc6oEQd8B82okYJ04K7N0Vvy3J4PN2cxeK7klwkjgavdcN9EVkYCChm2ADAtnztKnA==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/rpc-parsed-types": "5.0.0", - "@solana/rpc-spec": "5.0.0", - "@solana/rpc-transformers": "5.0.0", - "@solana/rpc-types": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/rpc-parsed-types": "5.5.1", + "@solana/rpc-spec": "5.5.1", + "@solana/rpc-transformers": "5.5.1", + "@solana/rpc-types": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-parsed-types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-5.0.0.tgz", - "integrity": "sha512-fU9uqlOYAaBqgk2qCl+ntenBm7wuSFBRbIO/rVjeBPd/qPCvNZU+qFET+ERLK6wbCTSz0MmdHqPn1V8KCMOvZQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-5.5.1.tgz", + "integrity": "sha512-HEi3G2nZqGEsa3vX6U0FrXLaqnUCg4SKIUrOe8CezD+cSFbRTOn3rCLrUmJrhVyXlHoQVaRO9mmeovk31jWxJg==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-spec": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-5.0.0.tgz", - "integrity": "sha512-1LD2SYEQ5bYhiBumznAPzymtxSX4nYLZd6u+FA0bAxNBVzHDvUUQzVSXHAoWROhlGrCyvtALTs9u0DIDlgZHCA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-5.5.1.tgz", + "integrity": "sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/rpc-spec-types": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/rpc-spec-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-spec-types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-5.0.0.tgz", - "integrity": "sha512-B0P/ylXVaCG5oSIV+kB88s2qoW996D8iKhc7RyF0C/AyYvklF6kCwv0N9ZVrWp0ibjlQ8St290WbBHJyo7QZkA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-5.5.1.tgz", + "integrity": "sha512-6OFKtRpIEJQs8Jb2C4OO8KyP2h2Hy1MFhatMAoXA+0Ik8S3H+CicIuMZvGZ91mIu/tXicuOOsNNLu3HAkrakrw==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-subscriptions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-5.0.0.tgz", - "integrity": "sha512-cziOSzom/bwFZXViR9J+MxDsdLMcfvrXGw5Icng7dYODFKuVqfsDrQoG8uekJc4fREnbPEM2U+u9YnYSYbFbww==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-5.5.1.tgz", + "integrity": "sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/fast-stable-stringify": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/promises": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", - "@solana/rpc-subscriptions-api": "5.0.0", - "@solana/rpc-subscriptions-channel-websocket": "5.0.0", - "@solana/rpc-subscriptions-spec": "5.0.0", - "@solana/rpc-transformers": "5.0.0", - "@solana/rpc-types": "5.0.0", - "@solana/subscribable": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/fast-stable-stringify": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/promises": "5.5.1", + "@solana/rpc-spec-types": "5.5.1", + "@solana/rpc-subscriptions-api": "5.5.1", + "@solana/rpc-subscriptions-channel-websocket": "5.5.1", + "@solana/rpc-subscriptions-spec": "5.5.1", + "@solana/rpc-transformers": "5.5.1", + "@solana/rpc-types": "5.5.1", + "@solana/subscribable": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-subscriptions-api": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-5.0.0.tgz", - "integrity": "sha512-DGUn3C12swV2FConOlLFN14npIrCtnxehtMLjszMC7g6p/P6WNIz5uAgF7YcIkLBDV8uTeWhM0azmK+V8Qqhvg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-5.5.1.tgz", + "integrity": "sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/rpc-subscriptions-spec": "5.0.0", - "@solana/rpc-transformers": "5.0.0", - "@solana/rpc-types": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/rpc-subscriptions-spec": "5.5.1", + "@solana/rpc-transformers": "5.5.1", + "@solana/rpc-types": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-subscriptions-channel-websocket": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-5.0.0.tgz", - "integrity": "sha512-vsYXyjVX/kExfpr91zfMKTmWKKFCM+dkhXQDAz5aEE7kAF3KSZDiOGeYvN8Rc85lbIt9QK6BLAT+NBMv4/N9Qg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-5.5.1.tgz", + "integrity": "sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/rpc-subscriptions-spec": "5.0.0", - "@solana/subscribable": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/rpc-subscriptions-spec": "5.5.1", + "@solana/subscribable": "5.5.1", + "ws": "^8.19.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3", - "ws": "^8.18.0" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-subscriptions-spec": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-5.0.0.tgz", - "integrity": "sha512-erRLvZMncwnciJP6I1SlAk0CyRGIgt83PyHWOVCRXENP9Q5dZbZ9pm4lar2yIp8EjIMnodGHsQWIlKc1hlCQlQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-5.5.1.tgz", + "integrity": "sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/promises": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", - "@solana/subscribable": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/promises": "5.5.1", + "@solana/rpc-spec-types": "5.5.1", + "@solana/subscribable": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-transformers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-5.0.0.tgz", - "integrity": "sha512-EMHhSgfF6/T4FfHbLaBP08SIj1ZAjxJr6WPNZMHLV7Cup8UfiB9TNV+bPQkum7JbVQNhUKzkKEEmyYqPfQoV9w==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-5.5.1.tgz", + "integrity": "sha512-OsWqLCQdcrRJKvHiMmwFhp9noNZ4FARuMkHT5us3ustDLXaxOjF0gfqZLnMkulSLcKt7TGXqMhBV+HCo7z5M8Q==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/nominal-types": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", - "@solana/rpc-types": "5.0.0" + "@solana/errors": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/nominal-types": "5.5.1", + "@solana/rpc-spec-types": "5.5.1", + "@solana/rpc-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-transport-http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-5.0.0.tgz", - "integrity": "sha512-RoIEvWp7yc7rIRzNkOyjLs2UQF0odIEMWj87dbD4Ir4hwTCGo/TSTfQF/8KDV2etdke3Fa1K+W1NkpG2POqWFg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-5.5.1.tgz", + "integrity": "sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/rpc-spec": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", - "undici-types": "^7.16.0" + "@solana/errors": "5.5.1", + "@solana/rpc-spec": "5.5.1", + "@solana/rpc-spec-types": "5.5.1", + "undici-types": "^7.19.2" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/rpc-types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-5.0.0.tgz", - "integrity": "sha512-JMbhwnV6nX4ezJv/KmaElOR0r/MZTKzKpaz6cv7FopLNuPrYCBrRCZKuM2XQh6gUbt9Mey08/KBOmOGmzTbL/g==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-5.5.1.tgz", + "integrity": "sha512-bibTFQ7PbHJJjGJPmfYC2I+/5CRFS4O2p9WwbFraX1Keeel+nRrt/NBXIy8veP5AEn2sVJIyJPpWBRpCx1oATA==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/nominal-types": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/nominal-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/signers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-5.0.0.tgz", - "integrity": "sha512-9Hw6HekSEzj5O7UBBFPrxk96W5e8tMI3n7KbW7/QiKBDpuvYw9WtnjOsWUE7LqQoc1P0JjGEsrmxE9raQBLvuQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-5.5.1.tgz", + "integrity": "sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/instructions": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/nominal-types": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/instructions": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/nominal-types": "5.5.1", + "@solana/offchain-messages": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/subscribable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.0.0.tgz", - "integrity": "sha512-C2TydIRRd5XUJ8asbARi67Sj/3DRLubWalnNoafBhDsrb88jsRVylntvwXgBw/+lwJdEPEsUnxvcdgdm+3lFlw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.5.1.tgz", + "integrity": "sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0" + "@solana/errors": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/sysvars": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.0.0.tgz", - "integrity": "sha512-F/GEb2rS8mrgDd79lDPyu8za9jGE6cRlS4jHNeKCkvOCJxdKQbX34JIzx4kwzjtvk7O8/yrDHfGdpA8nBg/l4w==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.5.1.tgz", + "integrity": "sha512-k3Quq87Mm+geGUu1GWv6knPk0ALsfY6EKSJGw9xUJDHzY/RkYSBnh0RiOrUhtFm2TDNjOailg8/m0VHmi3reFA==", "license": "MIT", "dependencies": { - "@solana/accounts": "5.0.0", - "@solana/codecs": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/rpc-types": "5.0.0" + "@solana/accounts": "5.5.1", + "@solana/codecs": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/rpc-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/transaction-confirmation": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-5.0.0.tgz", - "integrity": "sha512-LpusTopYIuQC8hBCloExkTr4Z5/zdp5f4IIbzD5XFeW3xXPZytS3H1IDMGk4bmLdZi9zQNA4lnNHKra5IncRbw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-5.5.1.tgz", + "integrity": "sha512-j4mKlYPHEyu+OD7MBt3jRoX4ScFgkhZC6H65on4Fux6LMScgivPJlwnKoZMnsgxFgWds0pl+BYzSiALDsXlYtw==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/promises": "5.0.0", - "@solana/rpc": "5.0.0", - "@solana/rpc-subscriptions": "5.0.0", - "@solana/rpc-types": "5.0.0", - "@solana/transaction-messages": "5.0.0", - "@solana/transactions": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/promises": "5.5.1", + "@solana/rpc": "5.5.1", + "@solana/rpc-subscriptions": "5.5.1", + "@solana/rpc-types": "5.5.1", + "@solana/transaction-messages": "5.5.1", + "@solana/transactions": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/transaction-messages": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-5.0.0.tgz", - "integrity": "sha512-rJLe1wUGW5DovQFV0gjXHXnriPxTBgZ3TvGWnjCu2OIBU8mcQkQVJ7zzVZY2IAYlmJ6OSF9nvzhSt/ncPbkJPg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-5.5.1.tgz", + "integrity": "sha512-aXyhMCEaAp3M/4fP0akwBBQkFPr4pfwoC5CLDq999r/FUwDax2RE/h4Ic7h2Xk+JdcUwsb+rLq85Y52hq84XvQ==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-data-structures": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/instructions": "5.0.0", - "@solana/nominal-types": "5.0.0", - "@solana/rpc-types": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-data-structures": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/instructions": "5.5.1", + "@solana/nominal-types": "5.5.1", + "@solana/rpc-types": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/transactions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-5.0.0.tgz", - "integrity": "sha512-4TcsqH7JtgRKGGBIRRGz0n+tXu4h5TPPC49kkV0ygIndQaHW7FOZUYTwQ0epq0A5h9KYi+ClNbzF9xiuDbAD5Q==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-5.5.1.tgz", + "integrity": "sha512-8hHtDxtqalZ157pnx6p8k10D7J/KY/biLzfgh9R09VNLLY3Fqi7kJvJCr7M2ik3oRll56pxhraAGCC9yIT6eOA==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/codecs-core": "5.0.0", - "@solana/codecs-data-structures": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/codecs-strings": "5.0.0", - "@solana/errors": "5.0.0", - "@solana/functional": "5.0.0", - "@solana/instructions": "5.0.0", - "@solana/keys": "5.0.0", - "@solana/nominal-types": "5.0.0", - "@solana/rpc-types": "5.0.0", - "@solana/transaction-messages": "5.0.0" + "@solana/addresses": "5.5.1", + "@solana/codecs-core": "5.5.1", + "@solana/codecs-data-structures": "5.5.1", + "@solana/codecs-numbers": "5.5.1", + "@solana/codecs-strings": "5.5.1", + "@solana/errors": "5.5.1", + "@solana/functional": "5.5.1", + "@solana/instructions": "5.5.1", + "@solana/keys": "5.5.1", + "@solana/nominal-types": "5.5.1", + "@solana/rpc-types": "5.5.1", + "@solana/transaction-messages": "5.5.1" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@solana/wallet-adapter-base": { @@ -17477,16 +17496,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "license": "MIT" - }, "node_modules/@supabase/auth-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.84.0.tgz", - "integrity": "sha512-J6XKbqqg1HQPMfYkAT9BrC8anPpAiifl7qoVLsYhQq5B/dnu/lxab1pabnxtJEsvYG5rwI5HEVEGXMjoQ6Wz2Q==", + "version": "2.95.3", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.95.3.tgz", + "integrity": "sha512-vD2YoS8E2iKIX0F7EwXTmqhUpaNsmbU6X2R0/NdFcs02oEfnHyNP/3M716f3wVJ2E5XHGiTFXki6lRckhJ0Thg==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -17496,9 +17509,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.84.0.tgz", - "integrity": "sha512-2oY5QBV4py/s64zMlhPEz+4RTdlwxzmfhM1k2xftD2v1DruRZKfoe7Yn9DCz1VondxX8evcvpc2udEIGzHI+VA==", + "version": "2.95.3", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.95.3.tgz", + "integrity": "sha512-uTuOAKzs9R/IovW1krO0ZbUHSJnsnyJElTXIRhjJTqymIVGcHzkAYnBCJqd7468Fs/Foz1BQ7Dv6DCl05lr7ig==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -17508,9 +17521,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.84.0.tgz", - "integrity": "sha512-oplc/3jfJeVW4F0J8wqywHkjIZvOVHtqzF0RESijepDAv5Dn/LThlGW1ftysoP4+PXVIrnghAbzPHo88fNomPQ==", + "version": "2.95.3", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.95.3.tgz", + "integrity": "sha512-LTrRBqU1gOovxRm1vRXPItSMPBmEFqrfTqdPTRtzOILV4jPSueFz6pES5hpb4LRlkFwCPRmv3nQJ5N625V2Xrg==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -17520,9 +17533,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.84.0.tgz", - "integrity": "sha512-ThqjxiCwWiZAroHnYPmnNl6tZk6jxGcG2a7Hp/3kcolPcMj89kWjUTA3cHmhdIWYsP84fHp8MAQjYWMLf7HEUg==", + "version": "2.95.3", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.95.3.tgz", + "integrity": "sha512-D7EAtfU3w6BEUxDACjowWNJo/ZRo7sDIuhuOGKHIm9FHieGeoJV5R6GKTLtga/5l/6fDr2u+WcW/m8I9SYmaIw==", "license": "MIT", "dependencies": { "@types/phoenix": "^1.6.6", @@ -17535,11 +17548,12 @@ } }, "node_modules/@supabase/storage-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.84.0.tgz", - "integrity": "sha512-vXvAJ1euCuhryOhC6j60dG8ky+lk0V06ubNo+CbhuoUv+sl39PyY0lc+k+qpQhTk/VcI6SiM0OECLN83+nyJ5A==", + "version": "2.95.3", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.95.3.tgz", + "integrity": "sha512-4GxkJiXI3HHWjxpC3sDx1BVrV87O0hfX+wvJdqGv67KeCu+g44SPnII8y0LL/Wr677jB7tpjAxKdtVWf+xhc9A==", "license": "MIT", "dependencies": { + "iceberg-js": "^0.8.1", "tslib": "2.8.1" }, "engines": { @@ -17547,16 +17561,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.84.0.tgz", - "integrity": "sha512-byMqYBvb91sx2jcZsdp0qLpmd4Dioe80e4OU/UexXftCkpTcgrkoENXHf5dO8FCSai8SgNeq16BKg10QiDI6xg==", + "version": "2.95.3", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.95.3.tgz", + "integrity": "sha512-Fukw1cUTQ6xdLiHDJhKKPu6svEPaCEDvThqCne3OaQyZvuq2qjhJAd91kJu3PXLG18aooCgYBaB6qQz35hhABg==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.84.0", - "@supabase/functions-js": "2.84.0", - "@supabase/postgrest-js": "2.84.0", - "@supabase/realtime-js": "2.84.0", - "@supabase/storage-js": "2.84.0" + "@supabase/auth-js": "2.95.3", + "@supabase/functions-js": "2.95.3", + "@supabase/postgrest-js": "2.95.3", + "@supabase/realtime-js": "2.95.3", + "@supabase/storage-js": "2.95.3" }, "engines": { "node": ">=20.0.0" @@ -18202,8 +18216,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@swc/helpers": { "version": "0.5.17", @@ -18401,15 +18414,6 @@ "@types/estree": "*" } }, - "node_modules/@types/fontkit": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", - "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/google.maps": { "version": "3.58.1", "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", @@ -18497,9 +18501,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "license": "MIT" }, "node_modules/@types/mdast": { @@ -18533,9 +18537,9 @@ } }, "node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -18559,9 +18563,9 @@ "license": "MIT" }, "node_modules/@types/phoenix": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", - "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", + "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", "license": "MIT" }, "node_modules/@types/prismjs": { @@ -18586,9 +18590,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "version": "19.2.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz", + "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==", "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -19502,6 +19506,18 @@ "node": ">=18" } }, + "node_modules/@wallet-standard/experimental-features": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/experimental-features/-/experimental-features-0.2.0.tgz", + "integrity": "sha512-B6fBLgouurN3IAoqhh8/1Mm33IAWIErQXVyvMcyBJM+elOD6zkNDUjew5QMG19qCbJ+ZiZUZmdOUC5PxxWw69w==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@wallet-standard/features": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@wallet-standard/features/-/features-1.1.0.tgz", @@ -19514,6 +19530,40 @@ "node": ">=16" } }, + "node_modules/@wallet-standard/react": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wallet-standard/react/-/react-1.0.1.tgz", + "integrity": "sha512-StpPv234R94MmJCCUZurQvQSsX6Xe1eOd2lNgwVonvSVdPqCNVS/haVpdrBMx0wX1Ut24X77qyBLP7SGxK5OUg==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/react-core": "^1.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/react-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wallet-standard/react-core/-/react-core-1.0.1.tgz", + "integrity": "sha512-g+vZaLlAGlYMwZEoKsmjjI5qz1D8P3FF1aqiI3WLooWOVk55Nszbpk01QCbIFdIMF0UDhxia2FU667TCv509iw==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/app": "^1.1.0", + "@wallet-standard/base": "^1.1.0", + "@wallet-standard/errors": "^0.1.1", + "@wallet-standard/experimental-features": "^0.2.0", + "@wallet-standard/features": "^1.1.0", + "@wallet-standard/ui": "^1.0.1", + "@wallet-standard/ui-registry": "^1.0.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@wallet-standard/ui": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wallet-standard/ui/-/ui-1.0.1.tgz", @@ -19761,24 +19811,6 @@ "node": ">= 8.0.0" } }, - "node_modules/ai": { - "version": "5.0.101", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.101.tgz", - "integrity": "sha512-/P4fgs2PGYTBaZi192YkPikOudsl9vccA65F7J7LvoNTOoP5kh1yAsJPsKAy6FXU32bAngai7ft1UDyC3u7z5g==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "2.0.15", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.17", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -19822,35 +19854,35 @@ } }, "node_modules/algoliasearch": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.45.0.tgz", - "integrity": "sha512-wrj4FGr14heLOYkBKV3Fbq5ZBGuIFeDJkTilYq/G+hH1CSlQBtYvG2X1j67flwv0fUeQJwnWxxRIunSemAZirA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.48.0.tgz", + "integrity": "sha512-aD8EQC6KEman6/S79FtPdQmB7D4af/etcRL/KwiKFKgAE62iU8c5PeEQvpvIcBPurC3O/4Lj78nOl7ZcoazqSw==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/abtesting": "1.11.0", - "@algolia/client-abtesting": "5.45.0", - "@algolia/client-analytics": "5.45.0", - "@algolia/client-common": "5.45.0", - "@algolia/client-insights": "5.45.0", - "@algolia/client-personalization": "5.45.0", - "@algolia/client-query-suggestions": "5.45.0", - "@algolia/client-search": "5.45.0", - "@algolia/ingestion": "1.45.0", - "@algolia/monitoring": "1.45.0", - "@algolia/recommend": "5.45.0", - "@algolia/requester-browser-xhr": "5.45.0", - "@algolia/requester-fetch": "5.45.0", - "@algolia/requester-node-http": "5.45.0" + "@algolia/abtesting": "1.14.0", + "@algolia/client-abtesting": "5.48.0", + "@algolia/client-analytics": "5.48.0", + "@algolia/client-common": "5.48.0", + "@algolia/client-insights": "5.48.0", + "@algolia/client-personalization": "5.48.0", + "@algolia/client-query-suggestions": "5.48.0", + "@algolia/client-search": "5.48.0", + "@algolia/ingestion": "1.48.0", + "@algolia/monitoring": "1.48.0", + "@algolia/recommend": "5.48.0", + "@algolia/requester-browser-xhr": "5.48.0", + "@algolia/requester-fetch": "5.48.0", + "@algolia/requester-node-http": "5.48.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", - "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.27.0.tgz", + "integrity": "sha512-eNYchRerbsvk2doHOMfdS1/B6Tm70oGtu8mzQlrNzbCeQ8p1MjCW8t/BL6iZ5PD+cL5NNMgTMyMnmiXZ1sgmNw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -19968,16 +20000,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/antlr4": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.2.tgz", - "integrity": "sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16" - } - }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -20234,16 +20256,16 @@ } }, "node_modules/astro": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.0.tgz", - "integrity": "sha512-GaDRs2Mngpw3dr2vc085GnORh98NiXxwIjg/EoQQQl/icZt3Z7s0BRsYHDZ8swkZbOA6wZsqWJdrNirl+iKcDg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.17.1.tgz", + "integrity": "sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", - "@astrojs/markdown-remark": "6.3.9", + "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", - "@capsizecss/unpack": "^3.0.1", + "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", @@ -20253,19 +20275,19 @@ "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", - "cookie": "^1.0.2", + "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", - "devalue": "^5.5.0", - "diff": "^5.2.0", + "devalue": "^5.6.2", + "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", - "fontace": "~0.3.1", + "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", @@ -20277,22 +20299,22 @@ "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", - "package-manager-detector": "^1.5.0", + "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", - "shiki": "^3.15.0", - "smol-toml": "^1.5.0", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", - "unifont": "~0.6.0", + "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.2", + "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", @@ -20300,7 +20322,7 @@ "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.6", + "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "bin": { @@ -20348,15 +20370,15 @@ "license": "MIT" }, "node_modules/astro/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -20384,10 +20406,13 @@ "license": "MIT" }, "node_modules/astro/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/astro/node_modules/p-limit": { "version": "6.2.0", @@ -20433,9 +20458,9 @@ } }, "node_modules/astro/node_modules/package-manager-detector": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.5.0.tgz", - "integrity": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "license": "MIT" }, "node_modules/astro/node_modules/picomatch": { @@ -20451,12 +20476,12 @@ } }, "node_modules/astro/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -20476,19 +20501,19 @@ } }, "node_modules/astro/node_modules/unstorage": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz", - "integrity": "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -20497,14 +20522,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -21070,15 +21095,6 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "license": "MIT" }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, "node_modules/browserslist": { "version": "4.28.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", @@ -21184,9 +21200,9 @@ } }, "node_modules/bufferutil": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", - "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -21233,7 +21249,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "peer": true, "dependencies": { "streamsearch": "^1.1.0" }, @@ -21745,8 +21760,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/clipboard": { "version": "2.0.11", @@ -21824,15 +21838,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -22000,12 +22005,16 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookie-es": { @@ -22586,9 +22595,9 @@ } }, "node_modules/devalue": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz", - "integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", "license": "MIT" }, "node_modules/devlop": { @@ -22604,12 +22613,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", - "license": "MIT" - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -22617,9 +22620,9 @@ "license": "Apache-2.0" }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -23559,14 +23562,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -24107,9 +24110,9 @@ } }, "node_modules/ethers": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", - "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", "funding": [ { "type": "individual", @@ -24216,15 +24219,6 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -24367,9 +24361,9 @@ } }, "node_modules/fast-copy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", - "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.1.tgz", + "integrity": "sha512-+uUOQlhsaswsizHFmEFAQhB3lSiQ+lisxl50N6ZP0wywlZeWsIESxSi9ftPEps8UGfiBzyYP7x27zA674WUvXw==", "dev": true, "license": "MIT" }, @@ -24662,22 +24656,22 @@ "peer": true }, "node_modules/focus-trap": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.6.tgz", - "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", "license": "MIT", "dependencies": { - "tabbable": "^6.3.0" + "tabbable": "^6.4.0" } }, "node_modules/focus-trap-react": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-11.0.4.tgz", - "integrity": "sha512-tC7jC/yqeAqhe4irNIzdyDf9XCtGSeECHiBSYJBO/vIN0asizbKZCt8TarB6/XqIceu42ajQ/U4lQJ9pZlWjrg==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-11.0.6.tgz", + "integrity": "sha512-8YbWR8kDf2pQ8G9LT11p39VY4T7eWVrj00Fhp1HUSdv5uW9q6+WK8OMAdy9Ui7vGb1zNouFDzwBIqJwt82rIYQ==", "license": "MIT", "dependencies": { - "focus-trap": "^7.6.5", - "tabbable": "^6.2.0" + "focus-trap": "^7.8.0", + "tabbable": "^6.4.0" }, "peerDependencies": { "@types/react": "^18.0.0 || ^19.0.0", @@ -24707,30 +24701,24 @@ } }, "node_modules/fontace": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.1.tgz", - "integrity": "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.0.tgz", + "integrity": "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==", "license": "MIT", "dependencies": { - "@types/fontkit": "^2.0.8", - "fontkit": "^2.0.4" + "fontkitten": "^1.0.0" } }, - "node_modules/fontkit": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", - "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "node_modules/fontkitten": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.0.tgz", + "integrity": "sha512-b0RdzQeztiiUFWEDzq6Ka26qkNVNLCehoRtifOIGNbQ4CfxyYRh73fyWaQX/JshPVcueITOEeoSWPy5XQv8FUg==", "license": "MIT", "dependencies": { - "@swc/helpers": "^0.5.12", - "brotli": "^1.3.2", - "clone": "^2.1.2", - "dfa": "^1.2.0", - "fast-deep-equal": "^3.1.3", - "restructure": "^3.0.0", - "tiny-inflate": "^1.0.3", - "unicode-properties": "^1.4.0", - "unicode-trie": "^2.0.0" + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" } }, "node_modules/for-each": { @@ -25254,9 +25242,9 @@ } }, "node_modules/h3": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", - "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", @@ -25264,9 +25252,9 @@ "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.2", + "node-mock-http": "^1.0.4", "radix3": "^1.1.2", - "ufo": "^1.6.1", + "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, @@ -26087,6 +26075,15 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/iceberg-js": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", + "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", @@ -26253,13 +26250,12 @@ "license": "MIT" }, "node_modules/instantsearch-ui-components": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.15.0.tgz", - "integrity": "sha512-eQYwOgHk7+JJwr8C/QQOAsiPV8JdDN7D5edjO1VZVW6UgZWvTlfRR7xM9qPLJjpqbZMw46n1N2Bx8ZAYQjXiCA==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.17.1.tgz", + "integrity": "sha512-uOn39sNs9ukK0N6pklVdxbE5dapIdSJmkh/WJPPtOe4bpnvLzzvvexQYpUJ9vy1xQJMaQcAoPMoMKfBXwUA29A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", - "ai": "^5.0.18", "markdown-to-jsx": "^7.7.15", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" @@ -26275,9 +26271,9 @@ } }, "node_modules/instantsearch.js": { - "version": "4.84.0", - "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.84.0.tgz", - "integrity": "sha512-7ThTNzBgyFJgZT2ng/0lwGmCXZnK3nq5476bu0hL5u6Nc+AuKFGtAMKlNozXI/Nel3i3WJkoWwxO+37OxfqQmw==", + "version": "4.87.1", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.87.1.tgz", + "integrity": "sha512-KkOSosDPnCXZg5QNZ6AnW+wWJaTsK0kXzUyr4/ugGE/Tm5Fn5D08yC9RFT4JxlvDJw+re0ov1xBbWKBcBn8XuA==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1", @@ -26285,13 +26281,12 @@ "@types/google.maps": "^3.55.12", "@types/hogan.js": "^3.0.0", "@types/qs": "^6.5.3", - "ai": "^5.0.18", - "algoliasearch-helper": "3.26.1", + "algoliasearch-helper": "3.27.0", "hogan.js": "^3.0.2", "htm": "^3.0.0", - "instantsearch-ui-components": "0.15.0", + "instantsearch-ui-components": "0.17.1", "preact": "^10.10.0", - "qs": "^6.5.1 < 6.10", + "qs": "^6.5.1", "react": ">= 0.14.0", "search-insights": "^2.17.2", "zod": "^3.25.76 || ^4", @@ -30502,12 +30497,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -30621,9 +30610,9 @@ } }, "node_modules/knip": { - "version": "5.70.2", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.70.2.tgz", - "integrity": "sha512-LI7DbeVnk7h9+FAet5KzzHNdDwJyqDa2+cn4uQfZYTfpuVjEqtGmYD9r5b9JEuOs4eVkf/7sskNhWXxELm3C/Q==", + "version": "5.83.1", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.83.1.tgz", + "integrity": "sha512-av3ZG/Nui6S/BNL8Tmj12yGxYfTnwWnslouW97m40him7o8MwiMjZBY9TPvlEWUci45aVId0/HbgTwSKIDGpMw==", "dev": true, "funding": [ { @@ -30643,7 +30632,7 @@ "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", - "oxc-resolver": "^11.13.2", + "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", @@ -31015,9 +31004,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -33238,13 +33227,12 @@ } }, "node_modules/next": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz", - "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "license": "MIT", - "peer": true, "dependencies": { - "@next/env": "14.2.33", + "@next/env": "14.2.35", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -33293,7 +33281,6 @@ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" @@ -33318,7 +33305,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -33464,9 +33450,9 @@ "license": "MIT" }, "node_modules/node-mock-http": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz", - "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, "node_modules/node-releases": { @@ -33594,7 +33580,6 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -33906,34 +33891,35 @@ } }, "node_modules/oxc-resolver": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.14.0.tgz", - "integrity": "sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.15.0.tgz", + "integrity": "sha512-Hk2J8QMYwmIO9XTCUiOH00+Xk2/+aBxRUnhrSlANDyCnLYc32R1WSIq1sU2yEdlqd53FfMpPEpnBYIKQMzliJw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-resolver/binding-android-arm-eabi": "11.14.0", - "@oxc-resolver/binding-android-arm64": "11.14.0", - "@oxc-resolver/binding-darwin-arm64": "11.14.0", - "@oxc-resolver/binding-darwin-x64": "11.14.0", - "@oxc-resolver/binding-freebsd-x64": "11.14.0", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.14.0", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.14.0", - "@oxc-resolver/binding-linux-arm64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-arm64-musl": "11.14.0", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-riscv64-musl": "11.14.0", - "@oxc-resolver/binding-linux-s390x-gnu": "11.14.0", - "@oxc-resolver/binding-linux-x64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-x64-musl": "11.14.0", - "@oxc-resolver/binding-wasm32-wasi": "11.14.0", - "@oxc-resolver/binding-win32-arm64-msvc": "11.14.0", - "@oxc-resolver/binding-win32-ia32-msvc": "11.14.0", - "@oxc-resolver/binding-win32-x64-msvc": "11.14.0" + "@oxc-resolver/binding-android-arm-eabi": "11.15.0", + "@oxc-resolver/binding-android-arm64": "11.15.0", + "@oxc-resolver/binding-darwin-arm64": "11.15.0", + "@oxc-resolver/binding-darwin-x64": "11.15.0", + "@oxc-resolver/binding-freebsd-x64": "11.15.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.15.0", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.15.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.15.0", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-riscv64-musl": "11.15.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.15.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-x64-musl": "11.15.0", + "@oxc-resolver/binding-openharmony-arm64": "11.15.0", + "@oxc-resolver/binding-wasm32-wasi": "11.15.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.15.0", + "@oxc-resolver/binding-win32-ia32-msvc": "11.15.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.15.0" } }, "node_modules/p-cancelable": { @@ -34543,21 +34529,21 @@ } }, "node_modules/pino-pretty": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.2.tgz", - "integrity": "sha512-3cN0tCakkT4f3zo9RXDIhy6GTvtYD6bK4CRBLN9j3E/ePqN1tugAXD5rGVfoChW6s0hiek+eyYlLNqc/BG7vBQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", + "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", - "fast-copy": "^3.0.2", + "fast-copy": "^4.0.0", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", + "pino-abstract-transport": "^3.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", @@ -34567,6 +34553,16 @@ "pino-pretty": "bin.js" } }, + "node_modules/pino-pretty/node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, "node_modules/pino-pretty/node_modules/strip-json-comments": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", @@ -34796,9 +34792,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.27.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", - "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "version": "10.28.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.3.tgz", + "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==", "license": "MIT", "funding": { "type": "opencollective", @@ -34825,9 +34821,9 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "bin": { @@ -34841,9 +34837,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -35179,10 +35175,13 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { "node": ">=0.6" }, @@ -35497,15 +35496,15 @@ } }, "node_modules/react-instantsearch": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.20.0.tgz", - "integrity": "sha512-I7luR9MstQSe0olLqZj+DB5+U0P9Gd8mcNTWhqr0e+mKIWize6le+/BoGgvp8yJhBlXCSLLpbU9SvE0UilYcqQ==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.23.1.tgz", + "integrity": "sha512-+AKTEm9JwuvGPS9Bkxnayaz7IhZ1TMLxv7DplgT6uCr4kB5jYPU5YbIqlZv0Zo7oiv49DXbLt8w6XriwZAnAaA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", - "instantsearch-ui-components": "0.15.0", - "instantsearch.js": "4.84.0", - "react-instantsearch-core": "7.20.0" + "instantsearch-ui-components": "0.17.1", + "instantsearch.js": "4.87.1", + "react-instantsearch-core": "7.23.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6", @@ -35514,15 +35513,14 @@ } }, "node_modules/react-instantsearch-core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.20.0.tgz", - "integrity": "sha512-awTPtAEozGWNVcZ969fMBO1S61QPDT13NdIlDjtoeg6GF4ZN9TXH+B/kjK5OxN0WzdbWxrE1nPGNfH9lHS7ZMg==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.23.1.tgz", + "integrity": "sha512-mKmy7llIMF9DlJza8maHEwObONf49gXJP+rS4BMb6GgRi3IVi2OBxdPmia9C7JXANR2x2fYxm7uSxYyMs1qveQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", - "ai": "^5.0.18", - "algoliasearch-helper": "3.26.1", - "instantsearch.js": "4.84.0", + "algoliasearch-helper": "3.27.0", + "instantsearch.js": "4.87.1", "use-sync-external-store": "^1.0.0", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" @@ -36010,9 +36008,9 @@ "peer": true }, "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "license": "MIT", "dependencies": { "regex-utilities": "^2.3.0" @@ -36612,12 +36610,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restructure": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", - "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", - "license": "MIT" - }, "node_modules/ret": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", @@ -37345,17 +37337,17 @@ } }, "node_modules/shiki": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.15.0.tgz", - "integrity": "sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.21.0.tgz", + "integrity": "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.15.0", - "@shikijs/engine-javascript": "3.15.0", - "@shikijs/engine-oniguruma": "3.15.0", - "@shikijs/langs": "3.15.0", - "@shikijs/themes": "3.15.0", - "@shikijs/types": "3.15.0", + "@shikijs/core": "3.21.0", + "@shikijs/engine-javascript": "3.21.0", + "@shikijs/engine-oniguruma": "3.21.0", + "@shikijs/langs": "3.21.0", + "@shikijs/themes": "3.21.0", + "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } @@ -37374,7 +37366,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -37394,7 +37385,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -37411,7 +37401,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -37430,7 +37419,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -37538,9 +37526,9 @@ } }, "node_modules/smol-toml": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", - "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -37566,16 +37554,15 @@ "license": "MIT" }, "node_modules/solhint": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.0.1.tgz", - "integrity": "sha512-Lew5nhmkXqHPybzBzkMzvvWkpOJSSLTkfTZwRriWvfR2naS4YW2PsjVGaoX9tZFmHh7SuS+e2GEGo5FPYYmJ8g==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.0.3.tgz", + "integrity": "sha512-LYiy1bN8X9eUsti13mbS4fY6ILVxhP6VoOgqbHxCsHl5VPnxOWf7U1V9ZvgizxdInKBMW82D1FNJO+daAcWHbA==", "dev": true, "license": "MIT", "dependencies": { "@solidity-parser/parser": "^0.20.2", "ajv": "^6.12.6", "ajv-errors": "^1.0.1", - "antlr4": "^4.13.1-patch-1", "ast-parents": "^0.0.1", "better-ajv-errors": "^2.0.2", "chalk": "^4.1.2", @@ -37931,7 +37918,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -38199,7 +38185,6 @@ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "license": "MIT", - "peer": true, "dependencies": { "client-only": "0.0.1" }, @@ -38351,18 +38336,18 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.30.2", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.30.2.tgz", - "integrity": "sha512-HWCg1DTNE/Nmapt+0m2EPXFwNKNeKK4PwMjkwveN/zn1cV2Kxi9SURd+m0SpdcSgWEK/O64sf8bzXdtUhigtHA==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz", + "integrity": "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg==", "license": "Apache-2.0", "dependencies": { "@scarf/scarf": "=1.4.0" } }, "node_modules/swagger-ui-react": { - "version": "5.30.2", - "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.30.2.tgz", - "integrity": "sha512-0tS9GOcswKuQrIpCyvDoCDs6xS8B6MRC+iE7P99WfVXDhAIU+U7iFHuS4e7zucSh9qXvcL7KsXs623c+4oBe6w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.31.0.tgz", + "integrity": "sha512-E/sTgKADThzpVksaGXbhED0pQCYdajiBNOzvSAan+RhV7pdoi2qvdwWhZsIo8nRvHk9UXJ0nkuxrud854ICr7A==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", @@ -38376,7 +38361,7 @@ "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", - "js-yaml": "=4.1.0", + "js-yaml": "=4.1.1", "lodash": "^4.17.21", "prop-types": "^15.8.1", "randexp": "^0.5.3", @@ -38414,18 +38399,6 @@ "@types/trusted-types": "^2.0.7" } }, - "node_modules/swagger-ui-react/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -38435,9 +38408,9 @@ } }, "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -38451,9 +38424,9 @@ } }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/table": { @@ -39023,9 +38996,9 @@ } }, "node_modules/ts-jest": { - "version": "29.4.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", - "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -39175,13 +39148,13 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "devOptional": true, "license": "MIT", "dependencies": { - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -39194,6 +39167,464 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" + } + }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -39334,9 +39765,9 @@ } }, "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, "node_modules/uglify-js": { @@ -39385,35 +39816,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.20.0.tgz", + "integrity": "sha512-PZDAAlMkNw5ZzN/ebfyrwzrMWfIf7Jbn9iM/I6SF456OKrb2wnfqVowaxEY/cMAM8MjFu1zhdpJyA0L+rTYwNw==", "license": "MIT" }, "node_modules/unified": { @@ -39436,14 +39841,14 @@ } }, "node_modules/unifont": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.6.0.tgz", - "integrity": "sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.3.tgz", + "integrity": "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==", "license": "MIT", "dependencies": { - "css-tree": "^3.0.0", - "ofetch": "^1.4.1", - "ohash": "^2.0.0" + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" } }, "node_modules/unist-util-filter": { @@ -39552,9 +39957,9 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -40389,9 +40794,9 @@ } }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -40595,9 +41000,9 @@ } }, "node_modules/zod-to-json-schema": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", - "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" diff --git a/package.json b/package.json index 9da1a0bf9eb..5ac7832c61b 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "astro": "astro", "dev": "astro dev", "start": "astro dev", - "build": "astro build && npm run pin-sol-version", + "build": "astro build && npm run pin-sol-version && node scripts/cleanup-vercel-function.mjs", "preview": "astro preview", "pin-sol-version": "tsx --require tsconfig-paths/register src/scripts/helper/pin-solver-dist.ts", "linkcheckWrapper": "tsx --require tsconfig-paths/register src/scripts/link-check/linkcheckWrapper.ts", @@ -57,13 +57,13 @@ "@11ty/eleventy-fetch": "^4.0.1", "@algolia/client-search": "^5.41.0", "@apollo/client": "^3.14.0", - "@astro-community/astro-embed-youtube": "^0.5.9", - "@astrojs/mdx": "^4.3.12", + "@astro-community/astro-embed-youtube": "^0.5.10", + "@astrojs/mdx": "^4.3.13", "@astrojs/partytown": "^2.1.4", "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", + "@astrojs/sitemap": "^3.7.0", "@astrojs/tailwind": "^6.0.2", "@chainlink/blocks": "^1.3.1", "@astrojs/vercel": "^8.2.11", @@ -76,43 +76,44 @@ "@chainlink/local": "0.2.7-beta", "@chainlink/solana-sdk": "^0.2.2", "@metamask/providers": "^22.1.1", - "@nanostores/persistent": "^1.1.0", + "@nanostores/persistent": "^1.3.3", "@nanostores/preact": "^0.5.2", "@nanostores/react": "^0.8.4", "@openzeppelin/contracts": "5.4.0", - "@solana-program/compute-budget": "^0.11.0", + "@solana-program/compute-budget": "^0.12.0", "@solana-program/system": "^0.10.0", "@solana-program/token": "^0.9.0", - "@solana-program/token-2022": "^0.6.1", - "@solana/kit": "^5.0.0", - "@solana/react": "^5.0.0", + "@solana-program/token-2022": "^0.8.0", + "@solana/kit": "^5.5.1", + "@solana/react": "^5.5.1", "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/wallet-adapter-react": "^0.15.39", "@solana/wallet-adapter-react-ui": "^0.9.39", "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", - "@supabase/supabase-js": "^2.84.0", - "astro": "^5.16.0", + "@supabase/supabase-js": "^2.95.3", + "astro": "^5.17.1", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", "dotenv": "^16.6.1", - "ethers": "^6.15.0", - "focus-trap-react": "^11.0.4", + "ethers": "^6.16.0", + "focus-trap-react": "^11.0.6", "github-slugger": "^2.0.0", - "lodash": "^4.17.21", + "lodash": "^4.17.23", "marked": "^15.0.12", "nanostores": "^0.11.4", + "next": "14.2.35", "pino": "^9.14.0", - "preact": "^10.27.2", - "react-instantsearch": "^7.20.0", + "preact": "^10.28.3", + "react-instantsearch": "^7.23.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", "remark-directive": "^3.0.1", - "swagger-ui-dist": "^5.30.1", - "swagger-ui-react": "^5.30.1", + "swagger-ui-dist": "^5.31.0", + "swagger-ui-react": "^5.31.0", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, @@ -122,11 +123,11 @@ "@project-serum/anchor": "^0.26.0", "@rollup/plugin-yaml": "^4.1.2", "@types/jest": "^29.5.14", - "@types/lodash": "^4.17.21", - "@types/node": "^20.19.25", + "@types/lodash": "^4.17.23", + "@types/node": "^20.19.33", "@types/node-fetch": "^2.6.13", "@types/prismjs": "^1.26.5", - "@types/react": "^19.2.7", + "@types/react": "^19.2.13", "@types/react-dom": "^19.2.3", "@types/swagger-ui-dist": "^3.30.6", "@types/swagger-ui-react": "^5.18.0", @@ -137,31 +138,31 @@ "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-n": "^15.7.0", - "eslint-plugin-prettier": "^5.5.0", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.70.1", + "knip": "^5.83.1", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", - "pino-pretty": "^13.1.2", - "prettier": "^3.5.3", + "pino-pretty": "^13.1.3", + "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "solhint": "^6.0.1", + "solhint": "^6.0.3", "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", - "ts-jest": "^29.4.5", "prettier-plugin-solidity": "^1.4.3", "solhint-plugin-prettier": "^0.1.0", "tailwindcss": "^3.4.18", + "ts-jest": "^29.4.6", "tsconfig-paths": "^4.2.0", - "tsx": "^4.20.6", + "tsx": "^4.21.0", "typescript": "^5.9.3", "unified": "^11.0.4", - "unist-util-visit": "^5.0.0", + "unist-util-visit": "^5.1.0", "vite": "^6.4.1" }, "lint-staged": { diff --git a/public/api/ccip/v1/openapi.json b/public/api/ccip/v1/openapi.json index 8cf38841257..0be05a9bff9 100644 --- a/public/api/ccip/v1/openapi.json +++ b/public/api/ccip/v1/openapi.json @@ -2,8 +2,8 @@ "openapi": "3.0.0", "info": { "title": "CCIP Docs config API", - "description": "API for retrieving CCIP chain, token, and lane information.\n\nTo get started quickly, you can download our [Postman Collection](/api/ccip/v1/postman-collection.json) which includes all endpoints and example requests.", - "version": "1.5.0", + "description": "API for retrieving CCIP chain, token, lane, and rate limits information.\n\nTo get started quickly, you can download our [Postman Collection](/api/ccip/v1/postman-collection.json) which includes all endpoints and example requests.", + "version": "1.11.0", "contact": { "name": "File issues", "url": "https://github.com/smartcontractkit/documentation/issues/new/choose" @@ -34,7 +34,7 @@ }, { "name": "lanes", - "description": "Cross-chain lane information endpoints" + "description": "Cross-chain lane information endpoints with rate limits" } ], "paths": { @@ -83,17 +83,17 @@ "example": "ethereum-mainnet,bsc-mainnet" }, { - "name": "outputKey", + "name": "output_key", "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key to use for organizing the response data" }, { - "name": "enrichFeeTokens", + "name": "enrich_fee_tokens", "in": "query", "schema": { "type": "string", @@ -270,12 +270,12 @@ "example": "1,56" }, { - "name": "outputKey", + "name": "output_key", "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key to use for organizing the response data" } @@ -361,6 +361,275 @@ } } }, + "/tokens/{tokenCanonicalSymbol}": { + "get": { + "tags": ["tokens"], + "summary": "Retrieve detailed token information with custom finality data", + "description": "Returns detailed information about a specific CCIP token, including chain-specific configurations and custom finality settings (minBlockConfirmation and hasCustomFinality).", + "operationId": "getTokenDetail", + "parameters": [ + { + "name": "tokenCanonicalSymbol", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The canonical symbol for the token (e.g., LINK, USDC, BETS)", + "example": "BETS" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + }, + { + "name": "output_key", + "in": "query", + "schema": { + "type": "string", + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" + }, + "description": "Key to use for organizing the response data by chain" + } + ], + "responses": { + "200": { + "description": "Successful response with token detail data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenDetailApiResponse" + }, + "examples": { + "withCustomFinality": { + "summary": "Token with custom finality enabled", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "tokenSymbol": "BETS", + "chainCount": 2 + }, + "data": { + "43114": { + "chainId": 43114, + "chainName": "Avalanche", + "decimals": 18, + "destinations": ["1", "137"], + "name": "BetSwirl v2", + "poolAddress": "0xe9d2...9C06", + "poolType": "burnMint", + "symbol": "BETS", + "tokenAddress": "0x9402...E6e5", + "hasCustomFinality": true, + "minBlockConfirmation": 5 + }, + "1": { + "chainId": 1, + "chainName": "Ethereum", + "decimals": 18, + "destinations": ["43114"], + "name": "BetSwirl v2", + "poolAddress": "0x1234...5678", + "poolType": "lockRelease", + "symbol": "BETS", + "tokenAddress": "0xabcd...ef01", + "hasCustomFinality": false, + "minBlockConfirmation": 0 + } + } + } + }, + "unavailable": { + "summary": "Token with unavailable finality data", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "456e7890-e89b-12d3-a456-426614174000", + "tokenSymbol": "USDC", + "chainCount": 1 + }, + "data": { + "1": { + "chainId": 1, + "chainName": "Ethereum", + "decimals": 6, + "destinations": ["43114"], + "name": "USD Coin", + "poolAddress": "0x1234...5678", + "poolType": "burnMint", + "symbol": "USDC", + "tokenAddress": "0xA0b8...c4d2", + "hasCustomFinality": null, + "minBlockConfirmation": null + } + } + } + } + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Token not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "NOT_FOUND", + "message": "Token 'INVALID' not found" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/tokens/{tokenCanonicalSymbol}/finality": { + "get": { + "tags": ["tokens"], + "summary": "Retrieve token finality data only", + "description": "Returns only custom finality information (hasCustomFinality and minBlockConfirmation) for a specific token across all chains. This is a lightweight endpoint that returns minimal data for UI components that only need finality status.", + "operationId": "getTokenFinality", + "parameters": [ + { + "name": "tokenCanonicalSymbol", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The canonical symbol for the token (e.g., LINK, USDC, BETS)", + "example": "BETS" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + }, + { + "name": "output_key", + "in": "query", + "schema": { + "type": "string", + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" + }, + "description": "Key to use for organizing the response data by chain" + } + ], + "responses": { + "200": { + "description": "Successful response with token finality data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenFinalityApiResponse" + }, + "examples": { + "mixedFinality": { + "summary": "Token with mixed finality states", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "tokenSymbol": "BETS", + "chainCount": 3 + }, + "data": { + "avalanche-mainnet": { + "hasCustomFinality": true, + "minBlockConfirmation": 5 + }, + "ethereum-mainnet": { + "hasCustomFinality": false, + "minBlockConfirmation": 0 + }, + "polygon-mainnet": { + "hasCustomFinality": null, + "minBlockConfirmation": null + } + } + } + } + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Token not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "NOT_FOUND", + "message": "Token 'INVALID' not found" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/lanes": { "get": { "tags": ["lanes"], @@ -379,7 +648,7 @@ "description": "The network environment to query" }, { - "name": "sourceChainId", + "name": "source_chain_id", "in": "query", "schema": { "type": "string" @@ -388,7 +657,7 @@ "example": "1,56" }, { - "name": "destinationChainId", + "name": "destination_chain_id", "in": "query", "schema": { "type": "string" @@ -397,7 +666,7 @@ "example": "137,42161" }, { - "name": "sourceSelector", + "name": "source_selector", "in": "query", "schema": { "type": "string" @@ -406,7 +675,7 @@ "example": "5009297550715157269" }, { - "name": "destinationSelector", + "name": "destination_selector", "in": "query", "schema": { "type": "string" @@ -415,7 +684,7 @@ "example": "4949039107694359620" }, { - "name": "sourceInternalId", + "name": "source_internal_id", "in": "query", "schema": { "type": "string" @@ -424,7 +693,7 @@ "example": "ethereum-mainnet" }, { - "name": "destinationInternalId", + "name": "destination_internal_id", "in": "query", "schema": { "type": "string" @@ -442,12 +711,12 @@ "example": "1.6.0" }, { - "name": "outputKey", + "name": "output_key", "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key format to use for organizing the lane keys in the response" } @@ -522,8 +791,500 @@ } } }, - "400": { - "description": "Bad request - invalid parameters", + "400": { + "description": "Bad request - invalid parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-chain-id/{source}/{destination}": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve lane details by chain ID", + "description": "Returns detailed information about a specific CCIP lane identified by source and destination chain IDs", + "operationId": "getLaneByChainId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain ID (e.g., 1 for Ethereum, 56 for BSC)", + "example": "1" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain ID", + "example": "43114" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with lane details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LaneDetailApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-chain-id/{source}/{destination}/supported-tokens": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve supported tokens with rate limits by chain ID", + "description": "Returns only the supported tokens and their rate limit configurations for a lane identified by chain IDs", + "operationId": "getSupportedTokensByChainId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain ID", + "example": "1" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain ID", + "example": "43114" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with supported tokens data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupportedTokensApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-selector/{source}/{destination}": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve lane details by CCIP selector", + "description": "Returns detailed information about a specific CCIP lane identified by source and destination CCIP selectors", + "operationId": "getLaneBySelector", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain CCIP selector", + "example": "5009297550715157269" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain CCIP selector", + "example": "6433500567565415381" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with lane details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LaneDetailApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-selector/{source}/{destination}/supported-tokens": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve supported tokens with rate limits by CCIP selector", + "description": "Returns only the supported tokens and their rate limit configurations for a lane identified by CCIP selectors", + "operationId": "getSupportedTokensBySelector", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain CCIP selector", + "example": "5009297550715157269" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain CCIP selector", + "example": "6433500567565415381" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with supported tokens data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupportedTokensApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-internal-id/{source}/{destination}": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve lane details by internal ID", + "description": "Returns detailed information about a specific CCIP lane identified by source and destination internal IDs", + "operationId": "getLaneByInternalId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain internal identifier", + "example": "ethereum-mainnet" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain internal identifier", + "example": "avalanche-mainnet" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with lane details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LaneDetailApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-internal-id/{source}/{destination}/supported-tokens": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve supported tokens with rate limits by internal ID", + "description": "Returns only the supported tokens and their rate limit configurations for a lane identified by internal IDs", + "operationId": "getSupportedTokensByInternalId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain internal identifier", + "example": "ethereum-mainnet" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain internal identifier", + "example": "avalanche-mainnet" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with supported tokens data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupportedTokensApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", "content": { "application/json": { "schema": { @@ -920,6 +1681,198 @@ } } }, + "LaneDetailApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/LaneDetailMetadata" + }, + "data": { + "$ref": "#/components/schemas/LaneDetailWithRateLimits" + } + }, + "description": "Response for a single lane detail query with rate limits included" + }, + "LaneDetailWithRateLimits": { + "type": "object", + "required": ["sourceChain", "destinationChain", "onRamp", "offRamp", "supportedTokens"], + "properties": { + "sourceChain": { + "$ref": "#/components/schemas/ChainInfo" + }, + "destinationChain": { + "$ref": "#/components/schemas/ChainInfo" + }, + "onRamp": { + "type": "object", + "required": ["address", "version"], + "properties": { + "address": { + "type": "string", + "description": "OnRamp contract address" + }, + "version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$", + "description": "Normalized semantic version of the OnRamp contract" + }, + "enforceOutOfOrder": { + "type": "boolean", + "description": "Whether the OnRamp enforces out-of-order execution" + } + } + }, + "offRamp": { + "type": "object", + "required": ["address", "version"], + "properties": { + "address": { + "type": "string", + "description": "OffRamp contract address" + }, + "version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$", + "description": "Normalized semantic version of the OffRamp contract" + } + } + }, + "supportedTokens": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenRateLimits" + }, + "description": "Supported tokens with their rate limit configurations" + } + }, + "description": "Lane details with rate limits included in supportedTokens" + }, + "TokenRateLimits": { + "type": "object", + "properties": { + "standard": { + "oneOf": [{ "$ref": "#/components/schemas/RateLimiterDirections" }, { "type": "null" }], + "description": "Standard rate limit configuration (null if unavailable)" + }, + "custom": { + "oneOf": [{ "$ref": "#/components/schemas/RateLimiterDirections" }, { "type": "null" }], + "description": "Custom (FTF) rate limit configuration (null if unavailable)" + } + }, + "description": "Rate limit configurations for a token" + }, + "RateLimiterDirections": { + "type": "object", + "properties": { + "in": { + "$ref": "#/components/schemas/RateLimiterConfig" + }, + "out": { + "$ref": "#/components/schemas/RateLimiterConfig" + } + }, + "description": "Inbound and outbound rate limiter configurations" + }, + "RateLimiterConfig": { + "type": "object", + "required": ["capacity", "isEnabled", "rate"], + "properties": { + "capacity": { + "type": "string", + "description": "Maximum capacity in token units (wei for ERC20)" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether the rate limiter is enabled" + }, + "rate": { + "type": "string", + "description": "Refill rate per second in token units" + } + }, + "description": "Single direction rate limiter configuration" + }, + "LaneDetailMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "sourceChain", "destinationChain"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "The network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request" + }, + "sourceChain": { + "type": "string", + "description": "Source chain identifier used in the request" + }, + "destinationChain": { + "type": "string", + "description": "Destination chain identifier used in the request" + } + } + }, + "SupportedTokensApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/SupportedTokensMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenRateLimits" + }, + "description": "Supported tokens with their rate limit configurations" + } + }, + "description": "Response containing only supported tokens and their rate limits" + }, + "SupportedTokensMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "sourceChain", "destinationChain", "tokenCount"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "The network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request" + }, + "sourceChain": { + "type": "string", + "description": "Source chain identifier used in the request" + }, + "destinationChain": { + "type": "string", + "description": "Destination chain identifier used in the request" + }, + "tokenCount": { + "type": "integer", + "minimum": 0, + "description": "Number of supported tokens returned" + } + } + }, "ErrorResponse": { "type": "object", "required": ["error", "message"], @@ -1046,6 +1999,107 @@ } } }, + "TokenDetailChainData": { + "type": "object", + "description": "Extended token chain data with custom finality information", + "allOf": [ + { + "$ref": "#/components/schemas/TokenChainData" + }, + { + "type": "object", + "properties": { + "hasCustomFinality": { + "type": "boolean", + "nullable": true, + "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null if data is unavailable." + }, + "minBlockConfirmation": { + "type": "integer", + "nullable": true, + "description": "Minimum block confirmations required. Null if data is unavailable." + } + } + } + ] + }, + "TokenDetailMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "tokenSymbol", "chainCount"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "Network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for this request" + }, + "tokenSymbol": { + "type": "string", + "description": "Canonical symbol of the requested token" + }, + "chainCount": { + "type": "integer", + "description": "Number of chains this token is available on" + } + } + }, + "TokenDetailApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/TokenDetailMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenDetailChainData" + }, + "description": "Token data indexed by chain ID/selector, including custom finality information" + } + } + }, + "TokenFinalityData": { + "type": "object", + "description": "Finality data for a token on a specific chain", + "properties": { + "hasCustomFinality": { + "type": "boolean", + "nullable": true, + "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null if data is unavailable." + }, + "minBlockConfirmation": { + "type": "integer", + "nullable": true, + "description": "Minimum block confirmations required. Null if data is unavailable." + } + } + }, + "TokenFinalityApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/TokenDetailMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenFinalityData" + }, + "description": "Finality data indexed by chain ID/selector" + } + } + }, "TokenDetails": { "type": "object", "required": ["symbol", "lanes", "chains"], @@ -1120,6 +2174,88 @@ "description": "List of tokens that were ignored due to configuration issues" } } + }, + "RateLimitsMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "sourceChain", "destinationChain", "tokenCount"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "The network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request" + }, + "sourceChain": { + "type": "string", + "description": "Source chain internal identifier" + }, + "destinationChain": { + "type": "string", + "description": "Destination chain internal identifier" + }, + "tokenCount": { + "type": "integer", + "minimum": 0, + "description": "Number of tokens in the response" + } + } + }, + "RateLimiterConfig": { + "type": "object", + "required": ["capacity", "isEnabled", "rate"], + "properties": { + "capacity": { + "type": "string", + "description": "Maximum token capacity for rate limiting (in token smallest unit as string)" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether rate limiting is enabled for this direction" + }, + "rate": { + "type": "string", + "description": "Rate of token replenishment per second (in token smallest unit as string)" + } + } + }, + "TokenRateLimits": { + "type": "object", + "properties": { + "in": { + "$ref": "#/components/schemas/RateLimiterConfig", + "description": "Inbound rate limiter configuration (tokens coming into destination chain)" + }, + "out": { + "$ref": "#/components/schemas/RateLimiterConfig", + "description": "Outbound rate limiter configuration (tokens leaving source chain)" + } + }, + "description": "Rate limiter configurations for both inbound and outbound directions" + }, + "RateLimitsApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/RateLimitsMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenRateLimits" + }, + "description": "Rate limits data indexed by token symbol" + } + } } } } diff --git a/public/assets/chains/arc.svg b/public/assets/chains/arc.svg new file mode 100644 index 00000000000..f5e0184260d --- /dev/null +++ b/public/assets/chains/arc.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/assets/chains/dogeos.svg b/public/assets/chains/dogeos.svg new file mode 100644 index 00000000000..6ab4d7411d9 --- /dev/null +++ b/public/assets/chains/dogeos.svg @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/chains/morph.svg b/public/assets/chains/morph.svg new file mode 100644 index 00000000000..fed6187a96d --- /dev/null +++ b/public/assets/chains/morph.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/chains/stable.svg b/public/assets/chains/stable.svg new file mode 100644 index 00000000000..f4b2e783bb9 --- /dev/null +++ b/public/assets/chains/stable.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/assets/chains/tempo.svg b/public/assets/chains/tempo.svg new file mode 100644 index 00000000000..cee91482315 --- /dev/null +++ b/public/assets/chains/tempo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/icons/add.svg b/public/assets/icons/add.svg new file mode 100644 index 00000000000..690aad5bb2f --- /dev/null +++ b/public/assets/icons/add.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/icons/generic-verifier.svg b/public/assets/icons/generic-verifier.svg new file mode 100644 index 00000000000..275f1c8400c --- /dev/null +++ b/public/assets/icons/generic-verifier.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/changelog.json b/public/changelog.json index de6336e6eb0..5f5cb2f37fd 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -24,6 +24,10 @@ "displayName": "Arbitrum", "iconUrl": "https://docs.chain.link/assets/chains/arbitrum.svg" }, + "arc": { + "displayName": "Arc", + "iconUrl": "https://docs.chain.link/assets/chains/arc.svg" + }, "astar": { "displayName": "Astar", "iconUrl": "https://docs.chain.link/assets/chains/astar.svg" @@ -88,6 +92,10 @@ "displayName": "Cronos zkEVM", "iconUrl": "https://docs.chain.link/assets/chains/cronoszkevm.svg" }, + "dogeos": { + "displayName": "DogeOS", + "iconUrl": "https://docs.chain.link/assets/chains/dogeos.svg" + }, "ethereum": { "displayName": "Ethereum", "iconUrl": "https://docs.chain.link/assets/chains/ethereum.svg" @@ -148,6 +156,10 @@ "displayName": "Janction", "iconUrl": "https://docs.chain.link/assets/chains/janction.svg" }, + "jovay": { + "displayName": "Jovay", + "iconUrl": "https://docs.chain.link/assets/chains/jovay.svg" + }, "kaia": { "displayName": "Kaia", "iconUrl": "https://docs.chain.link/assets/chains/kaia.svg" @@ -220,6 +232,10 @@ "displayName": "Moonriver", "iconUrl": "https://docs.chain.link/assets/chains/moonriver.svg" }, + "morph": { + "displayName": "Morph", + "iconUrl": "https://docs.chain.link/assets/chains/morph.svg" + }, "neox": { "displayName": "Neo X", "iconUrl": "https://docs.chain.link/assets/chains/neox.svg" @@ -232,6 +248,10 @@ "displayName": "OP", "iconUrl": "https://docs.chain.link/assets/chains/optimism.svg" }, + "pharos": { + "displayName": "Pharos", + "iconUrl": "https://docs.chain.link/assets/chains/pharos.svg" + }, "plasma": { "displayName": "Plasma", "iconUrl": "https://docs.chain.link/assets/chains/plasma.svg" @@ -284,6 +304,10 @@ "displayName": "Sonic", "iconUrl": "https://docs.chain.link/assets/chains/sonic.svg" }, + "stable": { + "displayName": "Stable", + "iconUrl": "https://docs.chain.link/assets/chains/stable.svg" + }, "starknet": { "displayName": "Starknet", "iconUrl": "https://docs.chain.link/assets/chains/starknet.svg" @@ -304,6 +328,10 @@ "displayName": "Treasure", "iconUrl": "https://docs.chain.link/assets/chains/treasure.svg" }, + "tempo": { + "displayName": "Tempo", + "iconUrl": "https://docs.chain.link/assets/chains/tempo.svg" + }, "tron": { "displayName": "TRON", "iconUrl": "https://docs.chain.link/assets/chains/tron.svg" @@ -342,87 +370,74 @@ } }, "data": [ + { + "category": "release", + "date": "2026-02-11", + "description": "Chainlink introduces Tokenized Equity Feeds, providing continuous 24/5 pricing for tokenized representations of US equities and ETFs across all major trading sessions. Ondo Finance is our first partner, with feeds now available on Ethereum Mainnet. View available feeds and learn more about [Tokenized Equity Feeds](https://docs.chain.link/data-feeds/tokenized-equity-feeds).", + "title": "Tokenized Equity Feeds Launch with Ondo Finance", + "topic": "Data Feeds" + }, { "category": "integration", - "date": "2025-11-25", - "description": "Chainlink CCIP expands support to new blockchains:", + "date": "2026-02-10", + "description": "Chainlink CCIP expands support to new testnets:", "newNetworks": [ { - "displayName": "Pharos Atlantic Testnet", - "network": "pharos", - "url": "https://docs.chain.link/ccip/directory/testnet/chain/pharos-atlantic-testnet" + "displayName": "Arc Network Testnet", + "network": "arc", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/arc-testnet" + }, + { + "displayName": "DogeOS Chikyu Testnet", + "network": "dogeos", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/dogeos-testnet-chikyu" } ], - "relatedNetworks": ["pharos"], - "title": "CCIP Expands to Pharos Atlantic Testnet", + "relatedNetworks": ["arc", "dogeos"], + "title": "CCIP on Arc Network Testnet and DogeOS Chikyu Testnet", "topic": "CCIP" }, { - "category": "integration", - "date": "2025-11-24", - "description": "Chainlink Data Streams is available for Monad Mainnet. The verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", - "relatedNetworks": ["monad"], - "title": "Data Streams Expands to Monad Mainnet", - "topic": "Data Streams" + "category": "release", + "date": "2026-02-09", + "description": "CRE CLI version 1.0.10 is now available. This release fixes secret injection for the Confidential HTTP capability in the simulator — template placeholders now resolve correctly during simulation.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.9...v1.0.10)", + "title": "CRE CLI v1.0.10", + "topic": "CRE" }, { "category": "integration", - "date": "2025-11-24", - "description": "Chainlink Data Feeds is available on Monad Mainnet. View the available price feed information on the [Price Feed Addresses](https://docs.chain.link/data-feeds/price-feeds/addresses?network=monad&page=1) page.", - "relatedNetworks": ["monad"], - "title": "Data Feeds Expands to Monad Mainnet", + "date": "2026-02-09", + "description": "Chainlink Data Feeds is available on MegaETH Mainnet. View the available price feed information on the [Price Feed Addresses](https://docs.chain.link/data-feeds/price-feeds/addresses?network=megaeth&page=1) page.", + "relatedNetworks": ["megaeth"], + "title": "Data Feeds Expands to MegaETH Mainnet", "topic": "Data Feeds" }, { "category": "integration", - "date": "2025-11-24", - "description": "Chainlink CCIP expands support to new blockchains:", - "newNetworks": [ - { - "displayName": "Henesys Mainnet", - "network": "nexon", - "url": "https://docs.chain.link/ccip/directory/mainnet/chain/nexon-mainnet-henesys" - }, - { - "displayName": "Monad Mainnet", - "network": "monad", - "url": "https://docs.chain.link/ccip/directory/mainnet/chain/monad-mainnet" - } - ], - "relatedNetworks": ["henesys", "monad"], - "title": "CCIP on Nexon Mainnet and Monad Mainnet", - "topic": "CCIP" + "date": "2026-02-09", + "description": "Chainlink Data Streams is available for MegaETH Mainnet. The verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", + "relatedNetworks": ["megaeth"], + "title": "Data Streams Expands to MegaETH Mainnet", + "topic": "Data Streams" }, { "category": "integration", - "date": "2025-11-23", - "description": "Newly supported tokens: BOB, WHLP, wstETH", - "relatedTokens": [ - { - "assetName": "BOB", - "baseAsset": "BOB", - "url": "https://docs.chain.link/ccip/directory/mainnet/token/BOB", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bob.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" - }, - { - "assetName": "Wrapped HLP", - "baseAsset": "WHLP", - "url": "https://docs.chain.link/ccip/directory/mainnet/token/WHLP", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/whlp.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" - }, + "date": "2026-02-09", + "description": "Chainlink CCIP expands support to MegaETH Mainnet:", + "newNetworks": [ { - "assetName": "Wrapped stETH", - "baseAsset": "wstETH", - "url": "https://docs.chain.link/ccip/directory/mainnet/token/wstETH", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + "displayName": "MegaETH Mainnet", + "network": "megaeth", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/megaeth-mainnet" } ], - "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "relatedNetworks": ["megaeth"], + "title": "CCIP on MegaETH Mainnet", "topic": "CCIP" }, { "category": "integration", - "date": "2025-11-23", + "date": "2026-02-08", "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", "relatedNetworks": [ "0g", @@ -452,9 +467,11 @@ "linea", "mantle", "metis", + "monad", "opbnb", "optimism", "polygon", + "pharos", "plasma", "ronin", "scroll", @@ -470,32 +487,88 @@ ], "relatedTokens": [ { - "assetName": "sUSDu / USDU Exchange Rate", - "baseAsset": "sUSDu ", - "quoteAsset": "USDU", - "url": "https://data.chain.link/streams/susdu%20-usdu-exchangerate-streams", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdu.webp" + "assetName": "AUSD", + "baseAsset": "AUSD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ausd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ausd.webp" }, { - "assetName": "Unit Bitcoin", - "baseAsset": "UBTC", + "assetName": "Avalanche Bridged BTC", + "baseAsset": "BTC.B", "quoteAsset": "USD", - "url": "https://data.chain.link/streams/ubtc-usd", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ubtc.webp" + "url": "https://data.chain.link/streams/btc.b-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.b.webp" }, { - "assetName": "Unit Ethereum", - "baseAsset": "UETH", + "assetName": "Euro Coin", + "baseAsset": "EURC", "quoteAsset": "USD", - "url": "https://data.chain.link/streams/ueth-usd", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ueth.webp" + "url": "https://data.chain.link/streams/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" }, { - "assetName": "Unit Solana", - "baseAsset": "USOL", + "assetName": "FBTC / BTC Exchange Rate", + "baseAsset": "FBTC", + "quoteAsset": "BTC", + "url": "https://docs.chain.link/data-streams/exchange-rate-streams?search=FBTC&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/fbtc.webp" + }, + { + "assetName": "Lighter", + "baseAsset": "LIT", "quoteAsset": "USD", - "url": "https://data.chain.link/streams/usol-usd", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usol.webp" + "url": "https://data.chain.link/streams/lit-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lit.webp" + }, + { + "assetName": "Meteora", + "baseAsset": "MET", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/met-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/met.webp" + }, + { + "assetName": "OpenEden", + "baseAsset": "EDEN", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/eden-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eden.webp" + }, + { + "assetName": "Resolv", + "baseAsset": "RESOLV", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/resolv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/resolv.webp" + }, + { + "assetName": "The White Whale", + "baseAsset": "WHITEWHALE", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/whitewhale-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/whitewhale.webp" + }, + { + "assetName": "TRY", + "baseAsset": "TRY", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/try-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/try.webp" + }, + { + "assetName": "Turtle", + "baseAsset": "TURTLE", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/turtle-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/turtle.webp" + }, + { + "assetName": "USDM", + "baseAsset": "USDM", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdm-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdm.webp" } ], "title": "Added support to Data Streams", @@ -503,85 +576,2301 @@ }, { "category": "integration", - "date": "2025-11-23", + "date": "2026-02-08", "description": "New Data Feeds available:", - "relatedNetworks": ["optimism", "ethereum", "base", "bnb-chain"], + "relatedNetworks": ["megaeth", "avalanche"], "relatedTokens": [ { - "assetName": "sUSDai", - "baseAsset": "sUSDai", - "quoteAsset": "USDai", - "network": "base", - "url": "https://data.chain.link/feeds/base/base/susdai-usdai-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdai.webp" + "assetName": "Copper", + "baseAsset": "XCU", + "quoteAsset": "USD", + "network": "avalanche", + "url": "https://data.chain.link/feeds/avalanche/mainnet/xcu-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xcu.webp" }, { - "assetName": "sUSDD / USDD Exchange Rate", - "baseAsset": "sUSDD", - "quoteAsset": "USDD", - "network": "ethereum", - "url": "https://data.chain.link/feeds/ethereum/mainnet/susdd-usdd-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdd.webp" + "assetName": "GLV [AVAX-USDC]", + "baseAsset": "GLV", + "quoteAsset": "USD", + "network": "avalanche", + "url": "https://data.chain.link/feeds/avalanche/mainnet/glv-%5Bavax-usdc%5D-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/glv.webp" }, { - "assetName": "sUSDD / USDD Exchange Rate", - "baseAsset": "sUSDD", - "quoteAsset": "USDD", + "assetName": "Mountain Protocol USD", + "baseAsset": "USDM", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH&page=1&search=USDM", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdm.webp" + }, + { + "assetName": "Splashing Staked SEI", + "baseAsset": "SPSEI", + "quoteAsset": "SEI", + "network": "avalanche", + "url": "https://data.chain.link/feeds/avalanche/mainnet/spsei-sei-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/spsei.webp" + }, + { + "assetName": "WSRUSD / RUSD Exchange Rate", + "baseAsset": "WSRUSD", + "quoteAsset": "RUSD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH&search=WSR&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsrusd.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-02-06", + "description": "CRE CLI version 1.0.9 is now available. This release adds experimental [Confidential HTTP](https://docs.chain.link/cre/capabilities/confidential-http) capability support in the simulator, allowing you to simulate workflows with privacy-preserving API calls.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.8...v1.0.9)", + "title": "CRE CLI v1.0.9", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-02-06", + "description": "CRE CLI version 1.0.8 is now available. This release changes `chain-id` to `chain-selector` in simulator settings, adds support for longer workflow names, and fixes a logic bug in the template contract MessageEmitter.sol.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.7...v1.0.8)", + "title": "CRE CLI v1.0.8", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-02-02", + "description": "We have updated the Selecting Quality Data Feeds guide to include risk level indicators for Custom Feeds, stablecoin-specific considerations, and clarified developer responsibilities across all feed categories. [Learn more](https://docs.chain.link/data-feeds/selecting-data-feeds).", + "title": "Updated Selecting Quality Data Feeds Guide", + "topic": "Data Feeds" + }, + { + "category": "deprecation", + "date": "2026-02-02", + "description": "Support for select Data Stream feeds have been deprecated due to a lack of active users. Check [the list of Deprecating Data Streams to learn more](https://docs.chain.link/data-streams/deprecating-streams).\n\n**Note:** Teams interested in re-enabling a deprecated Data Stream feed (or requesting a new one) can [reach out to discuss requirements, expected usage, and deployment timelines](https://chain.link/contact).", + "title": "Deprecated Data Stream Feeds", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-02-01", + "description": "New Data Feeds available:", + "relatedNetworks": ["bnb-chain", "hyperevm", "celo"], + "relatedTokens": [ + { + "assetName": "Aave", + "baseAsset": "AAVE", + "quoteAsset": "USD", "network": "bnb-chain", - "url": "https://data.chain.link/feeds/bsc/mainnet/susdd-usdd-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdd.webp" + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&search=aave&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/aave.webp" }, { - "assetName": "USDai", - "baseAsset": "USDAI", + "assetName": "BEHYPE", + "baseAsset": "BEHYPE", + "quoteAsset": "HYPE", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=behype&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/behype.webp" + }, + { + "assetName": "Bitcoin", + "baseAsset": "BTC", "quoteAsset": "USD", - "network": "base", - "url": "https://data.chain.link/feeds/base/base/usdai-usd", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdai.webp" + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" }, { - "assetName": "USDD / USDC Exchange Rate", - "baseAsset": "USDD", - "quoteAsset": "USDC", - "network": "ethereum", - "url": "https://data.chain.link/feeds/ethereum/mainnet/usdd-usdc-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" }, { - "assetName": "USDD / USDC Exchange Rate", - "baseAsset": "USDD", - "quoteAsset": "USDC", + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=BTC&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Bitcoin Cash", + "baseAsset": "BCH", + "quoteAsset": "USD", "network": "bnb-chain", - "url": "https://data.chain.link/feeds/bsc/mainnet/usdd-usdc-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bch.webp" }, { - "assetName": "USDD / USDT Exchange Rate", - "baseAsset": "USDD", - "quoteAsset": "USDT", - "network": "ethereum", - "url": "https://data.chain.link/feeds/ethereum/mainnet/usdd-usdt-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + "assetName": "BNB", + "baseAsset": "BNB", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bnb.webp" }, { - "assetName": "USDD / USDT Exchange Rate", - "baseAsset": "USDD", - "quoteAsset": "USDT", + "assetName": "BNB", + "baseAsset": "BNB", + "quoteAsset": "USD", "network": "bnb-chain", - "url": "https://data.chain.link/feeds/bsc/mainnet/usdd-usdt-exchange-rate", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" - } - ], - "title": "Added support to Data Feeds", - "topic": "Data Feeds" - }, - { + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bnb.webp" + }, + { + "assetName": "Cardano", + "baseAsset": "ADA", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ada.webp" + }, + { + "assetName": "Chainlink", + "baseAsset": "LINK", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/link.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=USDC&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "DAI", + "baseAsset": "DAI", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dai.webp" + }, + { + "assetName": "Dogecoin", + "baseAsset": "DOGE", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/doge.webp" + }, + { + "assetName": "Ethena Staked USDe", + "baseAsset": "SUSDE", + "quoteAsset": "USDE", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susde.webp" + }, + { + "assetName": "Ethena USDe", + "baseAsset": "USDE", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usde.webp" + }, + { + "assetName": "Ethena USDe", + "baseAsset": "USDE", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=Ethena+USDe&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usde.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=ETH&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Filecoin", + "baseAsset": "FIL", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/fil.webp" + }, + { + "assetName": "First Digital USD", + "baseAsset": "FDUSD", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/fdusd.webp" + }, + { + "assetName": "Hyperliquid", + "baseAsset": "HYPE", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://data.chain.link/feeds/hyperliquid/hyperliquid/hype-usd-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/hype.webp" + }, + { + "assetName": "KHYPE", + "baseAsset": "KHYPE", + "quoteAsset": "HYPE", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=HYPE&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/khype.webp" + }, + { + "assetName": "Kinetiq Staked HYPE", + "baseAsset": "KHYPE", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=KHYPE&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/khype.webp" + }, + { + "assetName": "Litecoin", + "baseAsset": "LTC", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ltc.webp" + }, + { + "assetName": "PancakeSwap", + "baseAsset": "CAKE", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cake.webp" + }, + { + "assetName": "Solana", + "baseAsset": "SOL", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sol.webp" + }, + { + "assetName": "Solana", + "baseAsset": "SOL", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=SOL&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sol.webp" + }, + { + "assetName": "Solv Protocol Staked BTC", + "baseAsset": "xSolvBTC", + "quoteAsset": "SolvBTC", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xsolvbtc.webp" + }, + { + "assetName": "stCELO / CELO Exchange Rate", + "baseAsset": "stCELO", + "quoteAsset": "CELO", + "network": "celo", + "url": "https://data.chain.link/feeds/celo/mainnet/stcelo-celo-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/stcelo.webp" + }, + { + "assetName": "Tether Gold", + "baseAsset": "XAUT", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=XAUT&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xaut.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=USDT&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + }, + { + "assetName": "Theo Short Duration US Treasury Fund", + "baseAsset": "THBILL", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=THBILL&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/thbill.webp" + }, + { + "assetName": "Tron", + "baseAsset": "TRX", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/trx.webp" + }, + { + "assetName": "True USD", + "baseAsset": "TUSD", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tusd.webp" + }, + { + "assetName": "Trust Wallet Token", + "baseAsset": "TWT", + "quoteAsset": "BNB", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/twt.webp" + }, + { + "assetName": "Uniswap", + "baseAsset": "UNI", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uni.webp" + }, + { + "assetName": "Unit Bitcoin", + "baseAsset": "UBTC", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=UBTC&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ubtc.webp" + }, + { + "assetName": "Unit Solana", + "baseAsset": "USOL", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=USOL&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usol.webp" + }, + { + "assetName": "United Stables", + "baseAsset": "U", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/u.webp" + }, + { + "assetName": "USDH", + "baseAsset": "USDH", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=USDH&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdh.webp" + }, + { + "assetName": "Venus", + "baseAsset": "XVS", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xvs.webp" + }, + { + "assetName": "World Liberty Financial USD", + "baseAsset": "USD1", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usd1.webp" + }, + { + "assetName": "wstETH / stETH Exchange Rate", + "baseAsset": "wstETH", + "quoteAsset": "stETH", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp" + }, + { + "assetName": "WSTHYPE / STHYPE Exchange Rate", + "baseAsset": "WSTHYPE", + "quoteAsset": "STHYPE", + "network": "hyperevm", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=hyperevm&search=WSTHYPE&showSvr=true&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsthype.webp" + }, + { + "assetName": "XRP", + "baseAsset": "XRP", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=bnb-chain&showSvr=true", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xrp.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-01-29", + "description": "CRE now supports additional testnets for workflow simulation: Apechain Curtis, Arc Testnet, Hyperliquid Testnet, Ink Sepolia, Jovay Testnet, Linea Sepolia, Plasma Testnet, and World Chain Sepolia.\n\n**Required versions:** CLI v1.0.7+, Go SDK v1.1.4+, TS SDK v1.0.7+\n\nSee the [Supported Networks](https://docs.chain.link/cre/supported-networks) page for chain names and version requirements.", + "relatedNetworks": ["apechain", "arc", "hyperliquid", "ink", "jovay", "linea", "plasma", "worldchain"], + "title": "CRE Expands Testnet Support", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-01-29", + "description": "CRE CLI version 1.0.7 is now available with internal improvements and updates to the bundled TypeScript SDK (now v1.0.7).\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.6...v1.0.7)", + "title": "CRE CLI v1.0.7", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-01-29", + "description": "TypeScript SDK version 1.0.7 is now available with internal improvements.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.5...v1.0.7)", + "title": "CRE TS SDK v1.0.7", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-01-28", + "description": "TypeScript SDK version 1.0.5 fixes an issue with `runtime.now()` returning incorrect timestamps. See [Time in CRE](https://docs.chain.link/cre/concepts/time-in-cre) for usage details.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.4...v1.0.5)", + "title": "CRE TS SDK v1.0.5", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-01-27", + "description": "Chainlink Data Streams is available for Pharos Mainnet and Testnet. The verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", + "relatedNetworks": ["pharos"], + "title": "Data Streams Expands to Pharos Mainnet and Testnet", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-01-26", + "description": "CRE now supports ZKSync Era mainnet and testnet for workflow simulation and production deployment.\n\n**Required versions:** CLI v1.0.6+, Go SDK v1.1.3+ (mainnet) / v1.1.2+ (testnet), TS SDK v1.0.7+\n\nSee the [Supported Networks](https://docs.chain.link/cre/supported-networks) page for chain names and version requirements.", + "relatedNetworks": ["zksync"], + "title": "CRE Expands to ZKSync Era", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-01-26", + "description": "TypeScript SDK version 1.0.4 is now available with internal improvements.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.3...v1.0.4)", + "title": "CRE TS SDK v1.0.4", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-01-25", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "aptos", + "arbitrum", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "AbbVie Inc", + "baseAsset": "ABBV", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/abbv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/abbv.webp" + }, + { + "assetName": "Alphabet Inc - A", + "baseAsset": "GOOGL", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/googl-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/googl.webp" + }, + { + "assetName": "Amazon.com Inc", + "baseAsset": "AMZN", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/amzn-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/amzn.webp" + }, + { + "assetName": "Apple Inc", + "baseAsset": "AAPL", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/aapl-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/aapl.webp" + }, + { + "assetName": "Bitmine Immersion Technologies", + "baseAsset": "BMNR", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/bmnr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bmnr.webp" + }, + { + "assetName": "BOB (Build on Bitcoin)", + "baseAsset": "BOB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/bob-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bob.webp" + }, + { + "assetName": "CBTC Proof of Reserves", + "baseAsset": "CBTC", + "quoteAsset": "POR", + "url": "https://data.chain.link/streams/cbtc-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cbtc.webp" + }, + { + "assetName": "Circle Internet Group Inc", + "baseAsset": "CRCL", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/crcl-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/crcl.webp" + }, + { + "assetName": "Coinbase Global Inc", + "baseAsset": "COIN", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/coin-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/coin.webp" + }, + { + "assetName": "Degen (Base)", + "baseAsset": "DEGEN", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/degen-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/degen.webp" + }, + { + "assetName": "Invesco QQQ Trust Series 1 ETF", + "baseAsset": "QQQ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/qqq-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/qqq.webp" + }, + { + "assetName": "Merck & Co Inc", + "baseAsset": "MRK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mrk-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mrk.webp" + }, + { + "assetName": "Meta Platforms Inc", + "baseAsset": "META", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/meta-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/meta.webp" + }, + { + "assetName": "Metamask USD", + "baseAsset": "MUSD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/musd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/musd.webp" + }, + { + "assetName": "Microsoft Corp", + "baseAsset": "MSFT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/msft-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/msft.webp" + }, + { + "assetName": "Microstrategy Inc Class A", + "baseAsset": "MSTR", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mstr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mstr.webp" + }, + { + "assetName": "NVIDIA Corp", + "baseAsset": "NVDA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/nvda-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nvda.webp" + }, + { + "assetName": "Oracle Corp", + "baseAsset": "ORCL", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/orcl-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/orcl.webp" + }, + { + "assetName": "Palantir Technologies Inc", + "baseAsset": "PLTR", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/pltr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/pltr.webp" + }, + { + "assetName": "Robinhood Markets Inc", + "baseAsset": "HOOD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/hood-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/hood.webp" + }, + { + "assetName": "SPDR S&P 500 ETF", + "baseAsset": "SPY", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/spy-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/spy.webp" + }, + { + "assetName": "Superstate Crypto Carry Fund", + "baseAsset": "USCC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/uscc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uscc.webp" + }, + { + "assetName": "Superstate Short Duration U.S. Government Securities Fund", + "baseAsset": "USTB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ustb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ustb.webp" + }, + { + "assetName": "Tesla Inc", + "baseAsset": "TSLA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tsla-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tsla.webp" + }, + { + "assetName": "UnitedHealth Group Inc", + "baseAsset": "UNH", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/unh-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/unh.webp" + }, + { + "assetName": "USDT0", + "baseAsset": "USDT0", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdt0-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt0.webp" + }, + { + "assetName": "USDtb", + "baseAsset": "USDTB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdtb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdtb.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "release", + "date": "2026-01-21", + "description": "CRE CLI version 1.0.6 is now available. This release adds ZKSync Era testnet and mainnet support in the simulator, along with various small improvements and bug fixes.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.", + "title": "CRE CLI v1.0.6", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-01-20", + "description": "Chainlink 24/5 U.S. Equities Streams provide real-time equity pricing data across all major U.S. single-name equities and ETFs spanning regular, pre-market, post-market, and overnight trading sessions.\n\nEach instrument is exposed through three distinct streams for different trading phases: Regular Hours, Extended Hours, and Overnight Hours. Users can dynamically switch between these streams to construct a continuous price feed.\n\n- Complete user guide: [24/5 US Equities User Guide](https://docs.chain.link/data-streams/rwa-streams/24-5-us-equities-user-guide)\n- View available streams: [Stream Table Viewer](https://docs.chain.link/data-streams/stream-ids?network=arbitrum&show24x5=true)\n- Report schema: [RWA Advanced (v11)](https://docs.chain.link/data-streams/reference/report-schema-v11)", + "title": "24/5 US Equities Streams Now Available", + "topic": "Data Streams" + }, + { + "category": "release", + "date": "2026-01-19", + "description": "TypeScript SDK version 1.0.3 is now available. This release fixes an issue where workflows could execute twice during simulation. All workflow examples in the SDK repository now use direct imports.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.2...v1.0.3)", + "title": "CRE TS SDK v1.0.3", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-01-18", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "aptos", + "arbitrum", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "Canton", + "baseAsset": "CC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/cc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cc.webp" + }, + { + "assetName": "cUSDO / USDO Exchange Rate", + "baseAsset": "cUSDO", + "quoteAsset": "USDO", + "url": "https://docs.chain.link/data-streams/crypto-streams?search=cUSDO%2FUSDO&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cusdo.webp" + }, + { + "assetName": "kmHYPE / HYPE Exchange Rate", + "baseAsset": "kmHYPE", + "quoteAsset": "HYPE", + "url": "https://docs.chain.link/data-streams/crypto-streams?search=kmHYPE&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kmhype.webp" + }, + { + "assetName": "Tea-REX", + "baseAsset": "TREX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/trex-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/trex.webp" + }, + { + "assetName": "wstETH / stETH Exchange Rate", + "baseAsset": "wstETH", + "quoteAsset": "stETH", + "url": "https://docs.chain.link/data-streams/crypto-streams?search=wstETH%2FstETH&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-01-18", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["ethereum"], + "relatedTokens": [ + { + "assetName": "Bitcoin (BTC)", + "baseAsset": "LBTC", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/lombard-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lbtc.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2026-01-18", + "description": "New Data Feeds available:", + "relatedNetworks": ["base", "megaeth", "arbitrum"], + "relatedTokens": [ + { + "assetName": "Anzen USDz", + "baseAsset": "USDz", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/usdz-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdz.webp" + }, + { + "assetName": "Avalanche Bridged BTC", + "baseAsset": "BTCB", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btcb.webp" + }, + { + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Ethena Staked USDe", + "baseAsset": "SUSDE", + "quoteAsset": "USDE", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susde.webp" + }, + { + "assetName": "Ethena USDe", + "baseAsset": "USDE", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usde.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Hyperliquid", + "baseAsset": "HYPE", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/hype.webp" + }, + { + "assetName": "Kelp DAO Restaked ETH", + "baseAsset": "RSETH", + "quoteAsset": "ETH", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rseth.webp" + }, + { + "assetName": "lBTC-BTC Exchange Rate", + "baseAsset": "lBTC", + "quoteAsset": "BTC", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lbtc.webp" + }, + { + "assetName": "Lombard Staked BTC", + "baseAsset": "LBTC", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lbtc.webp" + }, + { + "assetName": "MetaMask USD", + "baseAsset": "MUSD", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/musd.webp" + }, + { + "assetName": "PayPal USD", + "baseAsset": "PYUSD", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/pyusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/pyusd.webp" + }, + { + "assetName": "Renzo Restaked ETH", + "baseAsset": "EZETH", + "quoteAsset": "ETH", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ezeth.webp" + }, + { + "assetName": "Solana", + "baseAsset": "SOL", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sol.webp" + }, + { + "assetName": "STCAPUSD / CAPUSD Exchange Rate", + "baseAsset": "STCAPUSD", + "quoteAsset": "CAPUSD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/stcapusd.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + }, + { + "assetName": "USD+", + "baseAsset": "USD+", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/usd+-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usd+.webp" + }, + { + "assetName": "USDT0", + "baseAsset": "USDT0", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt0.webp" + }, + { + "assetName": "USDtb", + "baseAsset": "USDtb", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdtb.webp" + }, + { + "assetName": "wstETH / stETH Exchange Rate", + "baseAsset": "wstETH", + "quoteAsset": "stETH", + "network": "megaeth", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=MegaETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-01-18", + "description": "Newly supported tokens: BGB, PTjrUSDe, PTsrUSDe", + "relatedTokens": [ + { + "assetName": "BitgetToken", + "baseAsset": "BGB", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/BGB", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bgb.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "PT Strata Junior USDe 2APR2026", + "baseAsset": "PTjrUSDe", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/PTjrUSDe", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ptjrusde.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "PT Strata Senior USDe 2APR2026", + "baseAsset": "PTsrUSDe", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/PTsrUSDe", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ptsrusde.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + } + ], + "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "topic": "CCIP" + }, + { + "category": "release", + "date": "2026-01-16", + "description": "TypeScript SDK version 1.0.2 is now available with improved developer experience: optional `main()` call, automatic error handling, and direct imports for SDK components. Both import styles remain supported for backward compatibility.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.1...v1.0.2)", + "title": "CRE TS SDK v1.0.2", + "topic": "CRE" + }, + { + "category": "deprecation", + "date": "2026-01-15", + "description": "Support for Data Feeds on Ronin will be deprecated on **February 16th, 2026**. A complete list of Data Feeds designated for deprecation along with their corresponding shutdown dates can be found [here](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecated Ronin Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-01-13", + "description": "CRE CLI version 1.0.5 is now available with various small improvements and bug fixes.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.", + "title": "CRE CLI v1.0.5", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-01-11", + "description": "New Data Feeds available:", + "relatedNetworks": ["bob", "ethereum", "mantle"], + "relatedTokens": [ + { + "assetName": "BOB (Build on Bitcoin)", + "baseAsset": "BOB", + "quoteAsset": "USD", + "network": "bob", + "url": "https://data.chain.link/feeds/bob/mainnet/bob-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bob.webp" + }, + { + "assetName": "Ethena USDtb", + "baseAsset": "USDtb", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/usdtb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdtb.webp" + }, + { + "assetName": "Kelp DAO Restaked ETH", + "baseAsset": "RSETH", + "quoteAsset": "ETH", + "network": "mantle", + "url": "https://data.chain.link/feeds/mantle/mantle/rseth-eth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rseth.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-01-09", + "description": "CRE CLI version 1.0.4 is now available with various small improvements and bug fixes.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.", + "title": "CRE CLI v1.0.4", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-01-07", + "description": "We've introduced a new [Very High Market Risk](https://docs.chain.link/data-feeds/selecting-data-feeds#-very-high-market-risk-feeds) category across Chainlink documentation pages and data.chain.link to better distinguish data feeds that are subject to extreme market risk beyond the existing High Market Risk classification. These feeds may reflect assets undergoing significant market events, severe liquidity constraints, or deprecation.\n\nTo improve transparency and consistency, feeds are no longer hidden based on risk level. All feeds are now visible and clearly labeled, allowing developers to make [informed decisions](https://docs.chain.link/data-feeds/selecting-data-feeds#overview) using more granular risk classifications.", + "title": "New risk category and improved feed visibility", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-01-04", + "description": "New Data Feeds available:", + "relatedNetworks": ["polygon"], + "relatedTokens": [ + { + "assetName": "Indonesian Rupiah", + "baseAsset": "IDR", + "quoteAsset": "USD", + "network": "polygon", + "url": "https://data.chain.link/feeds/polygon/mainnet/idr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/idr.webp" + }, + { + "assetName": "South African Rand", + "baseAsset": "ZAR", + "quoteAsset": "USD", + "network": "polygon", + "url": "https://data.chain.link/feeds/polygon/mainnet/zar-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zar.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2025-12-29", + "description": "The Data Streams Candlestick API now offers a new [`/groups` endpoint](https://docs.chain.link/data-streams/reference/candlestick-api#get-list-of-supported-groups) that returns a list of all supported symbol types (crypto, equities, forex, equity) which can be used as a filter in the `/symbol_info` endpoint. Additionally, the `/history` and `/history/rows` endpoints now support [user-specified resolutions](https://docs.chain.link/data-streams/reference/candlestick-api#supported-resolutions) with flexible time units (minutes, hours, days, weeks, months, years).", + "title": "Candlestick API: Groups endpoint and user resolution support", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2025-12-21", + "description": "Newly supported tokens: QUICK, RAIN, aprMON", + "relatedTokens": [ + { + "assetName": "QuickSwap", + "baseAsset": "QUICK", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/QUICK", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/quick.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Rain Coin", + "baseAsset": "RAIN", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/RAIN", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rain.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "aPriori LST", + "baseAsset": "aprMON", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/aprMON", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/aprmon.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + } + ], + "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-12-21", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["polygon"], + "relatedTokens": [ + { + "assetName": "R25 rcUSD+", + "baseAsset": "rcUSD+", + "network": "polygon", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/polygon/mainnet/rcusd+-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rcusd+.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2025-12-21", + "description": "New Data Feeds available:", + "relatedNetworks": ["polygon", "base", "arbitrum", "hyperevm"], + "relatedTokens": [ + { + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/btc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Circle EUR", + "baseAsset": "EURC", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/usdc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/usdc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/eth-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/usdt-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2025-12-19", + "description": "Chainlink CCIP expands support to new blockchains:", + "newNetworks": [ + { + "displayName": "Ethereum Hoodi", + "network": "ethereum", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/ethereum-testnet-hoodi" + } + ], + "relatedNetworks": ["ethereum"], + "title": "CCIP Expands to Ethereum Hoodi", + "topic": "CCIP" + }, + { + "category": "deprecation", + "date": "2025-12-16", + "description": "Support for Data Feeds on Fantom will be deprecated on **January 12th, 2026**. A complete list of Data Feeds designated for deprecation along with their corresponding shutdown dates can be found [here](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecated Fantom Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2025-12-14", + "description": "Newly supported tokens: BTC.b, JCT, KNET, POWER, PTsUSDE, SWCH, avBTC, avBTCx, avUSD, avUSDx, pippin", + "relatedTokens": [ + { + "assetName": "Bitcoin", + "baseAsset": "BTC.b", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/BTC.b", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btcb.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "JANCTION", + "baseAsset": "JCT", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/JCT", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jct.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Kingnet AI", + "baseAsset": "KNET", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/KNET", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/knet.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Power", + "baseAsset": "POWER", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/POWER", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/power.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "PT Ethena sUSDE 5FEB2026", + "baseAsset": "PTsUSDE", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/PTsUSDE", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ptsusde.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "SwissCheese Token", + "baseAsset": "SWCH", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/SWCH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/swch.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "avBTC", + "baseAsset": "avBTC", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/avBTC", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/avbtc.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "avBTC MAX", + "baseAsset": "avBTCx", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/avBTCx", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/avbtcx.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "avUSD", + "baseAsset": "avUSD", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/avUSD", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/avusd.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "avUSD MAX", + "baseAsset": "avUSDx", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/avUSDx", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/avusdx.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Pippin", + "baseAsset": "pippin", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/pippin", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/pippin.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + } + ], + "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-12-14", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["optimism", "bnb-chain"], + "relatedTokens": [ + { + "assetName": "Virtune Polkadot ETP / PoR", + "baseAsset": "DOT", + "network": "optimism", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/optimism/mainnet/virtune-dot-etp-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dot.webp" + }, + { + "assetName": "Virtune Stellar ETP / PoR", + "baseAsset": "XLM", + "network": "optimism", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/optimism/mainnet/virtune-xlm-etp-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xlm.webp" + }, + { + "assetName": "WisdomTree Bloomberg U.S. Dollar Bullish Fund", + "baseAsset": "USDU", + "network": "bnb-chain", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/bsc/mainnet/usdu-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdu.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2025-12-14", + "description": "New Data Feeds available:", + "relatedNetworks": [ + "polygon", + "optimism", + "arbitrum", + "ethereum", + "hyperevm", + "solana", + "metis", + "base", + "sonic", + "bnb-chain" + ], + "relatedTokens": [ + { + "assetName": "Arbitrum", + "baseAsset": "ARB", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/arb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/arb.webp" + }, + { + "assetName": "Avant Staked BTC", + "baseAsset": "savBTC", + "quoteAsset": "avBTC", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/savbtc-avbtc-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/savbtc.webp" + }, + { + "assetName": "Avant Staked USD", + "baseAsset": "savUSD", + "quoteAsset": "avUSD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/savusd-avusd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/savusd.webp" + }, + { + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/btc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Chainlink", + "baseAsset": "LINK", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/link-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/link.webp" + }, + { + "assetName": "Circle EUR", + "baseAsset": "EURC", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" + }, + { + "assetName": "DAI", + "baseAsset": "DAI", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/dai-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dai.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/eth-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Felix feUSD", + "baseAsset": "FEUSD", + "quoteAsset": "USD", + "network": "hyperevm", + "url": "https://data.chain.link/feeds/hyperliquid/hyperliquid/feusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/feusd.webp" + }, + { + "assetName": "FRAX", + "baseAsset": "FRAX", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/frax-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/frax.webp" + }, + { + "assetName": "Jupiter", + "baseAsset": "JUP", + "quoteAsset": "USD", + "network": "solana", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=solana&search=Jupiter&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jup.webp" + }, + { + "assetName": "Jupiter Perpetuals Liquidity Provider Token", + "baseAsset": "JLP", + "quoteAsset": "USD", + "network": "solana", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=solana&search=Jupiter+Perpetuals&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jlp.webp" + }, + { + "assetName": "Liquity USD", + "baseAsset": "LUSD", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/lusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lusd.webp" + }, + { + "assetName": "Solv Protocol SolvBTC / BTC Exchange Rate", + "baseAsset": "solvBTC", + "quoteAsset": "BTC", + "network": "solana", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=solana&search=Solv+Protocol+SolvBTC&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/solvbtc.webp" + }, + { + "assetName": "South African Rand", + "baseAsset": "ZAR", + "quoteAsset": "USD", + "network": "sonic", + "url": "https://data.chain.link/feeds/sonic/sonic/zar-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zar.webp" + }, + { + "assetName": "syrupUSDT-USDT Exchange Rate", + "baseAsset": "syrupUSDT", + "quoteAsset": "USDT", + "network": "bnb-chain", + "url": "https://data.chain.link/feeds/bsc/mainnet/syrupusdt-usdt-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/syrupusdt.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/usdt-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + }, + { + "assetName": "Wrapped Bitcoin", + "baseAsset": "WBTC", + "quoteAsset": "USD", + "network": "solana", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?network=solana&search=WBTC&page=1", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wbtc.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2025-12-12", + "description": "Chainlink CCIP expands support to new blockchains:", + "newNetworks": [ + { + "displayName": "Tempo Testnet", + "network": "tempo", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/tempo-testnet" + } + ], + "relatedNetworks": ["tempo"], + "title": "CCIP Expands to Tempo Testnet", + "topic": "CCIP" + }, + { + "category": "release", + "date": "2025-12-12", + "description": "CRE CLI version 1.0.3 is now available with various small improvements and bug fixes.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.", + "title": "CRE CLI v1.0.3", + "topic": "CRE" + }, + { + "category": "release", + "date": "2025-12-11", + "description": "Chainlink Node v2.31.0 is now available. See the [Release Notes](https://github.com/smartcontractkit/chainlink/releases/tag/v2.31.0) for details.", + "title": "Chainlink Node v2.31.0", + "topic": "Nodes" + }, + { + "category": "release", + "date": "2025-12-11", + "description": "Upgraded Time-based Upkeeps. Read more [here](https://docs.chain.link/chainlink-automation/guides/job-scheduler)", + "title": "Upgraded Time-based Upkeeps ", + "topic": "Automation" + }, + { + "category": "integration", + "date": "2025-12-09", + "description": "Chainlink CCIP expands support to new blockchains:", + "newNetworks": [ + { + "displayName": "Morph Hoodi Testnet", + "network": "morph", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/ethereum-testnet-hoodi-morph" + } + ], + "relatedNetworks": ["morph"], + "title": "CCIP Expands to Morph Hoodi Testnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-12-08", + "description": "Chainlink CCIP expands support to new blockchains:", + "newNetworks": [ + { + "displayName": "Jovay Mainnet", + "network": "jovay", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/jovay-mainnet" + }, + { + "displayName": "Jovay Testnet", + "network": "jovay", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/jovay-testnet" + }, + { + "displayName": "Morph Mainnet", + "network": "morph", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/morph-mainnet" + }, + { + "displayName": "Stable Mainnet", + "network": "stable", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/stable-mainnet" + } + ], + "relatedNetworks": ["jovay", "morph", "stable"], + "title": "CCIP Expands to Jovay Mainnet & Testnet, Morph Mainnet, Stable Mainnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-12-07", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "aptos", + "arbitrum", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "PLTR", + "baseAsset": "PLTR", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/pltr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/pltr.webp" + }, + { + "assetName": "SOLVBTC / BTC Exchange Rate", + "baseAsset": "SOLVBTC", + "quoteAsset": "BTC", + "url": "https://data.chain.link/streams/solvbtc-btc", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/solvbtc.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2025-12-07", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["base"], + "relatedTokens": [ + { + "assetName": "ARSx", + "baseAsset": "ARSx", + "network": "base", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/base/base/arsx-base-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/arsx.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2025-12-07", + "description": "New Data Feeds available:", + "relatedNetworks": ["arbitrum", "optimism", "ethereum", "mantle", "base"], + "relatedTokens": [ + { + "assetName": "Aave", + "baseAsset": "AAVE", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/aave-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/aave.webp" + }, + { + "assetName": "Arbitrum", + "baseAsset": "ARB", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/arb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/arb.webp" + }, + { + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/btc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Calculated ETH+", + "baseAsset": "ETH+", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/calculated-ethplus-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth+.webp" + }, + { + "assetName": "Chainlink", + "baseAsset": "LINK", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/link-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/link.webp" + }, + { + "assetName": "Circle EUR", + "baseAsset": "EURC", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/usdc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Compounding OpenDollar", + "baseAsset": "CUSDO", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/cusdo-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cusdo.webp" + }, + { + "assetName": "DAI", + "baseAsset": "DAI", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/dai-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dai.webp" + }, + { + "assetName": "Ethena Staked USDe", + "baseAsset": "SUSDE", + "quoteAsset": "USDE", + "network": "mantle", + "url": "https://data.chain.link/feeds/mantle/mantle/susde-usde-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susde.webp" + }, + { + "assetName": "FRAX", + "baseAsset": "FRAX", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/frax-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/frax.webp" + }, + { + "assetName": "GHO", + "baseAsset": "GHO", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/gho-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/gho.webp" + }, + { + "assetName": "Kelp DAO Restaked ETH", + "baseAsset": "RSETH", + "quoteAsset": "ETH (SVR)", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/rseth-eth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rseth.webp" + }, + { + "assetName": "Liquity USD", + "baseAsset": "LUSD", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/lusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lusd.webp" + }, + { + "assetName": "syrupUSDC-USDC Exchange Rate", + "baseAsset": "syrupUSDC", + "quoteAsset": "USDC", + "network": "mantle", + "url": "https://data.chain.link/feeds/mantle/mantle/syrupusdc-usdc-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/syrupusdc.webp" + }, + { + "assetName": "syrupUSDT-USDT Exchange Rate", + "baseAsset": "syrupUSDT", + "quoteAsset": "USDT", + "network": "mantle", + "url": "https://data.chain.link/feeds/mantle/mantle/syrupusdt-usdt-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/syrupusdt.webp" + }, + { + "assetName": "Tether USD", + "baseAsset": "USDT", + "quoteAsset": "USD (SVR)", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/usdt-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdt.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2025-11-30", + "description": "Newly supported tokens: VOOI", + "relatedTokens": [ + { + "assetName": "VOOI", + "baseAsset": "VOOI", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/VOOI", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/vooi.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + } + ], + "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-11-30", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "aptos", + "arbitrum", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "Monad", + "baseAsset": "MON", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mon-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mon.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2025-11-30", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["linea"], + "relatedTokens": [ + { + "assetName": "M", + "baseAsset": "MN", + "network": "linea", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/linea/mainnet/m-nav-linea", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mn.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2025-11-30", + "description": "New Data Feeds available:", + "relatedNetworks": ["linea", "ethereum"], + "relatedTokens": [ + { + "assetName": "Avant Staked ETH", + "baseAsset": "savETH", + "quoteAsset": "avETH", + "network": "linea", + "url": "https://data.chain.link/feeds/linea/mainnet/saveth-aveth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/saveth.webp" + }, + { + "assetName": "Monad", + "baseAsset": "MON", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/mon-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mon.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2025-11-25", + "description": "Chainlink CCIP expands support to new blockchains:", + "newNetworks": [ + { + "displayName": "Pharos Atlantic Testnet", + "network": "pharos", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/pharos-atlantic-testnet" + } + ], + "relatedNetworks": ["pharos"], + "title": "CCIP Expands to Pharos Atlantic Testnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-11-24", + "description": "Chainlink Data Streams is available for Monad Mainnet. The verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", + "relatedNetworks": ["monad"], + "title": "Data Streams Expands to Monad Mainnet", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2025-11-24", + "description": "Chainlink Data Feeds is available on Monad Mainnet. View the available price feed information on the [Price Feed Addresses](https://docs.chain.link/data-feeds/price-feeds/addresses?network=monad&page=1) page.", + "relatedNetworks": ["monad"], + "title": "Data Feeds Expands to Monad Mainnet", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2025-11-24", + "description": "Chainlink CCIP expands support to new blockchains:", + "newNetworks": [ + { + "displayName": "Henesys Mainnet", + "network": "nexon", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/nexon-mainnet-henesys" + }, + { + "displayName": "Monad Mainnet", + "network": "monad", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/monad-mainnet" + } + ], + "relatedNetworks": ["henesys", "monad"], + "title": "CCIP on Nexon Mainnet and Monad Mainnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-11-23", + "description": "Newly supported tokens: BOB, WHLP, wstETH", + "relatedTokens": [ + { + "assetName": "BOB", + "baseAsset": "BOB", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/BOB", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bob.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Wrapped HLP", + "baseAsset": "WHLP", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/WHLP", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/whlp.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Wrapped stETH", + "baseAsset": "wstETH", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/wstETH", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + } + ], + "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2025-11-23", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "aptos", + "arbitrum", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "opbnb", + "optimism", + "polygon", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "sUSDu / USDU Exchange Rate", + "baseAsset": "sUSDu ", + "quoteAsset": "USDU", + "url": "https://data.chain.link/streams/susdu%20-usdu-exchangerate-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdu.webp" + }, + { + "assetName": "Unit Bitcoin", + "baseAsset": "UBTC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ubtc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ubtc.webp" + }, + { + "assetName": "Unit Ethereum", + "baseAsset": "UETH", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ueth-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ueth.webp" + }, + { + "assetName": "Unit Solana", + "baseAsset": "USOL", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usol-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usol.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2025-11-23", + "description": "New Data Feeds available:", + "relatedNetworks": ["optimism", "ethereum", "base", "bnb-chain"], + "relatedTokens": [ + { + "assetName": "sUSDai", + "baseAsset": "sUSDai", + "quoteAsset": "USDai", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/susdai-usdai-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdai.webp" + }, + { + "assetName": "sUSDD / USDD Exchange Rate", + "baseAsset": "sUSDD", + "quoteAsset": "USDD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/susdd-usdd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdd.webp" + }, + { + "assetName": "sUSDD / USDD Exchange Rate", + "baseAsset": "sUSDD", + "quoteAsset": "USDD", + "network": "bnb-chain", + "url": "https://data.chain.link/feeds/bsc/mainnet/susdd-usdd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdd.webp" + }, + { + "assetName": "USDai", + "baseAsset": "USDAI", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/usdai-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdai.webp" + }, + { + "assetName": "USDD / USDC Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDC", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/usdd-usdc-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "USDD / USDC Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDC", + "network": "bnb-chain", + "url": "https://data.chain.link/feeds/bsc/mainnet/usdd-usdc-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "USDD / USDT Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDT", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/usdd-usdt-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "USDD / USDT Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDT", + "network": "bnb-chain", + "url": "https://data.chain.link/feeds/bsc/mainnet/usdd-usdt-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { "category": "release", "date": "2025-11-20", "description": "CRE CLI version 1.0.2 is now available with various improvements based on user feedback.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.", "title": "CRE CLI v1.0.2", "topic": "CRE" }, + { + "category": "release", + "date": "2025-11-17", + "description": "Chainlink Node v2.30.0 is now available. See the [Release Notes](https://github.com/smartcontractkit/chainlink/releases/tag/v2.30.0) for details.", + "title": "Chainlink Node v2.30.0", + "topic": "Nodes" + }, { "category": "integration", "date": "2025-11-16", @@ -5100,7 +7389,7 @@ { "category": "release", "date": "2025-08-18", - "description": "Backed xStock streams are now available on mainnet and testnet.\n\n- Backed xStock streams use the [V10 report schema](https://docs.chain.link/data-streams/reference/report-schema-v10).\n- Verifier proxy addresses and Backed xStock stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/backed-streams) page.", + "description": "Backed xStock streams are now available on mainnet and testnet.\n\n- Backed xStock streams use the [V10 report schema](https://docs.chain.link/data-streams/reference/report-schema-v10).\n- Verifier proxy addresses and Backed xStock stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/tokenized-asset-streams) page.", "title": "Backed xStock streams", "topic": "Data Streams" }, diff --git a/public/images/ccip/ccip-hl-v1.7.jpg b/public/images/ccip/ccip-hl-v1.7.jpg new file mode 100644 index 00000000000..b7c06d09c68 Binary files /dev/null and b/public/images/ccip/ccip-hl-v1.7.jpg differ diff --git a/public/images/ccip/tutorials/ccip-getting-started-evm-1.png b/public/images/ccip/tutorials/ccip-getting-started-evm-1.png new file mode 100644 index 00000000000..f3c0edf6016 Binary files /dev/null and b/public/images/ccip/tutorials/ccip-getting-started-evm-1.png differ diff --git a/public/images/ccip/tutorials/ccip-getting-started-evm-2.png b/public/images/ccip/tutorials/ccip-getting-started-evm-2.png new file mode 100644 index 00000000000..6f561bbcd16 Binary files /dev/null and b/public/images/ccip/tutorials/ccip-getting-started-evm-2.png differ diff --git a/public/images/data-feed/tokenized-equity/ondo-tokenized-equity-pause-behavior.png b/public/images/data-feed/tokenized-equity/ondo-tokenized-equity-pause-behavior.png new file mode 100644 index 00000000000..f30bab19be5 Binary files /dev/null and b/public/images/data-feed/tokenized-equity/ondo-tokenized-equity-pause-behavior.png differ diff --git a/public/images/data-feed/tokenized-equity/tokenized-equity-diagram.png b/public/images/data-feed/tokenized-equity/tokenized-equity-diagram.png new file mode 100644 index 00000000000..38342db23ef Binary files /dev/null and b/public/images/data-feed/tokenized-equity/tokenized-equity-diagram.png differ diff --git a/public/images/data-streams/24-5-availability.png b/public/images/data-streams/24-5-availability.png new file mode 100644 index 00000000000..01298dcbe27 Binary files /dev/null and b/public/images/data-streams/24-5-availability.png differ diff --git a/public/images/data-streams/24-5-price-jumps-example.png b/public/images/data-streams/24-5-price-jumps-example.png new file mode 100644 index 00000000000..d38453ea31e Binary files /dev/null and b/public/images/data-streams/24-5-price-jumps-example.png differ diff --git a/public/images/data-streams/calculated-streams-diagram.png b/public/images/data-streams/calculated-streams-diagram.png new file mode 100644 index 00000000000..64b02149cde Binary files /dev/null and b/public/images/data-streams/calculated-streams-diagram.png differ diff --git a/public/images/language-icons/go.svg b/public/images/language-icons/go.svg new file mode 100644 index 00000000000..9bb5f643118 --- /dev/null +++ b/public/images/language-icons/go.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/images/language-icons/json.svg b/public/images/language-icons/json.svg new file mode 100644 index 00000000000..b5c5ada53de --- /dev/null +++ b/public/images/language-icons/json.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/public/images/language-icons/python.svg b/public/images/language-icons/python.svg new file mode 100644 index 00000000000..5bd72165186 --- /dev/null +++ b/public/images/language-icons/python.svg @@ -0,0 +1,7 @@ + + + + + + python [#ffffff] Created with Sketch. + \ No newline at end of file diff --git a/public/images/language-icons/rust.svg b/public/images/language-icons/rust.svg new file mode 100644 index 00000000000..630595afb26 --- /dev/null +++ b/public/images/language-icons/rust.svg @@ -0,0 +1,7 @@ + + + + + + rust + \ No newline at end of file diff --git a/public/images/language-icons/solidity.svg b/public/images/language-icons/solidity.svg new file mode 100644 index 00000000000..86b9f4995b2 --- /dev/null +++ b/public/images/language-icons/solidity.svg @@ -0,0 +1,27 @@ + + + + +Vector 1 +Created with Sketch. + + + + + + + + + + + + + diff --git a/public/images/language-icons/terminal.svg b/public/images/language-icons/terminal.svg new file mode 100644 index 00000000000..4920153ef58 --- /dev/null +++ b/public/images/language-icons/terminal.svg @@ -0,0 +1,13 @@ + + + diff --git a/public/images/language-icons/toml.svg b/public/images/language-icons/toml.svg new file mode 100644 index 00000000000..de69f153f63 --- /dev/null +++ b/public/images/language-icons/toml.svg @@ -0,0 +1,12 @@ + + + + + + + file_type_toml + + + + + \ No newline at end of file diff --git a/public/images/language-icons/typescript.svg b/public/images/language-icons/typescript.svg new file mode 100644 index 00000000000..025b352d841 --- /dev/null +++ b/public/images/language-icons/typescript.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/samples/CCIP/Sender.sol b/public/samples/CCIP/Sender.sol index 0623795b109..595de1de296 100644 --- a/public/samples/CCIP/Sender.sol +++ b/public/samples/CCIP/Sender.sol @@ -4,8 +4,8 @@ pragma solidity 0.8.24; import {IRouterClient} from "@chainlink/contracts-ccip/contracts/interfaces/IRouterClient.sol"; import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol"; -import {OwnerIsCreator} from "@chainlink/contracts@1.4.0/src/v0.8/shared/access/OwnerIsCreator.sol"; -import {LinkTokenInterface} from "@chainlink/contracts@1.4.0/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {OwnerIsCreator} from "@chainlink/contracts/src/v0.8/shared/access/OwnerIsCreator.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; /** * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. diff --git a/public/samples/CRE/BasicConsumer.sol b/public/samples/CRE/BasicConsumer.sol new file mode 100644 index 00000000000..f91431b8646 --- /dev/null +++ b/public/samples/CRE/BasicConsumer.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; +import {ReceiverTemplate} from "./ReceiverTemplate.sol"; + +contract MyConsumer is ReceiverTemplate { + uint256 public s_storedValue; + event ValueUpdated(uint256 newValue); + + // Constructor requires forwarder address + constructor( + address _forwarderAddress + ) ReceiverTemplate(_forwarderAddress) {} + + // Implement your business logic here + function _processReport( + bytes calldata report + ) internal override { + uint256 newValue = abi.decode(report, (uint256)); + s_storedValue = newValue; + emit ValueUpdated(newValue); + } +} diff --git a/public/samples/CRE/CalculatorConsumer.sol b/public/samples/CRE/CalculatorConsumer.sol new file mode 100644 index 00000000000..547296b37e0 --- /dev/null +++ b/public/samples/CRE/CalculatorConsumer.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {ReceiverTemplate} from "./ReceiverTemplate.sol"; + +/** + * @title CalculatorConsumer (Testing Version) + * @notice This contract receives reports from a CRE workflow and stores the results of a calculation onchain. + * @dev Inherits from ReceiverTemplate which provides security checks. The forwarder address must be + * configured at deployment. Additional security checks (workflowId, workflowName, author) can be enabled via setter + * functions. + */ +contract CalculatorConsumer is ReceiverTemplate { + // Struct to hold the data sent in a report from the workflow + struct CalculatorResult { + uint256 offchainValue; + int256 onchainValue; + uint256 finalResult; + } + + // --- State Variables --- + CalculatorResult public latestResult; + uint256 public resultCount; + mapping(uint256 => CalculatorResult) public results; + + // --- Events --- + event ResultUpdated(uint256 indexed resultId, uint256 finalResult); + + /** + * @notice Constructor requires the forwarder address for security + * @param _forwarderAddress The address of the Chainlink Forwarder contract (for testing: MockForwarder) + * @dev The forwarder address enables the first layer of security - only the forwarder can call onReport. + * Additional security checks can be configured after deployment using setter functions. + */ + constructor( + address _forwarderAddress + ) ReceiverTemplate(_forwarderAddress) {} + + /** + * @notice Implements the core business logic for processing reports. + * @dev This is called automatically by ReceiverTemplate's onReport function after security checks. + */ + function _processReport( + bytes calldata report + ) internal override { + // Decode the report bytes into our CalculatorResult struct + CalculatorResult memory calculatorResult = abi.decode(report, (CalculatorResult)); + + // --- Core Logic --- + // Update contract state with the new result + resultCount++; + results[resultCount] = calculatorResult; + latestResult = calculatorResult; + + emit ResultUpdated(resultCount, calculatorResult.finalResult); + } + + // This function is a "dry-run" utility. It allows an offchain system to check + // if a prospective result is an outlier before submitting it for a real onchain update. + // It is also used to guide the binding generator to create a method that accepts the CalculatorResult struct. + function isResultAnomalous( + CalculatorResult memory _prospectiveResult + ) public view returns (bool) { + // A result is not considered anomalous if it's the first one. + if (resultCount == 0) { + return false; + } + + // Business logic: Define an anomaly as a new result that is more than double the previous result. + // This is just one example of a validation rule you could implement. + return _prospectiveResult.finalResult > (latestResult.finalResult * 2); + } +} diff --git a/public/samples/CRE/IERC165.sol b/public/samples/CRE/IERC165.sol new file mode 100644 index 00000000000..5d28886a8b7 --- /dev/null +++ b/public/samples/CRE/IERC165.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol) + +pragma solidity >=0.4.16; + +/** + * @dev Interface of the ERC-165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[ERC]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface( + bytes4 interfaceId + ) external view returns (bool); +} diff --git a/public/samples/CRE/IReceiver.sol b/public/samples/CRE/IReceiver.sol new file mode 100644 index 00000000000..e7f047b172b --- /dev/null +++ b/public/samples/CRE/IReceiver.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC165} from "./IERC165.sol"; + +/// @title IReceiver - receives keystone reports +/// @notice Implementations must support the IReceiver interface through ERC165. +interface IReceiver is IERC165 { + /// @notice Handles incoming keystone reports. + /// @dev If this function call reverts, it can be retried with a higher gas + /// limit. The receiver is responsible for discarding stale reports. + /// @param metadata Report's metadata. + /// @param report Workflow report. + function onReport( + bytes calldata metadata, + bytes calldata report + ) external; +} diff --git a/public/samples/CRE/ReceiverTemplate.sol b/public/samples/CRE/ReceiverTemplate.sol new file mode 100644 index 00000000000..488324dd652 --- /dev/null +++ b/public/samples/CRE/ReceiverTemplate.sol @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC165} from "./IERC165.sol"; +import {IReceiver} from "./IReceiver.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +/// @title ReceiverTemplate - Abstract receiver with optional permission controls +/// @notice Provides flexible, updatable security checks for receiving workflow reports +/// @dev The forwarder address is required at construction time for security. +/// Additional permission fields can be configured using setter functions. +abstract contract ReceiverTemplate is IReceiver, Ownable { + // Required permission field at deployment, configurable after + address private s_forwarderAddress; // If set, only this address can call onReport + + // Optional permission fields (all default to zero = disabled) + address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted + bytes10 private s_expectedWorkflowName; // Only validated when s_expectedAuthor is also set + bytes32 private s_expectedWorkflowId; // If set, only reports from this specific workflow ID are accepted + + // Hex character lookup table for bytes-to-hex conversion + bytes private constant HEX_CHARS = "0123456789abcdef"; + + // Custom errors + error InvalidForwarderAddress(); + error InvalidSender(address sender, address expected); + error InvalidAuthor(address received, address expected); + error InvalidWorkflowName(bytes10 received, bytes10 expected); + error InvalidWorkflowId(bytes32 received, bytes32 expected); + error WorkflowNameRequiresAuthorValidation(); + + // Events + event ForwarderAddressUpdated(address indexed previousForwarder, address indexed newForwarder); + event ExpectedAuthorUpdated(address indexed previousAuthor, address indexed newAuthor); + event ExpectedWorkflowNameUpdated(bytes10 indexed previousName, bytes10 indexed newName); + event ExpectedWorkflowIdUpdated(bytes32 indexed previousId, bytes32 indexed newId); + event SecurityWarning(string message); + + /// @notice Constructor sets msg.sender as the owner and configures the forwarder address + /// @param _forwarderAddress The address of the Chainlink Forwarder contract (cannot be address(0)) + /// @dev The forwarder address is required for security - it ensures only verified reports are processed + constructor( + address _forwarderAddress + ) Ownable(msg.sender) { + if (_forwarderAddress == address(0)) { + revert InvalidForwarderAddress(); + } + s_forwarderAddress = _forwarderAddress; + emit ForwarderAddressUpdated(address(0), _forwarderAddress); + } + + /// @notice Returns the configured forwarder address + /// @return The forwarder address (address(0) if disabled) + function getForwarderAddress() external view returns (address) { + return s_forwarderAddress; + } + + /// @notice Returns the expected workflow author address + /// @return The expected author address (address(0) if not set) + function getExpectedAuthor() external view returns (address) { + return s_expectedAuthor; + } + + /// @notice Returns the expected workflow name + /// @return The expected workflow name (bytes10(0) if not set) + function getExpectedWorkflowName() external view returns (bytes10) { + return s_expectedWorkflowName; + } + + /// @notice Returns the expected workflow ID + /// @return The expected workflow ID (bytes32(0) if not set) + function getExpectedWorkflowId() external view returns (bytes32) { + return s_expectedWorkflowId; + } + + /// @inheritdoc IReceiver + /// @dev Performs optional validation checks based on which permission fields are set + function onReport( + bytes calldata metadata, + bytes calldata report + ) external override { + // Security Check 1: Verify caller is the trusted Chainlink Forwarder (if configured) + if (s_forwarderAddress != address(0) && msg.sender != s_forwarderAddress) { + revert InvalidSender(msg.sender, s_forwarderAddress); + } + + // Security Checks 2-4: Verify workflow identity - ID, owner, and/or name (if any are configured) + if (s_expectedWorkflowId != bytes32(0) || s_expectedAuthor != address(0) || s_expectedWorkflowName != bytes10(0)) { + (bytes32 workflowId, bytes10 workflowName, address workflowOwner) = _decodeMetadata(metadata); + + if (s_expectedWorkflowId != bytes32(0) && workflowId != s_expectedWorkflowId) { + revert InvalidWorkflowId(workflowId, s_expectedWorkflowId); + } + if (s_expectedAuthor != address(0) && workflowOwner != s_expectedAuthor) { + revert InvalidAuthor(workflowOwner, s_expectedAuthor); + } + + // ================================================================ + // WORKFLOW NAME VALIDATION - REQUIRES AUTHOR VALIDATION + // ================================================================ + // Do not rely on workflow name validation alone. Workflow names are unique + // per owner, but not across owners. + // Furthermore, workflow names use 40-bit truncation (bytes10), making collisions possible. + // Therefore, workflow name validation REQUIRES author (workflow owner) validation. + // The code enforces this dependency at runtime. + // ================================================================ + if (s_expectedWorkflowName != bytes10(0)) { + // Author must be configured if workflow name is used + if (s_expectedAuthor == address(0)) { + revert WorkflowNameRequiresAuthorValidation(); + } + // Validate workflow name matches (author already validated above) + if (workflowName != s_expectedWorkflowName) { + revert InvalidWorkflowName(workflowName, s_expectedWorkflowName); + } + } + } + + _processReport(report); + } + + /// @notice Updates the forwarder address that is allowed to call onReport + /// @param _forwarder The new forwarder address + /// @dev WARNING: Setting to address(0) disables forwarder validation. + /// This makes your contract INSECURE - anyone can call onReport() with arbitrary data. + /// Only use address(0) if you fully understand the security implications. + function setForwarderAddress( + address _forwarder + ) external onlyOwner { + address previousForwarder = s_forwarderAddress; + + // Emit warning if disabling forwarder check + if (_forwarder == address(0)) { + emit SecurityWarning("Forwarder address set to zero - contract is now INSECURE"); + } + + s_forwarderAddress = _forwarder; + emit ForwarderAddressUpdated(previousForwarder, _forwarder); + } + + /// @notice Updates the expected workflow owner address + /// @param _author The new expected author address (use address(0) to disable this check) + function setExpectedAuthor( + address _author + ) external onlyOwner { + address previousAuthor = s_expectedAuthor; + s_expectedAuthor = _author; + emit ExpectedAuthorUpdated(previousAuthor, _author); + } + + /// @notice Updates the expected workflow name from a plaintext string + /// @param _name The workflow name as a string (use empty string "" to disable this check) + /// @dev IMPORTANT: Workflow name validation REQUIRES author validation to be enabled. + /// The workflow name uses only 40-bit truncation, making collision attacks feasible + /// when used alone. However, since workflow names are unique per owner, validating + /// both the name AND the author address provides adequate security. + /// You must call setExpectedAuthor() before or after calling this function. + /// The name is hashed using SHA256 and truncated to bytes10. + function setExpectedWorkflowName( + string calldata _name + ) external onlyOwner { + bytes10 previousName = s_expectedWorkflowName; + + if (bytes(_name).length == 0) { + s_expectedWorkflowName = bytes10(0); + emit ExpectedWorkflowNameUpdated(previousName, bytes10(0)); + return; + } + + // Convert workflow name to bytes10: + // SHA256 hash → hex encode → take first 10 chars → hex encode those chars + bytes32 hash = sha256(bytes(_name)); + bytes memory hexString = _bytesToHexString(abi.encodePacked(hash)); + bytes memory first10 = new bytes(10); + for (uint256 i = 0; i < 10; i++) { + first10[i] = hexString[i]; + } + s_expectedWorkflowName = bytes10(first10); + emit ExpectedWorkflowNameUpdated(previousName, s_expectedWorkflowName); + } + + /// @notice Updates the expected workflow ID + /// @param _id The new expected workflow ID (use bytes32(0) to disable this check) + function setExpectedWorkflowId( + bytes32 _id + ) external onlyOwner { + bytes32 previousId = s_expectedWorkflowId; + s_expectedWorkflowId = _id; + emit ExpectedWorkflowIdUpdated(previousId, _id); + } + + /// @notice Helper function to convert bytes to hex string + /// @param data The bytes to convert + /// @return The hex string representation + function _bytesToHexString( + bytes memory data + ) private pure returns (bytes memory) { + bytes memory hexString = new bytes(data.length * 2); + + for (uint256 i = 0; i < data.length; i++) { + hexString[i * 2] = HEX_CHARS[uint8(data[i] >> 4)]; + hexString[i * 2 + 1] = HEX_CHARS[uint8(data[i] & 0x0f)]; + } + + return hexString; + } + + /// @notice Extracts all metadata fields from the onReport metadata parameter + /// @param metadata The metadata bytes encoded using abi.encodePacked(workflowId, workflowName, workflowOwner) + /// @return workflowId The unique identifier of the workflow (bytes32) + /// @return workflowName The name of the workflow (bytes10) + /// @return workflowOwner The owner address of the workflow + function _decodeMetadata( + bytes memory metadata + ) internal pure returns (bytes32 workflowId, bytes10 workflowName, address workflowOwner) { + // Metadata structure (encoded using abi.encodePacked by the Forwarder): + // - First 32 bytes: length of the byte array (standard for dynamic bytes) + // - Offset 32, size 32: workflow_id (bytes32) + // - Offset 64, size 10: workflow_name (bytes10) + // - Offset 74, size 20: workflow_owner (address) + assembly { + workflowId := mload(add(metadata, 32)) + workflowName := mload(add(metadata, 64)) + workflowOwner := shr(mul(12, 8), mload(add(metadata, 74))) + } + return (workflowId, workflowName, workflowOwner); + } + + /// @notice Abstract function to process the report data + /// @param report The report calldata containing your workflow's encoded data + /// @dev Implement this function with your contract's business logic + function _processReport( + bytes calldata report + ) internal virtual; + + /// @inheritdoc IERC165 + function supportsInterface( + bytes4 interfaceId + ) public view virtual override returns (bool) { + return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; + } +} diff --git a/public/samples/CRE/basic-functionality.ts b/public/samples/CRE/basic-functionality.ts new file mode 100644 index 00000000000..5a25e8e51a6 --- /dev/null +++ b/public/samples/CRE/basic-functionality.ts @@ -0,0 +1,18 @@ +import { cre } from "@chainlink/cre-sdk" + +cre.handler( + cron.trigger({ schedule: "0 */5 * * *" }), // Every 5 minutes + (runtime) => { + // Fetch data from API + const price = httpClient.get(url).result() + + // Read from EVM blockchain + const threshold = evmClient.read(contract).result() + + // Make any computation + const shouldUpdate = price > threshold + + // Write result onchain + return evmClient.write(contract, price).result() + } +) diff --git a/public/samples/DataFeeds/SVR/import-aggregatorV3.sol b/public/samples/DataFeeds/SVR/import-aggregatorV3.sol new file mode 100644 index 00000000000..229601df65f --- /dev/null +++ b/public/samples/DataFeeds/SVR/import-aggregatorV3.sol @@ -0,0 +1,20 @@ +import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +contract SVRConsumer { + AggregatorV3Interface internal svrFeed; + + constructor( + address _svrFeedAddress + ) { + svrFeed = AggregatorV3Interface(_svrFeedAddress); + } + + function getLatestPrice() public view returns (int256) { + (, /* uint80 roundID */ + int256 price, /* uint256 startedAt */ + /* uint256 timeStamp */ + /* uint80 answeredInRound */,, + ) = svrFeed.latestRoundData(); + return price; + } +} diff --git a/public/samples/DataStreams/FetchSingleStream.ts b/public/samples/DataStreams/FetchSingleStream.ts new file mode 100644 index 00000000000..36830885458 --- /dev/null +++ b/public/samples/DataStreams/FetchSingleStream.ts @@ -0,0 +1,55 @@ +import { createClient, decodeReport, LogLevel, getReportVersion, formatReport } from "@chainlink/data-streams-sdk" +import "dotenv/config" + +async function main() { + if (process.argv.length < 3) { + console.error("Please provide a feed ID as an argument") + console.error("Example: npx tsx singleStream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782") + process.exit(1) + } + + const feedId = process.argv[2] + const version = getReportVersion(feedId) + + try { + const config = { + apiKey: process.env.API_KEY || "YOUR_API_KEY", + userSecret: process.env.USER_SECRET || "YOUR_USER_SECRET", + endpoint: "https://api.testnet-dataengine.chain.link", + wsEndpoint: "wss://ws.testnet-dataengine.chain.link", + // Comment to disable SDK logging: + logging: { + logger: console, + logLevel: LogLevel.INFO, + }, + } + + const client = createClient(config) + console.log(`\nFetching latest report for feed ${feedId} (${version})...\n`) + + // Get raw report data + const report = await client.getLatestReport(feedId) + console.log(`Raw Report Blob: ${report.fullReport}`) + + // Decode the report + const decodedData = decodeReport(report.fullReport, report.feedID) + + // Combine decoded data with report metadata + const decodedReport = { + ...decodedData, + feedID: report.feedID, + validFromTimestamp: report.validFromTimestamp, + observationsTimestamp: report.observationsTimestamp, + } + console.log(formatReport(decodedReport, version)) + } catch (error) { + if (error instanceof Error) { + console.error("Error:", error.message) + } else { + console.error("Unknown error:", error) + } + process.exit(1) + } +} + +main() diff --git a/reports/llms-report.json b/reports/llms-report.json deleted file mode 100644 index 23c8ab3522c..00000000000 --- a/reports/llms-report.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "startedAt": "2025-11-25T23:16:10.318Z", - "siteBase": "https://docs.chain.link", - "sections": [ - { - "section": "cre-go", - "pagesProcessed": 83, - "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 651940, - "prevBytes": 651940, - "deltaBytes": 0 - }, - { - "section": "cre-ts", - "pagesProcessed": 78, - "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 607447, - "prevBytes": 607447, - "deltaBytes": 0 - }, - { - "section": "vrf", - "pagesProcessed": 35, - "outputPath": "src/content/vrf/llms-full.txt", - "bytes": 301012, - "prevBytes": 301012, - "deltaBytes": 0 - }, - { - "section": "ccip", - "pagesProcessed": 260, - "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2849278, - "prevBytes": 2849278, - "deltaBytes": 0 - }, - { - "section": "data-feeds", - "pagesProcessed": 37, - "outputPath": "src/content/data-feeds/llms-full.txt", - "bytes": 302350, - "prevBytes": 302350, - "deltaBytes": 0 - }, - { - "section": "data-streams", - "pagesProcessed": 54, - "outputPath": "src/content/data-streams/llms-full.txt", - "bytes": 477065, - "prevBytes": 477061, - "deltaBytes": 4 - }, - { - "section": "dta-technical-standard", - "pagesProcessed": 7, - "outputPath": "src/content/dta-technical-standard/llms-full.txt", - "bytes": 32397, - "prevBytes": 32397, - "deltaBytes": 0 - }, - { - "section": "datalink", - "pagesProcessed": 20, - "outputPath": "src/content/datalink/llms-full.txt", - "bytes": 136010, - "prevBytes": 136010, - "deltaBytes": 0 - }, - { - "section": "chainlink-functions", - "pagesProcessed": 27, - "outputPath": "src/content/chainlink-functions/llms-full.txt", - "bytes": 299619, - "prevBytes": 299619, - "deltaBytes": 0 - }, - { - "section": "chainlink-automation", - "pagesProcessed": 25, - "outputPath": "src/content/chainlink-automation/llms-full.txt", - "bytes": 196013, - "prevBytes": 196013, - "deltaBytes": 0 - }, - { - "section": "resources", - "pagesProcessed": 12, - "outputPath": "src/content/resources/llms-full.txt", - "bytes": 331970, - "prevBytes": 331970, - "deltaBytes": 0 - }, - { - "section": "architecture-overview", - "pagesProcessed": 4, - "outputPath": "src/content/architecture-overview/llms-full.txt", - "bytes": 13086, - "prevBytes": 13086, - "deltaBytes": 0 - }, - { - "section": "getting-started", - "pagesProcessed": 1, - "outputPath": "src/content/getting-started/llms-full.txt", - "bytes": 10326, - "prevBytes": 10326, - "deltaBytes": 0 - }, - { - "section": "chainlink-nodes", - "pagesProcessed": 37, - "outputPath": "src/content/chainlink-nodes/llms-full.txt", - "bytes": 660645, - "prevBytes": 660645, - "deltaBytes": 0 - }, - { - "section": "chainlink-local", - "pagesProcessed": 55, - "outputPath": "src/content/chainlink-local/llms-full.txt", - "bytes": 297263, - "prevBytes": 297263, - "deltaBytes": 0 - } - ], - "finishedAt": "2025-11-25T23:16:13.816Z" -} diff --git a/scripts/cleanup-vercel-function.mjs b/scripts/cleanup-vercel-function.mjs new file mode 100755 index 00000000000..04eaea1a707 --- /dev/null +++ b/scripts/cleanup-vercel-function.mjs @@ -0,0 +1,50 @@ +#!/usr/bin/env node +/** + * Post-build script to remove unnecessary files from Vercel serverless function + * Reduces function size from 364MB to under 250MB limit + */ + +import { rm } from "fs/promises" +import { existsSync } from "fs" +import { execSync } from "child_process" + +const FUNCTION_DIR = ".vercel/output/functions/_render.func" + +async function cleanup() { + if (!existsSync(FUNCTION_DIR)) { + console.error(`❌ Function directory not found: ${FUNCTION_DIR}`) + process.exit(1) + } + + console.log("🧹 Cleaning up serverless function bundle...") + + const sizeBefore = execSync(`du -sh ${FUNCTION_DIR}`, { encoding: "utf-8" }).trim() + console.log(`📦 Size before: ${sizeBefore}`) + + // Remove large files/directories that are served statically by CDN + // Note: public/samples is kept because the /api/page-markdown endpoint needs to read these files + const itemsToRemove = [ + `${FUNCTION_DIR}/public/images`, + `${FUNCTION_DIR}/public/search-index.json`, + `${FUNCTION_DIR}/public/files`, + `${FUNCTION_DIR}/public/default-og-image.png`, + // `${FUNCTION_DIR}/public/samples`, // Kept for API route access + `${FUNCTION_DIR}/public/changelog.json`, + ] + + for (const item of itemsToRemove) { + if (existsSync(item)) { + await rm(item, { recursive: true, force: true }) + console.log(` ✓ Removed: ${item.replace(FUNCTION_DIR + "/", "")}`) + } + } + + const sizeAfter = execSync(`du -sh ${FUNCTION_DIR}`, { encoding: "utf-8" }).trim() + console.log(`📦 Size after: ${sizeAfter}`) + console.log("✨ Cleanup complete!") +} + +cleanup().catch((error) => { + console.error("❌ Cleanup failed:", error) + process.exit(1) +}) diff --git a/src/__mocks__/rate-limits-mainnet.json b/src/__mocks__/rate-limits-mainnet.json new file mode 100644 index 00000000000..3f90fff496c --- /dev/null +++ b/src/__mocks__/rate-limits-mainnet.json @@ -0,0 +1,55946 @@ +{ + "$PAAL": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "1XMM": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "AISTR": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ANIMA": { + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "APRS": { + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "11910000000000000000000000", + "isEnabled": true, + "rate": "137847213400000000000" + }, + "out": { + "capacity": "18090000000000000000000000", + "isEnabled": true, + "rate": "209375000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "347222200000000000000" + }, + "out": { + "capacity": "27000000000000000000000000", + "isEnabled": true, + "rate": "312500000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "20370000000000000000000000", + "isEnabled": true, + "rate": "235763873800000000000" + }, + "out": { + "capacity": "14931000000000000000000000", + "isEnabled": true, + "rate": "172812500000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "347222200000000000000" + }, + "out": { + "capacity": "27000000000000000000000000", + "isEnabled": true, + "rate": "312500000000000000000" + } + } + } + } + } + }, + "APU": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "30600000000000000000000000", + "isEnabled": true, + "rate": "8499999976200000000000" + }, + "out": { + "capacity": "32900000000000000000000000", + "isEnabled": true, + "rate": "9138888863300000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "45700000000000000000000000", + "isEnabled": true, + "rate": "12694444408900000000000" + }, + "out": { + "capacity": "49600000000000000000000000", + "isEnabled": true, + "rate": "13777777739200000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "44700000000000000000000000", + "isEnabled": true, + "rate": "12416666631900000000000" + }, + "out": { + "capacity": "34300000000000000000000000", + "isEnabled": true, + "rate": "9527777751100000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "56600000000000000000000000", + "isEnabled": true, + "rate": "15722222178200000000000" + }, + "out": { + "capacity": "46200000000000000000000000", + "isEnabled": true, + "rate": "12833333297400000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "36000000000000000000000000", + "isEnabled": true, + "rate": "9999999972000000000000" + }, + "out": { + "capacity": "56400000000000000000000000", + "isEnabled": true, + "rate": "15666666622800000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + } + } + } + }, + "avBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avETH": { + "avalanche-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avETHx": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avUSD": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avUSDx": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "AXS": { + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BANANA": { + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1017000000000000000000000", + "isEnabled": true, + "rate": "11770832580000000000" + }, + "out": { + "capacity": "460350000000000000000000", + "isEnabled": true, + "rate": "5328125000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "17361110000000000000" + }, + "out": { + "capacity": "1350000000000000000000000", + "isEnabled": true, + "rate": "15625000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "538500000000000000000000", + "isEnabled": true, + "rate": "6232638490000000000" + }, + "out": { + "capacity": "507600000000000000000000", + "isEnabled": true, + "rate": "5875000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "17361110000000000000" + }, + "out": { + "capacity": "1350000000000000000000000", + "isEnabled": true, + "rate": "15625000000000000000" + } + } + } + } + } + }, + "BANK": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BARD": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "beraBTC": { + "berachain-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BETS": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "11970000000000000000000000", + "isEnabled": true, + "rate": "19950000000000000000000" + }, + "out": { + "capacity": "11730000000000000000000000", + "isEnabled": true, + "rate": "19550000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + }, + "out": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "18810000000000000000000000", + "isEnabled": true, + "rate": "31350000000000000000000" + }, + "out": { + "capacity": "13020000000000000000000000", + "isEnabled": true, + "rate": "21700000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + }, + "out": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "19350000000000000000000000", + "isEnabled": true, + "rate": "32250000000000000000000" + }, + "out": { + "capacity": "13260000000000000000000000", + "isEnabled": true, + "rate": "22100000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + }, + "out": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-unichain-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BKN": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BMX": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "65300000000000000000000", + "isEnabled": true, + "rate": "18133810000000000000" + }, + "out": { + "capacity": "50800000000000000000000", + "isEnabled": true, + "rate": "14107160000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "65100000000000000000000", + "isEnabled": true, + "rate": "18078270000000000000" + }, + "out": { + "capacity": "36500000000000000000000", + "isEnabled": true, + "rate": "10136050000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "35500000000000000000000", + "isEnabled": true, + "rate": "9858350000000000000" + }, + "out": { + "capacity": "55300000000000000000000", + "isEnabled": true, + "rate": "15356810000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BOB": { + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BOLD": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BONE": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BR": { + "berachain-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2980000000000000000000000", + "isEnabled": true, + "rate": "34568000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "682000000000000000", + "isEnabled": true, + "rate": "68200000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "326000000000000000", + "isEnabled": true, + "rate": "32600000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2780000000000000000000000", + "isEnabled": true, + "rate": "32248000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2865000000000000000000000", + "isEnabled": true, + "rate": "33234000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2370000000000000000000000", + "isEnabled": true, + "rate": "27492000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "283500000000000", + "isEnabled": true, + "rate": "3288600000" + }, + "out": { + "capacity": "2075000000000000000000000", + "isEnabled": true, + "rate": "24070000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5800000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "471000000000000000", + "isEnabled": true, + "rate": "47100000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2070000000000000000000000", + "isEnabled": true, + "rate": "24012000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "511000000000000000", + "isEnabled": true, + "rate": "51100000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "676000000000000000", + "isEnabled": true, + "rate": "67600000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2620000000000000000000000", + "isEnabled": true, + "rate": "30392000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "595000000000000000", + "isEnabled": true, + "rate": "59500000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "347500000000000", + "isEnabled": true, + "rate": "4031000000" + }, + "out": { + "capacity": "273000000000000", + "isEnabled": true, + "rate": "3166800000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5800000000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5800000000" + } + } + } + } + } + }, + "brBTC": { + "aptos-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "91400000", + "isEnabled": true, + "rate": "1057" + }, + "out": { + "capacity": "113000000", + "isEnabled": true, + "rate": "1307" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "107200000", + "isEnabled": true, + "rate": "1240" + }, + "out": { + "capacity": "113800000", + "isEnabled": true, + "rate": "1317" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "127800000", + "isEnabled": true, + "rate": "1479" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "94200000", + "isEnabled": true, + "rate": "1090" + }, + "out": { + "capacity": "72600000", + "isEnabled": true, + "rate": "840" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "91600000", + "isEnabled": true, + "rate": "1060" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "120800000", + "isEnabled": true, + "rate": "1398" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "73600000", + "isEnabled": true, + "rate": "851" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-xlayer-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "133600000", + "isEnabled": true, + "rate": "1546" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "80400000", + "isEnabled": true, + "rate": "930" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "108400000", + "isEnabled": true, + "rate": "1254" + }, + "out": { + "capacity": "118800000", + "isEnabled": true, + "rate": "1375" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "berachain-mainnet": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "135400000", + "isEnabled": true, + "rate": "1567" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "132200000", + "isEnabled": true, + "rate": "1530" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "111800000", + "isEnabled": true, + "rate": "1294" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-xlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "73000000", + "isEnabled": true, + "rate": "844" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "73200000", + "isEnabled": true, + "rate": "847" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "120600000", + "isEnabled": true, + "rate": "1395" + }, + "out": { + "capacity": "139600000", + "isEnabled": true, + "rate": "1615" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "139400000", + "isEnabled": true, + "rate": "1613" + }, + "out": { + "capacity": "85800000", + "isEnabled": true, + "rate": "993" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + } + }, + "BTR": { + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BYTES": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CANNED": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CGX": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CHEX": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CHIKA": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CKP": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "44400000000000000000000", + "isEnabled": true, + "rate": "12432000000000000000" + }, + "out": { + "capacity": "30500000000000000000000", + "isEnabled": true, + "rate": "8540000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "56500000000000000000000", + "isEnabled": true, + "rate": "15820000000000000000" + }, + "out": { + "capacity": "62300000000000000000000", + "isEnabled": true, + "rate": "17444000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + } + } + } + } + } + }, + "clBTC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CRTV": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DAMN": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DEGEN": { + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DFX": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3145000000000000000000000", + "isEnabled": true, + "rate": "35853000000000000000" + }, + "out": { + "capacity": "2865000000000000000000000", + "isEnabled": true, + "rate": "32661000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "2840000000000000000000000", + "isEnabled": true, + "rate": "32376000000000000000" + }, + "out": { + "capacity": "2025000000000000000000000", + "isEnabled": true, + "rate": "23085000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2065000000000000000000000", + "isEnabled": true, + "rate": "23541000000000000000" + }, + "out": { + "capacity": "2795000000000000000000000", + "isEnabled": true, + "rate": "31863000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "3105000000000000000000000", + "isEnabled": true, + "rate": "35397000000000000000" + }, + "out": { + "capacity": "1705000000000000000000000", + "isEnabled": true, + "rate": "19437000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "3080000000000000000000000", + "isEnabled": true, + "rate": "35112000000000000000" + }, + "out": { + "capacity": "2095000000000000000000000", + "isEnabled": true, + "rate": "23883000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1600000000000000000000000", + "isEnabled": true, + "rate": "18240000000000000000" + }, + "out": { + "capacity": "1980000000000000000000000", + "isEnabled": true, + "rate": "22572000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + } + } + } + }, + "DIP": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6730000000000000000000000", + "isEnabled": true, + "rate": "1869594000000000000000" + }, + "out": { + "capacity": "3300000000000000000000000", + "isEnabled": true, + "rate": "916740000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + } + } + } + }, + "DOBO": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DOLO": { + "berachain-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DPI": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "386802000000000000000", + "isEnabled": true, + "rate": "26100000000000000" + }, + "out": { + "capacity": "431262000000000000000", + "isEnabled": true, + "rate": "29100000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1698415000000000000000", + "isEnabled": true, + "rate": "117900000000000000" + }, + "out": { + "capacity": "873841000000000000000", + "isEnabled": true, + "rate": "60660000000000000" + } + }, + "standard": { + "in": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + }, + "out": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "245271000000000000000", + "isEnabled": true, + "rate": "16550000000000000" + }, + "out": { + "capacity": "472017000000000000000", + "isEnabled": true, + "rate": "31850000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "469053000000000000000", + "isEnabled": true, + "rate": "31650000000000000" + }, + "out": { + "capacity": "246012000000000000000", + "isEnabled": true, + "rate": "16600000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1571358000000000000000", + "isEnabled": true, + "rate": "109080000000000000" + }, + "out": { + "capacity": "902364000000000000000", + "isEnabled": true, + "rate": "62640000000000000" + } + }, + "standard": { + "in": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + }, + "out": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "223041000000000000000", + "isEnabled": true, + "rate": "15050000000000000" + }, + "out": { + "capacity": "312702000000000000000", + "isEnabled": true, + "rate": "21100000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + } + } + } + }, + "dsETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6383000000000000000", + "isEnabled": true, + "rate": "441900000000000" + }, + "out": { + "capacity": "5967000000000000000", + "isEnabled": true, + "rate": "413100000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "11200000000000000000", + "isEnabled": true, + "rate": "761600000000000" + }, + "out": { + "capacity": "11800000000000000000", + "isEnabled": true, + "rate": "802400000000000" + } + }, + "standard": { + "in": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "5642000000000000000", + "isEnabled": true, + "rate": "390600000000000" + }, + "out": { + "capacity": "6786000000000000000", + "isEnabled": true, + "rate": "469800000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "5213000000000000000", + "isEnabled": true, + "rate": "360900000000000" + }, + "out": { + "capacity": "6084000000000000000", + "isEnabled": true, + "rate": "421200000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "8175000000000000000", + "isEnabled": true, + "rate": "555900000000000" + }, + "out": { + "capacity": "10575000000000000000", + "isEnabled": true, + "rate": "719100000000000" + } + }, + "standard": { + "in": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6981000000000000000", + "isEnabled": true, + "rate": "483300000000000" + }, + "out": { + "capacity": "5317000000000000000", + "isEnabled": true, + "rate": "368100000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + } + } + } + }, + "EARNM": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "240000000000000000000000", + "isEnabled": true, + "rate": "66662400000000000000" + }, + "out": { + "capacity": "359375000000000000000000", + "isEnabled": true, + "rate": "99820000000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "311250000000000000000000", + "isEnabled": true, + "rate": "86452800000000000000" + }, + "out": { + "capacity": "340000000000000000000000", + "isEnabled": true, + "rate": "94438400000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "60000000000000000000000000", + "isEnabled": true, + "rate": "16666800000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": null, + "standard": null + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "36800000000000000000000000", + "isEnabled": true, + "rate": "10222304000000000000000" + }, + "out": { + "capacity": "58400000000000000000000000", + "isEnabled": true, + "rate": "16222352000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "410625000000000000000000", + "isEnabled": true, + "rate": "114055200000000000000" + }, + "out": { + "capacity": "219375000000000000000000", + "isEnabled": true, + "rate": "60933600000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "195000000000000000000000", + "isEnabled": true, + "rate": "54163200000000000000" + }, + "out": { + "capacity": "266250000000000000000000", + "isEnabled": true, + "rate": "73953600000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "23300000000000000000000000", + "isEnabled": true, + "rate": "6472274000000000000000" + }, + "out": { + "capacity": "29750000000000000000000000", + "isEnabled": true, + "rate": "8263955000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + }, + "out": { + "capacity": "45700000000000000000000000", + "isEnabled": true, + "rate": "12694546000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "62700000000000000000000000", + "isEnabled": true, + "rate": "17416806000000000000000" + }, + "out": { + "capacity": "63100000000000000000000000", + "isEnabled": true, + "rate": "17527918000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "29250000000000000000000000", + "isEnabled": true, + "rate": "8125065000000000000000" + }, + "out": { + "capacity": "29350000000000000000000000", + "isEnabled": true, + "rate": "8152843000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + } + } + } + } + } + }, + "EDEN": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "egETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "62400000000000000000", + "isEnabled": true, + "rate": "5778240000000000" + }, + "out": { + "capacity": "61200000000000000000", + "isEnabled": true, + "rate": "5667120000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "55200000000000000000", + "isEnabled": true, + "rate": "5111520000000000" + }, + "out": { + "capacity": "69200000000000000000", + "isEnabled": true, + "rate": "6407920000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + }, + "sonic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "65500000000000000000", + "isEnabled": true, + "rate": "6065300000000000" + }, + "out": { + "capacity": "64400000000000000000", + "isEnabled": true, + "rate": "5963440000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "elizaOS": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "EmCH": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "enzoBTC": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-hashkey-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ETHx": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "598000000000000000000", + "isEnabled": true, + "rate": "33488000000000000" + }, + "out": { + "capacity": "578000000000000000000", + "isEnabled": true, + "rate": "32368000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "464000000000000000000", + "isEnabled": true, + "rate": "25984000000000000" + }, + "out": { + "capacity": "572000000000000000000", + "isEnabled": true, + "rate": "32032000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "469000000000000000000", + "isEnabled": true, + "rate": "26264000000000000" + }, + "out": { + "capacity": "603000000000000000000", + "isEnabled": true, + "rate": "33768000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "632000000000000000000", + "isEnabled": true, + "rate": "35392000000000000" + }, + "out": { + "capacity": "668000000000000000000", + "isEnabled": true, + "rate": "37408000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + } + } + } + }, + "eUSX": { + "plasma-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FEED": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "shibarium-mainnet": { + "custom": null, + "standard": null + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FF": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FHE": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mind-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mind-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mind-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FLUID": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1254000000000000000000000", + "isEnabled": true, + "rate": "14513888888888888888" + }, + "out": { + "capacity": "802000000000000000000000", + "isEnabled": true, + "rate": "9282407407407407407" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1292000000000000000000000", + "isEnabled": true, + "rate": "14953703703703703703" + }, + "out": { + "capacity": "828000000000000000000000", + "isEnabled": true, + "rate": "9583333333333333333" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "186500000000000000000000", + "isEnabled": true, + "rate": "2158551000000000000" + }, + "out": { + "capacity": "317500000000000000000000", + "isEnabled": true, + "rate": "3674745000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "216000000000000000000000", + "isEnabled": true, + "rate": "2499999999999999999" + }, + "out": { + "capacity": "215000000000000000000000", + "isEnabled": true, + "rate": "2488425925925925925" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1202000000000000000000000", + "isEnabled": true, + "rate": "13912037037037037036" + }, + "out": { + "capacity": "1250000000000000000000000", + "isEnabled": true, + "rate": "14467592592592592592" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "668000000000000000000000", + "isEnabled": true, + "rate": "7731481481481481481" + }, + "out": { + "capacity": "840000000000000000000000", + "isEnabled": true, + "rate": "9722222222222222222" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "341000000000000000000000", + "isEnabled": true, + "rate": "3946734000000000000" + }, + "out": { + "capacity": "286500000000000000000000", + "isEnabled": true, + "rate": "3315951000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "315500000000000000000000", + "isEnabled": true, + "rate": "3651620370370370370" + }, + "out": { + "capacity": "260000000000000000000000", + "isEnabled": true, + "rate": "3009259259259259259" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "864000000000000000000000", + "isEnabled": true, + "rate": "9999999999999999999" + }, + "out": { + "capacity": "1066000000000000000000000", + "isEnabled": true, + "rate": "12337962962962962962" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "762000000000000000000000", + "isEnabled": true, + "rate": "8819444444444444444" + }, + "out": { + "capacity": "902000000000000000000000", + "isEnabled": true, + "rate": "10439814814814814814" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "plasma-mainnet": { + "custom": null, + "standard": null + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314814814814814814" + }, + "out": { + "capacity": "336500000000000000000000", + "isEnabled": true, + "rate": "3894675925925925925" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "152500000000000000000000", + "isEnabled": true, + "rate": "1765035000000000000" + }, + "out": { + "capacity": "206500000000000000000000", + "isEnabled": true, + "rate": "2390031000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "239000000000000000000000", + "isEnabled": true, + "rate": "2766186000000000000" + }, + "out": { + "capacity": "312000000000000000000000", + "isEnabled": true, + "rate": "3611088000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "206000000000000000000000", + "isEnabled": true, + "rate": "2384244000000000000" + }, + "out": { + "capacity": "159000000000000000000000", + "isEnabled": true, + "rate": "1840266000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "208500000000000", + "isEnabled": true, + "rate": "2413179000" + }, + "out": { + "capacity": "302500000000000000000000", + "isEnabled": true, + "rate": "3501135000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5787000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "315500000000000", + "isEnabled": true, + "rate": "14606451100" + }, + "out": { + "capacity": "288000000000000", + "isEnabled": true, + "rate": "13333305600" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "200500000000000", + "isEnabled": true, + "rate": "9282388100" + }, + "out": { + "capacity": "264500000000000", + "isEnabled": true, + "rate": "12245344900" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "333000000000000", + "isEnabled": true, + "rate": "15416634600" + }, + "out": { + "capacity": "262500000000000", + "isEnabled": true, + "rate": "12152752500" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "235500000000000", + "isEnabled": true, + "rate": "2725677000" + }, + "out": { + "capacity": "268000000000000", + "isEnabled": true, + "rate": "3101832000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5787000000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5787000000" + } + } + } + } + } + }, + "GEN": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "GHO": { + "avalanche-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "798000000000000000000000", + "isEnabled": true, + "rate": "159600000000000000000" + }, + "out": { + "capacity": "961500000000000000000000", + "isEnabled": true, + "rate": "192300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "462000000000000000000000", + "isEnabled": true, + "rate": "92400000000000000000" + }, + "out": { + "capacity": "1026000000000000000000000", + "isEnabled": true, + "rate": "205200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "973500000000000000000000", + "isEnabled": true, + "rate": "194700000000000000000" + }, + "out": { + "capacity": "645000000000000000000000", + "isEnabled": true, + "rate": "129000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "690000000000000000000000", + "isEnabled": true, + "rate": "138000000000000000000" + }, + "out": { + "capacity": "901500000000000000000000", + "isEnabled": true, + "rate": "180300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "693000000000000000000000", + "isEnabled": true, + "rate": "138600000000000000000" + }, + "out": { + "capacity": "760500000000000000000000", + "isEnabled": true, + "rate": "152100000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "897000000000000000000000", + "isEnabled": true, + "rate": "179400000000000000000" + }, + "out": { + "capacity": "646500000000000000000000", + "isEnabled": true, + "rate": "129300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "555000000000000000000000", + "isEnabled": true, + "rate": "111000000000000000000" + }, + "out": { + "capacity": "618000000000000000000000", + "isEnabled": true, + "rate": "123600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1038000000000000000000000", + "isEnabled": true, + "rate": "207600000000000000000" + }, + "out": { + "capacity": "888000000000000000000000", + "isEnabled": true, + "rate": "177600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "853500000000000000000000", + "isEnabled": true, + "rate": "170700000000000000000" + }, + "out": { + "capacity": "1035000000000000000000000", + "isEnabled": true, + "rate": "207000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "912000000000000000000000", + "isEnabled": true, + "rate": "182400000000000000000" + }, + "out": { + "capacity": "1005000000000000000000000", + "isEnabled": true, + "rate": "201000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "559500000000000000000000", + "isEnabled": true, + "rate": "111900000000000000000" + }, + "out": { + "capacity": "825000000000000000000000", + "isEnabled": true, + "rate": "165000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "643500000000000000000000", + "isEnabled": true, + "rate": "128700000000000000000" + }, + "out": { + "capacity": "744000000000000000000000", + "isEnabled": true, + "rate": "148800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "864000000000000000000000", + "isEnabled": true, + "rate": "172800000000000000000" + }, + "out": { + "capacity": "496500000000000000000000", + "isEnabled": true, + "rate": "99300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "769500000000000000000000", + "isEnabled": true, + "rate": "153900000000000000000" + }, + "out": { + "capacity": "601500000000000000000000", + "isEnabled": true, + "rate": "120300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "808500000000000000000000", + "isEnabled": true, + "rate": "161700000000000000000" + }, + "out": { + "capacity": "714000000000000000000000", + "isEnabled": true, + "rate": "142800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000500000000000000000000", + "isEnabled": true, + "rate": "200100000000000000000" + }, + "out": { + "capacity": "856500000000000000000000", + "isEnabled": true, + "rate": "171300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "460500000000000000000000", + "isEnabled": true, + "rate": "92100000000000000000" + }, + "out": { + "capacity": "672000000000000000000000", + "isEnabled": true, + "rate": "134400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "907500000000000000000000", + "isEnabled": true, + "rate": "181500000000000000000" + }, + "out": { + "capacity": "936000000000000000000000", + "isEnabled": true, + "rate": "187200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "906000000000000000000000", + "isEnabled": true, + "rate": "181200000000000000000" + }, + "out": { + "capacity": "754500000000000000000000", + "isEnabled": true, + "rate": "150900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "811500000000000000000000", + "isEnabled": true, + "rate": "162300000000000000000" + }, + "out": { + "capacity": "655500000000000000000000", + "isEnabled": true, + "rate": "131100000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "561000000000000000000000", + "isEnabled": true, + "rate": "112200000000000000000" + }, + "out": { + "capacity": "894000000000000000000000", + "isEnabled": true, + "rate": "178800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "829500000000000000000000", + "isEnabled": true, + "rate": "165900000000000000000" + }, + "out": { + "capacity": "519000000000000000000000", + "isEnabled": true, + "rate": "103800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "997500000000000000000000", + "isEnabled": true, + "rate": "199500000000000000000" + }, + "out": { + "capacity": "981000000000000000000000", + "isEnabled": true, + "rate": "196200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "861000000000000000000000", + "isEnabled": true, + "rate": "172200000000000000000" + }, + "out": { + "capacity": "933000000000000000000000", + "isEnabled": true, + "rate": "186600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "852000000000000000000000", + "isEnabled": true, + "rate": "170400000000000000000" + }, + "out": { + "capacity": "751500000000000000000000", + "isEnabled": true, + "rate": "150300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "616500000000000000000000", + "isEnabled": true, + "rate": "123300000000000000000" + }, + "out": { + "capacity": "1006500000000000000000000", + "isEnabled": true, + "rate": "201300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "766500000000000000000000", + "isEnabled": true, + "rate": "153300000000000000000" + }, + "out": { + "capacity": "540000000000000000000000", + "isEnabled": true, + "rate": "108000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "541500000000000000000000", + "isEnabled": true, + "rate": "108300000000000000000" + }, + "out": { + "capacity": "708000000000000000000000", + "isEnabled": true, + "rate": "141600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "574500000000000000000000", + "isEnabled": true, + "rate": "114900000000000000000" + }, + "out": { + "capacity": "583500000000000000000000", + "isEnabled": true, + "rate": "116700000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "936000000000000000000000", + "isEnabled": true, + "rate": "187200000000000000000" + }, + "out": { + "capacity": "487500000000000000000000", + "isEnabled": true, + "rate": "97500000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "846000000000000000000000", + "isEnabled": true, + "rate": "169200000000000000000" + }, + "out": { + "capacity": "783000000000000000000000", + "isEnabled": true, + "rate": "156600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "865500000000000000000000", + "isEnabled": true, + "rate": "173100000000000000000" + }, + "out": { + "capacity": "951000000000000000000000", + "isEnabled": true, + "rate": "190200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "642000000000000000000000", + "isEnabled": true, + "rate": "128400000000000000000" + }, + "out": { + "capacity": "604500000000000000000000", + "isEnabled": true, + "rate": "120900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "847500000000000000000000", + "isEnabled": true, + "rate": "169500000000000000000" + }, + "out": { + "capacity": "1026000000000000000000000", + "isEnabled": true, + "rate": "205200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "654000000000000000000000", + "isEnabled": true, + "rate": "130800000000000000000" + }, + "out": { + "capacity": "492000000000000000000000", + "isEnabled": true, + "rate": "98400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "666000000000000000000000", + "isEnabled": true, + "rate": "133200000000000000000" + }, + "out": { + "capacity": "642000000000000000000000", + "isEnabled": true, + "rate": "128400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "478500000000000000000000", + "isEnabled": true, + "rate": "95700000000000000000" + }, + "out": { + "capacity": "508500000000000000000000", + "isEnabled": true, + "rate": "101700000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "808500000000000000000000", + "isEnabled": true, + "rate": "161700000000000000000" + }, + "out": { + "capacity": "525000000000000000000000", + "isEnabled": true, + "rate": "105000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "822000000000000000000000", + "isEnabled": true, + "rate": "164400000000000000000" + }, + "out": { + "capacity": "924000000000000000000000", + "isEnabled": true, + "rate": "184800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + } + }, + "GRT": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "302000000000000000000000", + "isEnabled": true, + "rate": "3495370369140000000" + }, + "out": { + "capacity": "587000000000000000000000", + "isEnabled": true, + "rate": "6793981479090000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "554000000000000000000000", + "isEnabled": true, + "rate": "6412037034780000000" + }, + "out": { + "capacity": "534000000000000000000000", + "isEnabled": true, + "rate": "6180555553380000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "316000000000000000000000", + "isEnabled": true, + "rate": "3657407406120000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037035000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "611000000000000000000000", + "isEnabled": true, + "rate": "7071759256770000000" + }, + "out": { + "capacity": "466000000000000000000000", + "isEnabled": true, + "rate": "5393518516620000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + } + } + } + }, + "hyETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "15120000000000000000", + "isEnabled": true, + "rate": "1080000000000000" + }, + "out": { + "capacity": "16436000000000000000", + "isEnabled": true, + "rate": "1174000000000000" + } + }, + "standard": { + "in": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + }, + "out": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "272000000000000000000", + "isEnabled": true, + "rate": "18876800000000000" + }, + "out": { + "capacity": "189000000000000000000", + "isEnabled": true, + "rate": "13116600000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "34700000000000000" + }, + "out": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "34700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "10612000000000000000", + "isEnabled": true, + "rate": "758000000000000" + }, + "out": { + "capacity": "13692000000000000000", + "isEnabled": true, + "rate": "978000000000000" + } + }, + "standard": { + "in": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + }, + "out": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "11452000000000000000", + "isEnabled": true, + "rate": "818000000000000" + }, + "out": { + "capacity": "12572000000000000000", + "isEnabled": true, + "rate": "898000000000000" + } + }, + "standard": { + "in": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + }, + "out": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": null, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + } + } + } + }, + "IBTC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "189450000", + "isEnabled": true, + "rate": "35069" + }, + "out": { + "capacity": "266400000", + "isEnabled": true, + "rate": "49313" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "210150000", + "isEnabled": true, + "rate": "38901" + }, + "out": { + "capacity": "135900000", + "isEnabled": true, + "rate": "25156" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "202050000", + "isEnabled": true, + "rate": "37401" + }, + "out": { + "capacity": "184950000", + "isEnabled": true, + "rate": "34236" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "225450000", + "isEnabled": true, + "rate": "41733" + }, + "out": { + "capacity": "265050000", + "isEnabled": true, + "rate": "49063" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "243450000", + "isEnabled": true, + "rate": "45065" + }, + "out": { + "capacity": "266850000", + "isEnabled": true, + "rate": "49396" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "267300000", + "isEnabled": true, + "rate": "49480" + }, + "out": { + "capacity": "204300000", + "isEnabled": true, + "rate": "37818" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "220950000", + "isEnabled": true, + "rate": "40900" + }, + "out": { + "capacity": "170100000", + "isEnabled": true, + "rate": "31487" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "264600000", + "isEnabled": true, + "rate": "48980" + }, + "out": { + "capacity": "156150000", + "isEnabled": true, + "rate": "28905" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "295650000", + "isEnabled": true, + "rate": "54728" + }, + "out": { + "capacity": "173250000", + "isEnabled": true, + "rate": "32070" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "231750000", + "isEnabled": true, + "rate": "42899" + }, + "out": { + "capacity": "278100000", + "isEnabled": true, + "rate": "51479" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "167400000", + "isEnabled": true, + "rate": "30987" + }, + "out": { + "capacity": "234900000", + "isEnabled": true, + "rate": "43482" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + } + }, + "ILMT": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "447000000000000", + "isEnabled": true, + "rate": "124166666666" + }, + "out": { + "capacity": "6390000000000000000000000", + "isEnabled": true, + "rate": "1775000000001420000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000", + "isEnabled": true, + "rate": "277777777778" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2777777777780000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "531000000000000", + "isEnabled": true, + "rate": "147500000000" + }, + "out": { + "capacity": "671000000000000", + "isEnabled": true, + "rate": "186388888889" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000", + "isEnabled": true, + "rate": "277777777778" + }, + "out": { + "capacity": "1000000000000000", + "isEnabled": true, + "rate": "277777777778" + } + } + } + } + } + }, + "IXT": { + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "JASMY": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "2120000000000000000000000", + "isEnabled": true, + "rate": "588888851200000000000" + }, + "out": { + "capacity": "3280000000000000000000000", + "isEnabled": true, + "rate": "911111052800000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2380000000000000000000000", + "isEnabled": true, + "rate": "661111068800000000000" + }, + "out": { + "capacity": "2335000000000000000000000", + "isEnabled": true, + "rate": "648611069600000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + } + } + } + } + } + }, + "JCT": { + "bsc-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "kHYPE": { + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "KNET": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LAND": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "10520000000000000000000", + "isEnabled": true, + "rate": "2919300000000000000" + }, + "out": { + "capacity": "6600000000000000000000", + "isEnabled": true, + "rate": "1831500000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "9640000000000000000000", + "isEnabled": true, + "rate": "2675100000000000000" + }, + "out": { + "capacity": "12320000000000000000000", + "isEnabled": true, + "rate": "3418800000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "10140000000000000000000", + "isEnabled": true, + "rate": "2813850000000000000" + }, + "out": { + "capacity": "13840000000000000000000", + "isEnabled": true, + "rate": "3840600000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "11620000000000000000000", + "isEnabled": true, + "rate": "3224550000000000000" + }, + "out": { + "capacity": "10340000000000000000000", + "isEnabled": true, + "rate": "2869350000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "6660000000000000000000", + "isEnabled": true, + "rate": "1848150000000000000" + }, + "out": { + "capacity": "10280000000000000000000", + "isEnabled": true, + "rate": "2852700000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "10060000000000000000000", + "isEnabled": true, + "rate": "2791650000000000000" + }, + "out": { + "capacity": "13040000000000000000000", + "isEnabled": true, + "rate": "3618600000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + } + } + } + }, + "LBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2605000000", + "isEnabled": true, + "rate": "241203" + }, + "out": { + "capacity": "2145000000", + "isEnabled": true, + "rate": "198611" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1880000000", + "isEnabled": true, + "rate": "174074" + }, + "out": { + "capacity": "1795000000", + "isEnabled": true, + "rate": "166203" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2080000000", + "isEnabled": true, + "rate": "192592" + }, + "out": { + "capacity": "2305000000", + "isEnabled": true, + "rate": "213425" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "2890000000", + "isEnabled": true, + "rate": "267592" + }, + "out": { + "capacity": "3255000000", + "isEnabled": true, + "rate": "301388" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2975000000", + "isEnabled": true, + "rate": "275462" + }, + "out": { + "capacity": "1780000000", + "isEnabled": true, + "rate": "164814" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1980000000", + "isEnabled": true, + "rate": "183333" + }, + "out": { + "capacity": "3430000000", + "isEnabled": true, + "rate": "317592" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "3350000000", + "isEnabled": true, + "rate": "310185" + }, + "out": { + "capacity": "2880000000", + "isEnabled": true, + "rate": "266666" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3165000000", + "isEnabled": true, + "rate": "293055" + }, + "out": { + "capacity": "2425000000", + "isEnabled": true, + "rate": "224537" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "3420000000", + "isEnabled": true, + "rate": "316666" + }, + "out": { + "capacity": "1690000000", + "isEnabled": true, + "rate": "156481" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2305000000", + "isEnabled": true, + "rate": "213425" + }, + "out": { + "capacity": "1710000000", + "isEnabled": true, + "rate": "158333" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "3140000000", + "isEnabled": true, + "rate": "290740" + }, + "out": { + "capacity": "1505000000", + "isEnabled": true, + "rate": "139351" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2775000000", + "isEnabled": true, + "rate": "256944" + }, + "out": { + "capacity": "1885000000", + "isEnabled": true, + "rate": "174537" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "3170000000", + "isEnabled": true, + "rate": "293518" + }, + "out": { + "capacity": "2445000000", + "isEnabled": true, + "rate": "226388" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "2585000000", + "isEnabled": true, + "rate": "239351" + }, + "out": { + "capacity": "2665000000", + "isEnabled": true, + "rate": "246759" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "corn-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "2040000000", + "isEnabled": true, + "rate": "188888" + }, + "out": { + "capacity": "1550000000", + "isEnabled": true, + "rate": "143518" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1835000000", + "isEnabled": true, + "rate": "169907" + }, + "out": { + "capacity": "2040000000", + "isEnabled": true, + "rate": "188888" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": null, + "standard": null + }, + "monad-mainnet": { + "custom": null, + "standard": null + }, + "polygon-mainnet-katana": { + "custom": null, + "standard": null + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "2840000000", + "isEnabled": true, + "rate": "262962" + }, + "out": { + "capacity": "1800000000", + "isEnabled": true, + "rate": "166666" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": null, + "standard": null + } + } + }, + "etherlink-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1515000000", + "isEnabled": true, + "rate": "140277" + }, + "out": { + "capacity": "2630000000", + "isEnabled": true, + "rate": "243518" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2730000000", + "isEnabled": true, + "rate": "252777" + }, + "out": { + "capacity": "2345000000", + "isEnabled": true, + "rate": "217129" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "2095000000", + "isEnabled": true, + "rate": "193981" + }, + "out": { + "capacity": "2805000000", + "isEnabled": true, + "rate": "259722" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1555000000", + "isEnabled": true, + "rate": "143981" + }, + "out": { + "capacity": "2600000000", + "isEnabled": true, + "rate": "240740" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "corn-mainnet": { + "custom": { + "in": { + "capacity": "2240000000", + "isEnabled": true, + "rate": "207407" + }, + "out": { + "capacity": "1695000000", + "isEnabled": true, + "rate": "156944" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2820000000", + "isEnabled": true, + "rate": "261111" + }, + "out": { + "capacity": "3490000000", + "isEnabled": true, + "rate": "323148" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "etherlink-mainnet": { + "custom": { + "in": { + "capacity": "3260000000", + "isEnabled": true, + "rate": "301851" + }, + "out": { + "capacity": "1590000000", + "isEnabled": true, + "rate": "147222" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1705000000", + "isEnabled": true, + "rate": "157870" + }, + "out": { + "capacity": "2200000000", + "isEnabled": true, + "rate": "203703" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2975000000", + "isEnabled": true, + "rate": "275462" + }, + "out": { + "capacity": "3015000000", + "isEnabled": true, + "rate": "279166" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "2530000000", + "isEnabled": true, + "rate": "234259" + }, + "out": { + "capacity": "3130000000", + "isEnabled": true, + "rate": "289814" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": null, + "standard": null + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "2700000000", + "isEnabled": true, + "rate": "250000" + }, + "out": { + "capacity": "2595000000", + "isEnabled": true, + "rate": "240277" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2085000000", + "isEnabled": true, + "rate": "193055" + }, + "out": { + "capacity": "3255000000", + "isEnabled": true, + "rate": "301388" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1740000000", + "isEnabled": true, + "rate": "161111" + }, + "out": { + "capacity": "3395000000", + "isEnabled": true, + "rate": "314351" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1655000000", + "isEnabled": true, + "rate": "153240" + }, + "out": { + "capacity": "1630000000", + "isEnabled": true, + "rate": "150925" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2720000000", + "isEnabled": true, + "rate": "251851" + }, + "out": { + "capacity": "3260000000", + "isEnabled": true, + "rate": "301851" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": null, + "standard": null + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1910000000", + "isEnabled": true, + "rate": "176851" + }, + "out": { + "capacity": "1560000000", + "isEnabled": true, + "rate": "144444" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "polygon-mainnet-katana": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2710000000", + "isEnabled": true, + "rate": "250925" + }, + "out": { + "capacity": "2365000000", + "isEnabled": true, + "rate": "218981" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2535000000", + "isEnabled": true, + "rate": "234722" + }, + "out": { + "capacity": "3400000000", + "isEnabled": true, + "rate": "314814" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1850000000", + "isEnabled": true, + "rate": "171296" + }, + "out": { + "capacity": "2830000000", + "isEnabled": true, + "rate": "262037" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2200000000", + "isEnabled": true, + "rate": "203703" + }, + "out": { + "capacity": "2695000000", + "isEnabled": true, + "rate": "249537" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "2745000000", + "isEnabled": true, + "rate": "254166" + }, + "out": { + "capacity": "3405000000", + "isEnabled": true, + "rate": "315277" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1615000000", + "isEnabled": true, + "rate": "149537" + }, + "out": { + "capacity": "3045000000", + "isEnabled": true, + "rate": "281944" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "2195000000", + "isEnabled": true, + "rate": "203240" + }, + "out": { + "capacity": "3000000000", + "isEnabled": true, + "rate": "277777" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2235000000", + "isEnabled": true, + "rate": "206944" + }, + "out": { + "capacity": "3220000000", + "isEnabled": true, + "rate": "298148" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2855000000", + "isEnabled": true, + "rate": "264351" + }, + "out": { + "capacity": "3280000000", + "isEnabled": true, + "rate": "303703" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2860000000", + "isEnabled": true, + "rate": "264814" + }, + "out": { + "capacity": "1525000000", + "isEnabled": true, + "rate": "141203" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1805000000", + "isEnabled": true, + "rate": "167129" + }, + "out": { + "capacity": "2605000000", + "isEnabled": true, + "rate": "241203" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "3260000000", + "isEnabled": true, + "rate": "301851" + }, + "out": { + "capacity": "1630000000", + "isEnabled": true, + "rate": "150925" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2250000000", + "isEnabled": true, + "rate": "208333" + }, + "out": { + "capacity": "3380000000", + "isEnabled": true, + "rate": "312962" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "3230000000", + "isEnabled": true, + "rate": "299074" + }, + "out": { + "capacity": "2370000000", + "isEnabled": true, + "rate": "219444" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "stable-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1900000000", + "isEnabled": true, + "rate": "175925" + }, + "out": { + "capacity": "1950000000", + "isEnabled": true, + "rate": "180555" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "3115000000", + "isEnabled": true, + "rate": "288425" + }, + "out": { + "capacity": "1970000000", + "isEnabled": true, + "rate": "182407" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2070000000", + "isEnabled": true, + "rate": "191666" + }, + "out": { + "capacity": "2325000000", + "isEnabled": true, + "rate": "215277" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1760000000", + "isEnabled": true, + "rate": "162962" + }, + "out": { + "capacity": "3205000000", + "isEnabled": true, + "rate": "296759" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "2255000000", + "isEnabled": true, + "rate": "208796" + }, + "out": { + "capacity": "1965000000", + "isEnabled": true, + "rate": "181944" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "2475000000", + "isEnabled": true, + "rate": "229166" + }, + "out": { + "capacity": "1790000000", + "isEnabled": true, + "rate": "165740" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + } + }, + "LDY": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1635000000000000000000000", + "isEnabled": true, + "rate": "18922400000000000000" + }, + "out": { + "capacity": "1113000000000000000000000", + "isEnabled": true, + "rate": "12881120000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1995000000000000000000000", + "isEnabled": true, + "rate": "23088800000000000000" + }, + "out": { + "capacity": "1224000000000000000000000", + "isEnabled": true, + "rate": "14165760000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1215000000000000000000000", + "isEnabled": true, + "rate": "14061600000000000000" + }, + "out": { + "capacity": "1647000000000000000000000", + "isEnabled": true, + "rate": "19061280000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1101000000000000000000000", + "isEnabled": true, + "rate": "12742240000000000000" + }, + "out": { + "capacity": "1644000000000000000000000", + "isEnabled": true, + "rate": "19026560000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1812000000000000000000000", + "isEnabled": true, + "rate": "20970880000000000000" + }, + "out": { + "capacity": "1185000000000000000000000", + "isEnabled": true, + "rate": "13714400000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1260000000000000000000000", + "isEnabled": true, + "rate": "14582400000000000000" + }, + "out": { + "capacity": "1119000000000000000000000", + "isEnabled": true, + "rate": "12950560000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + } + } + } + }, + "LEASH": { + "avalanche-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LEND": { + "avalanche-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LINK": { + "0g-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ab-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "aptos-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3135000000000", + "isEnabled": true, + "rate": "870276000" + }, + "out": { + "capacity": "1990000000000", + "isEnabled": true, + "rate": "552424000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1595000000000", + "isEnabled": true, + "rate": "442772000" + }, + "out": { + "capacity": "1945000000000", + "isEnabled": true, + "rate": "539932000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1885000000000", + "isEnabled": true, + "rate": "523276000" + }, + "out": { + "capacity": "3380000000000", + "isEnabled": true, + "rate": "938288000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "19350000000000000000000", + "isEnabled": true, + "rate": "5371560000000000000" + }, + "out": { + "capacity": "32800000000000000000000", + "isEnabled": true, + "rate": "9105280000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "32600000000000000000000", + "isEnabled": true, + "rate": "9049760000000000000" + }, + "out": { + "capacity": "29850000000000000000000", + "isEnabled": true, + "rate": "8286360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "2285000000000", + "isEnabled": true, + "rate": "634316000" + }, + "out": { + "capacity": "15550000000000000000000", + "isEnabled": true, + "rate": "4316680000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "17150000000000000000000", + "isEnabled": true, + "rate": "4760840000000000000" + }, + "out": { + "capacity": "19500000000000000000000", + "isEnabled": true, + "rate": "5413200000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "16550000000000000000000", + "isEnabled": true, + "rate": "4594280000000000000" + }, + "out": { + "capacity": "25850000000000000000000", + "isEnabled": true, + "rate": "7175960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "24950000000000000000000", + "isEnabled": true, + "rate": "6926120000000000000" + }, + "out": { + "capacity": "20300000000000000000000", + "isEnabled": true, + "rate": "5635280000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ronin-mainnet": { + "custom": null, + "standard": null + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "19850000000000", + "isEnabled": true, + "rate": "5510360000" + }, + "out": { + "capacity": "17550000000000000000000", + "isEnabled": true, + "rate": "4871880000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "30850000000000000000000", + "isEnabled": true, + "rate": "8563960000000000000" + }, + "out": { + "capacity": "28350000000000000000000", + "isEnabled": true, + "rate": "7869960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "16100000000000000000000", + "isEnabled": true, + "rate": "4469360000000000000" + }, + "out": { + "capacity": "16150000000000000000000", + "isEnabled": true, + "rate": "4483240000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "26750000000000000000000", + "isEnabled": true, + "rate": "7425800000000000000" + }, + "out": { + "capacity": "27100000000000000000000", + "isEnabled": true, + "rate": "7522960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "30600000000000000000000", + "isEnabled": true, + "rate": "8494560000000000000" + }, + "out": { + "capacity": "25200000000000000000000", + "isEnabled": true, + "rate": "6995520000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "28600000000000000000000", + "isEnabled": true, + "rate": "7939360000000000000" + }, + "out": { + "capacity": "25950000000000000000000", + "isEnabled": true, + "rate": "7203720000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "19800000000000000000000", + "isEnabled": true, + "rate": "5496480000000000000" + }, + "out": { + "capacity": "24400000000000000000000", + "isEnabled": true, + "rate": "6773440000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "jovay-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ab-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "1710000000000", + "isEnabled": true, + "rate": "474696000" + }, + "out": { + "capacity": "22100000000000000000000", + "isEnabled": true, + "rate": "6134960000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "19600000000000000000000", + "isEnabled": true, + "rate": "5440960000000000000" + }, + "out": { + "capacity": "26250000000000000000000", + "isEnabled": true, + "rate": "7287000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "17050000000000000000000", + "isEnabled": true, + "rate": "4733080000000000000" + }, + "out": { + "capacity": "29900000000000000000000", + "isEnabled": true, + "rate": "8300240000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "33650000000000000000000", + "isEnabled": true, + "rate": "9341240000000000000" + }, + "out": { + "capacity": "24250000000000000000000", + "isEnabled": true, + "rate": "6731800000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "23700000000000000000000", + "isEnabled": true, + "rate": "6579120000000000000" + }, + "out": { + "capacity": "32350000000000000000000", + "isEnabled": true, + "rate": "8980360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "16950000000000000000000", + "isEnabled": true, + "rate": "4705320000000000000" + }, + "out": { + "capacity": "22950000000000000000000", + "isEnabled": true, + "rate": "6370920000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "25500000000000000000000", + "isEnabled": true, + "rate": "7078800000000000000" + }, + "out": { + "capacity": "28350000000000000000000", + "isEnabled": true, + "rate": "7869960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "20150000000000000000000", + "isEnabled": true, + "rate": "5593640000000000000" + }, + "out": { + "capacity": "20500000000000000000000", + "isEnabled": true, + "rate": "5690800000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "jovay-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "morph-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "31900000000000000000000", + "isEnabled": true, + "rate": "2953940000000000000" + }, + "out": { + "capacity": "28450000000000000000000", + "isEnabled": true, + "rate": "2634470000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "22800000000000000000000", + "isEnabled": true, + "rate": "2111280000000000000" + }, + "out": { + "capacity": "25550000000000000000000", + "isEnabled": true, + "rate": "2365930000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "17550000000000", + "isEnabled": true, + "rate": "4871880000" + }, + "out": { + "capacity": "21750000000000000000000", + "isEnabled": true, + "rate": "6037800000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "31350000000000000000000", + "isEnabled": true, + "rate": "2903010000000000000" + }, + "out": { + "capacity": "30600000000000000000000", + "isEnabled": true, + "rate": "2833560000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "16250000000000000000000", + "isEnabled": true, + "rate": "1504750000000000000" + }, + "out": { + "capacity": "27450000000000000000000", + "isEnabled": true, + "rate": "2541870000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "19200000000000000000000", + "isEnabled": true, + "rate": "1777920000000000000" + }, + "out": { + "capacity": "33900000000000000000000", + "isEnabled": true, + "rate": "3139140000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "xdc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "morph-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "21200000000000000000000", + "isEnabled": true, + "rate": "1963120000000000000" + }, + "out": { + "capacity": "26600000000000000000000", + "isEnabled": true, + "rate": "2463160000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "23850000000000000000000", + "isEnabled": true, + "rate": "2208510000000000000" + }, + "out": { + "capacity": "18600000000000000000000", + "isEnabled": true, + "rate": "1722360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "28450000000000000000000", + "isEnabled": true, + "rate": "2634470000000000000" + }, + "out": { + "capacity": "27350000000000000000000", + "isEnabled": true, + "rate": "2532610000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "33250000000000000000000", + "isEnabled": true, + "rate": "3078950000000000000" + }, + "out": { + "capacity": "23750000000000000000000", + "isEnabled": true, + "rate": "2199250000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "21100000000000", + "isEnabled": true, + "rate": "5857360000" + }, + "out": { + "capacity": "20750000000000", + "isEnabled": true, + "rate": "5760200000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "25300000000000", + "isEnabled": true, + "rate": "7023280000" + }, + "out": { + "capacity": "30700000000000", + "isEnabled": true, + "rate": "8522320000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "18300000000000", + "isEnabled": true, + "rate": "5080080000" + }, + "out": { + "capacity": "26100000000000", + "isEnabled": true, + "rate": "7245360000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "28800000000000000000000", + "isEnabled": true, + "rate": "2666880000000000000" + }, + "out": { + "capacity": "18050000000000000000000", + "isEnabled": true, + "rate": "1671430000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "18250000000000000000000", + "isEnabled": true, + "rate": "1689950000000000000" + }, + "out": { + "capacity": "19350000000000000000000", + "isEnabled": true, + "rate": "1791810000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "2045000000000", + "isEnabled": true, + "rate": "567692000" + }, + "out": { + "capacity": "21000000000000000000000", + "isEnabled": true, + "rate": "5829600000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "22300000000000000000000", + "isEnabled": true, + "rate": "2064980000000000000" + }, + "out": { + "capacity": "16200000000000000000000", + "isEnabled": true, + "rate": "1500120000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "19650000000000", + "isEnabled": true, + "rate": "5454840000" + }, + "out": { + "capacity": "17400000000000000000000", + "isEnabled": true, + "rate": "4830240000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "stable-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "32900000000000000000000", + "isEnabled": true, + "rate": "3046540000000000000" + }, + "out": { + "capacity": "29200000000000000000000", + "isEnabled": true, + "rate": "2703920000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "xdc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LsETH": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LUA": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LUAUSD": { + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LUISA": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LYP": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "15100000000000000000000", + "isEnabled": true, + "rate": "25166666666656600000" + }, + "out": { + "capacity": "19000000000000000000000", + "isEnabled": true, + "rate": "31666666666654000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "19450000000000000000000", + "isEnabled": true, + "rate": "32416666666653700000" + }, + "out": { + "capacity": "20450000000000000000000", + "isEnabled": true, + "rate": "34083333333319700000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + } + } + } + } + } + }, + "mBTC": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "194000000", + "isEnabled": true, + "rate": "8981" + }, + "out": { + "capacity": "164800000", + "isEnabled": true, + "rate": "7629" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "170000000", + "isEnabled": true, + "rate": "7870" + }, + "out": { + "capacity": "213200000", + "isEnabled": true, + "rate": "9870" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "250400000", + "isEnabled": true, + "rate": "11592" + }, + "out": { + "capacity": "235200000", + "isEnabled": true, + "rate": "10888" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "222000000", + "isEnabled": true, + "rate": "10277" + }, + "out": { + "capacity": "122000000", + "isEnabled": true, + "rate": "5647" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "161600000", + "isEnabled": true, + "rate": "7481" + }, + "out": { + "capacity": "195200000", + "isEnabled": true, + "rate": "9036" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "132800000", + "isEnabled": true, + "rate": "6147" + }, + "out": { + "capacity": "228400000", + "isEnabled": true, + "rate": "10573" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "246000000", + "isEnabled": true, + "rate": "11388" + }, + "out": { + "capacity": "267600000", + "isEnabled": true, + "rate": "12388" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "208400000", + "isEnabled": true, + "rate": "9647" + }, + "out": { + "capacity": "234800000", + "isEnabled": true, + "rate": "10870" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "132800000", + "isEnabled": true, + "rate": "6147" + }, + "out": { + "capacity": "266000000", + "isEnabled": true, + "rate": "12314" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "157600000", + "isEnabled": true, + "rate": "7296" + }, + "out": { + "capacity": "135600000", + "isEnabled": true, + "rate": "6277" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "244800000", + "isEnabled": true, + "rate": "11333" + }, + "out": { + "capacity": "263200000", + "isEnabled": true, + "rate": "12184" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "136400000", + "isEnabled": true, + "rate": "6314" + }, + "out": { + "capacity": "214400000", + "isEnabled": true, + "rate": "9925" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "154800000", + "isEnabled": true, + "rate": "7166" + }, + "out": { + "capacity": "155200000", + "isEnabled": true, + "rate": "7184" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + } + }, + "mDLP": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "280800000000000000000000", + "isEnabled": true, + "rate": "3246750000000000000" + }, + "out": { + "capacity": "187616000000000000000000", + "isEnabled": true, + "rate": "2169310000000000000" + } + }, + "standard": { + "in": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + }, + "out": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "279968000000000000000000", + "isEnabled": true, + "rate": "3237130000000000000" + }, + "out": { + "capacity": "173472000000000000000000", + "isEnabled": true, + "rate": "2005770000000000000" + } + }, + "standard": { + "in": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + }, + "out": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + } + } + } + } + } + }, + "MEEM": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6120000000000000000000", + "isEnabled": true, + "rate": "1701360000000000000" + }, + "out": { + "capacity": "4140000000000000000000", + "isEnabled": true, + "rate": "1150920000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "2780000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "2780000000000000000" + } + } + } + } + } + }, + "Memento": { + "avalanche-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "300000000000000000000", + "isEnabled": true, + "rate": "3472200000000000" + }, + "out": { + "capacity": "356000000000000000000", + "isEnabled": true, + "rate": "4120344000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "433400000000000000000", + "isEnabled": true, + "rate": "5016203514000000" + }, + "out": { + "capacity": "452000000000000000000", + "isEnabled": true, + "rate": "5231448000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "729300000000000000000", + "isEnabled": true, + "rate": "8440971903000000" + }, + "out": { + "capacity": "344000000000000000000", + "isEnabled": true, + "rate": "3981456000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "742500000000000000000", + "isEnabled": true, + "rate": "8593749675000000" + }, + "out": { + "capacity": "478000000000000000000", + "isEnabled": true, + "rate": "5532372000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "33275000000000000000000", + "isEnabled": true, + "rate": "385127314770000000" + }, + "out": { + "capacity": "18950000000000000000000", + "isEnabled": true, + "rate": "219328703816000000" + } + }, + "standard": { + "in": { + "capacity": "55000000000000000000000", + "isEnabled": true, + "rate": "636574074000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "578703704000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "701800000000000000000", + "isEnabled": true, + "rate": "8122684878000000" + }, + "out": { + "capacity": "674000000000000000000", + "isEnabled": true, + "rate": "7800876000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "437800000000000000000", + "isEnabled": true, + "rate": "5067129438000000" + }, + "out": { + "capacity": "659000000000000000000", + "isEnabled": true, + "rate": "7627266000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "19635000000000000000000", + "isEnabled": true, + "rate": "227256944418000000" + }, + "out": { + "capacity": "20650000000000000000000", + "isEnabled": true, + "rate": "239004629752000000" + } + }, + "standard": { + "in": { + "capacity": "55000000000000000000000", + "isEnabled": true, + "rate": "636574074000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "578703704000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "672100000000000000000", + "isEnabled": true, + "rate": "7778934891000000" + }, + "out": { + "capacity": "572000000000000000000", + "isEnabled": true, + "rate": "6620328000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "730400000000000000000", + "isEnabled": true, + "rate": "8453703384000000" + }, + "out": { + "capacity": "483000000000000000000", + "isEnabled": true, + "rate": "5590242000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "695200000000000000000", + "isEnabled": true, + "rate": "8046295992000000" + }, + "out": { + "capacity": "415000000000000000000", + "isEnabled": true, + "rate": "4803210000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "499400000000000000000", + "isEnabled": true, + "rate": "5780092374000000" + }, + "out": { + "capacity": "615000000000000000000", + "isEnabled": true, + "rate": "7118010000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + } + }, + "METO": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "46307692354000000000000000", + "isEnabled": true, + "rate": "12863247040000000000000" + }, + "out": { + "capacity": "31000000031000000000000000", + "isEnabled": true, + "rate": "8611110560000000000000" + } + }, + "standard": { + "in": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + }, + "out": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "38692307731000000000000000", + "isEnabled": true, + "rate": "10747862560000000000000" + }, + "out": { + "capacity": "35846153882000000000000000", + "isEnabled": true, + "rate": "9957264320000000000000" + } + }, + "standard": { + "in": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + }, + "out": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + } + } + } + } + } + }, + "MEW": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1610000000000", + "isEnabled": true, + "rate": "447222221" + }, + "out": { + "capacity": "2315000000000", + "isEnabled": true, + "rate": "643055555" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1980000000000", + "isEnabled": true, + "rate": "549999999" + }, + "out": { + "capacity": "2670000000000", + "isEnabled": true, + "rate": "741666666" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "2220000000000", + "isEnabled": true, + "rate": "616666666" + }, + "out": { + "capacity": "3005000000000", + "isEnabled": true, + "rate": "834722221" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2045000000000", + "isEnabled": true, + "rate": "568055555" + }, + "out": { + "capacity": "2415000000000", + "isEnabled": true, + "rate": "670833332" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3030000000000", + "isEnabled": true, + "rate": "841666666" + }, + "out": { + "capacity": "3415000000000", + "isEnabled": true, + "rate": "948611110" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3310000000000", + "isEnabled": true, + "rate": "919444443" + }, + "out": { + "capacity": "3270000000000", + "isEnabled": true, + "rate": "908333332" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1980000000000", + "isEnabled": true, + "rate": "549999999" + }, + "out": { + "capacity": "2895000000000", + "isEnabled": true, + "rate": "804166666" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "3460000000000", + "isEnabled": true, + "rate": "961111110" + }, + "out": { + "capacity": "3345000000000", + "isEnabled": true, + "rate": "929166666" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + } + }, + "MICHI": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "5450000000000", + "isEnabled": true, + "rate": "42903609" + }, + "out": { + "capacity": "5870000000000", + "isEnabled": true, + "rate": "46209943" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3680000000000", + "isEnabled": true, + "rate": "28969776" + }, + "out": { + "capacity": "4350000000000", + "isEnabled": true, + "rate": "34244165" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + } + } + } + } + } + }, + "MILO": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "2430000000000000000000000", + "isEnabled": true, + "rate": "56249640000000000000" + }, + "out": { + "capacity": "3360000000000000000000000", + "isEnabled": true, + "rate": "77777280000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1560000000000000000000000", + "isEnabled": true, + "rate": "36110880000000000000" + }, + "out": { + "capacity": "2105000000000000000000000", + "isEnabled": true, + "rate": "48726540000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + } + } + } + } + } + }, + "mmETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "41300000000000000000", + "isEnabled": true, + "rate": "3824380000000000" + }, + "out": { + "capacity": "36600000000000000000", + "isEnabled": true, + "rate": "3389160000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "51800000000000000000", + "isEnabled": true, + "rate": "4796680000000000" + }, + "out": { + "capacity": "62000000000000000000", + "isEnabled": true, + "rate": "5741200000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "mstETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "62800000000000000000", + "isEnabled": true, + "rate": "5815280000000000" + }, + "out": { + "capacity": "30600000000000000000", + "isEnabled": true, + "rate": "2833560000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "69400000000000000000", + "isEnabled": true, + "rate": "6426440000000000" + }, + "out": { + "capacity": "40800000000000000000", + "isEnabled": true, + "rate": "3778080000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "54500000000000000000", + "isEnabled": true, + "rate": "5046700000000000" + }, + "out": { + "capacity": "64000000000000000000", + "isEnabled": true, + "rate": "5926400000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "42800000000000000000", + "isEnabled": true, + "rate": "3963280000000000" + }, + "out": { + "capacity": "57500000000000000000", + "isEnabled": true, + "rate": "5324500000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "mswETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "30700000000000000000", + "isEnabled": true, + "rate": "2842820000000000" + }, + "out": { + "capacity": "68700000000000000000", + "isEnabled": true, + "rate": "6361620000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "52800000000000000000", + "isEnabled": true, + "rate": "4889280000000000" + }, + "out": { + "capacity": "52000000000000000000", + "isEnabled": true, + "rate": "4815200000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "MVI": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "774367000000000000000", + "isEnabled": true, + "rate": "55760000000000000" + }, + "out": { + "capacity": "402182000000000000000", + "isEnabled": true, + "rate": "28960000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2203113000000000000000", + "isEnabled": true, + "rate": "152030000000000000" + }, + "out": { + "capacity": "1506516000000000000000", + "isEnabled": true, + "rate": "103960000000000000" + } + }, + "standard": { + "in": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + }, + "out": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "482174000000000000000", + "isEnabled": true, + "rate": "34720000000000000" + }, + "out": { + "capacity": "595496000000000000000", + "isEnabled": true, + "rate": "42880000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "564388000000000000000", + "isEnabled": true, + "rate": "40640000000000000" + }, + "out": { + "capacity": "539946000000000000000", + "isEnabled": true, + "rate": "38880000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1739826000000000000000", + "isEnabled": true, + "rate": "120060000000000000" + }, + "out": { + "capacity": "1566510000000000000000", + "isEnabled": true, + "rate": "108100000000000000" + } + }, + "standard": { + "in": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + }, + "out": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "586608000000000000000", + "isEnabled": true, + "rate": "42240000000000000" + }, + "out": { + "capacity": "553278000000000000000", + "isEnabled": true, + "rate": "39840000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + } + } + } + }, + "mwBETH": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "336500000000000000000", + "isEnabled": true, + "rate": "30958000000000000" + }, + "out": { + "capacity": "262000000000000000000", + "isEnabled": true, + "rate": "24104000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + }, + "out": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "329500000000000000000", + "isEnabled": true, + "rate": "30314000000000000" + }, + "out": { + "capacity": "211500000000000000000", + "isEnabled": true, + "rate": "19458000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + }, + "out": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + } + } + } + } + } + }, + "MYST": { + "avalanche-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NEIRO": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NEKO": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NPC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NUON": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "45700000000000000000000", + "isEnabled": true, + "rate": "25386350000000000000" + }, + "out": { + "capacity": "55300000000000000000000", + "isEnabled": true, + "rate": "30719150000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "44600000000000000000000", + "isEnabled": true, + "rate": "24775300000000000000" + }, + "out": { + "capacity": "42700000000000000000000", + "isEnabled": true, + "rate": "23719850000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "51000000000000000000000", + "isEnabled": true, + "rate": "28330500000000000000" + }, + "out": { + "capacity": "34800000000000000000000", + "isEnabled": true, + "rate": "19331400000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "55400000000000000000000", + "isEnabled": true, + "rate": "30774700000000000000" + }, + "out": { + "capacity": "58900000000000000000000", + "isEnabled": true, + "rate": "32718950000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "62000000000000000000000", + "isEnabled": true, + "rate": "34441000000000000000" + }, + "out": { + "capacity": "48300000000000000000000", + "isEnabled": true, + "rate": "26830650000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "54500000000000000000000", + "isEnabled": true, + "rate": "30274750000000000000" + }, + "out": { + "capacity": "45700000000000000000000", + "isEnabled": true, + "rate": "25386350000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + } + }, + "NXPC": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "OHM": { + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ORNG": { + "avalanche-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "OSIS": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "11250225000000000000000", + "isEnabled": true, + "rate": "3105000000000000000" + }, + "out": { + "capacity": "5266772000000000000000", + "isEnabled": true, + "rate": "1453600000000000000" + } + }, + "standard": { + "in": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + }, + "out": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "7616819000000000000000", + "isEnabled": true, + "rate": "2102200000000000000" + }, + "out": { + "capacity": "7516817000000000000000", + "isEnabled": true, + "rate": "2074600000000000000" + } + }, + "standard": { + "in": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + }, + "out": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + } + } + } + } + } + }, + "OVER": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "oXAUT": { + "avalanche-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "6730000000000", + "isEnabled": true, + "rate": "3365000000" + }, + "out": { + "capacity": "6670000000000", + "isEnabled": true, + "rate": "3335000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "ethereum-mainnet-worldchain-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "6040000000000", + "isEnabled": true, + "rate": "3020000000" + }, + "out": { + "capacity": "3660000000000", + "isEnabled": true, + "rate": "1830000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "4170000000000", + "isEnabled": true, + "rate": "2085000000" + }, + "out": { + "capacity": "5240000000000", + "isEnabled": true, + "rate": "2620000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5400000000000", + "isEnabled": true, + "rate": "2700000000" + }, + "out": { + "capacity": "4830000000000", + "isEnabled": true, + "rate": "2415000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-worldchain-1": { + "custom": { + "in": { + "capacity": "3950000000000", + "isEnabled": true, + "rate": "1975000000" + }, + "out": { + "capacity": "4760000000000", + "isEnabled": true, + "rate": "2380000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + } + }, + "PEPE": { + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "28300000000000000000", + "isEnabled": true, + "rate": "7861111111111111" + }, + "out": { + "capacity": "26800000000000000000000000000", + "isEnabled": true, + "rate": "7444444444444445040000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000", + "isEnabled": true, + "rate": "13888888888888890" + }, + "out": { + "capacity": "50000000000000000000000000000", + "isEnabled": true, + "rate": "13888888888888890000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "320000000000000", + "isEnabled": true, + "rate": "88888888888" + }, + "out": { + "capacity": "316500000000000", + "isEnabled": true, + "rate": "87916666666" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "138888888889" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "138888888889" + } + } + } + } + } + }, + "PFVS": { + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "pippin": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "PIXEL": { + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "139200000000000000000000000", + "isEnabled": true, + "rate": "1611111100800000000000" + }, + "out": { + "capacity": "103140000000000000000000000", + "isEnabled": true, + "rate": "1193750000000000000000" + } + }, + "standard": { + "in": { + "capacity": "300000000000000000000000000", + "isEnabled": true, + "rate": "3472222200000000000000" + }, + "out": { + "capacity": "270000000000000000000000000", + "isEnabled": true, + "rate": "3125000000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "203700000000000000000000000", + "isEnabled": true, + "rate": "2357638873800000000000" + }, + "out": { + "capacity": "99900000000000000000000000", + "isEnabled": true, + "rate": "1156250000000000000000" + } + }, + "standard": { + "in": { + "capacity": "300000000000000000000000000", + "isEnabled": true, + "rate": "3472222200000000000000" + }, + "out": { + "capacity": "270000000000000000000000000", + "isEnabled": true, + "rate": "3125000000000000000000" + } + } + } + } + } + }, + "PTsUSDE": { + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "pufETH": { + "berachain-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "RDP": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "23600000000000000000000", + "isEnabled": true, + "rate": "273760000000000000" + }, + "out": { + "capacity": "22900000000000000000000", + "isEnabled": true, + "rate": "265640000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "24050000000000000000000", + "isEnabled": true, + "rate": "278980000000000000" + }, + "out": { + "capacity": "16350000000000000000000", + "isEnabled": true, + "rate": "189660000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + } + } + } + } + } + }, + "REG": { + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "25650000000000000000000", + "isEnabled": true, + "rate": "7182000000000000000" + }, + "out": { + "capacity": "20300000000000000000000", + "isEnabled": true, + "rate": "5684000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "18450000000000000000000", + "isEnabled": true, + "rate": "5166000000000000000" + }, + "out": { + "capacity": "22450000000000000000000", + "isEnabled": true, + "rate": "6286000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "20650000000000000000000", + "isEnabled": true, + "rate": "5782000000000000000" + }, + "out": { + "capacity": "31050000000000000000000", + "isEnabled": true, + "rate": "8694000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "21050000000000000000000", + "isEnabled": true, + "rate": "5894000000000000000" + }, + "out": { + "capacity": "27850000000000000000000", + "isEnabled": true, + "rate": "7798000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "21050000000000000000000", + "isEnabled": true, + "rate": "5894000000000000000" + }, + "out": { + "capacity": "24850000000000000000000", + "isEnabled": true, + "rate": "6958000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "31450000000000000000000", + "isEnabled": true, + "rate": "8806000000000000000" + }, + "out": { + "capacity": "31250000000000000000000", + "isEnabled": true, + "rate": "8750000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + } + } + } + }, + "RETH": { + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "909000000000000000000", + "isEnabled": true, + "rate": "2922435000000000" + }, + "out": { + "capacity": "765000000000000000000", + "isEnabled": true, + "rate": "2459475000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "720000000000000000000", + "isEnabled": true, + "rate": "2314800000000000" + }, + "out": { + "capacity": "1209600000000000000000", + "isEnabled": true, + "rate": "3888864000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + }, + "tac-mainnet": { + "custom": null, + "standard": null + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "925200000000000000000", + "isEnabled": true, + "rate": "2974518000000000" + }, + "out": { + "capacity": "864000000000000000000", + "isEnabled": true, + "rate": "2777760000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "833400000000000000000", + "isEnabled": true, + "rate": "2679381000000000" + }, + "out": { + "capacity": "709200000000000000000", + "isEnabled": true, + "rate": "2280078000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1117800000000000000000", + "isEnabled": true, + "rate": "3593727000000000" + }, + "out": { + "capacity": "1206000000000000000000", + "isEnabled": true, + "rate": "3877290000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + } + } + } + }, + "RIZE": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "rsETH": { + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SAS": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "savBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "savETH": { + "avalanche-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "savUSD": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polygon-mainnet-katana": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SD": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "204288000000000000000000", + "isEnabled": true, + "rate": "2364208000000000000" + }, + "out": { + "capacity": "181248000000000000000000", + "isEnabled": true, + "rate": "2097568000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "139008000000000000000000", + "isEnabled": true, + "rate": "1608728000000000000" + }, + "out": { + "capacity": "221952000000000000000000", + "isEnabled": true, + "rate": "2568632000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "135552000000000000000000", + "isEnabled": true, + "rate": "1568732000000000000" + }, + "out": { + "capacity": "121344000000000000000000", + "isEnabled": true, + "rate": "1404304000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "185856000000000000000000", + "isEnabled": true, + "rate": "2150896000000000000" + }, + "out": { + "capacity": "220032000000000000000000", + "isEnabled": true, + "rate": "2546412000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "235776000000000000000000", + "isEnabled": true, + "rate": "2728616000000000000" + }, + "out": { + "capacity": "203904000000000000000000", + "isEnabled": true, + "rate": "2359764000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "268032000000000000000000", + "isEnabled": true, + "rate": "3101912000000000000" + }, + "out": { + "capacity": "248064000000000000000000", + "isEnabled": true, + "rate": "2870824000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + } + } + } + }, + "sDAI": { + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "135500000000000000000000", + "isEnabled": true, + "rate": "37614800000000000000" + }, + "out": { + "capacity": "133250000000000000000000", + "isEnabled": true, + "rate": "36990200000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "133000000000000000000000", + "isEnabled": true, + "rate": "36920800000000000000" + }, + "out": { + "capacity": "82500000000000000000000", + "isEnabled": true, + "rate": "22902000000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + } + } + } + } + } + }, + "SDL": { + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "302250000000000000000000", + "isEnabled": true, + "rate": "83622500000000000000" + }, + "out": { + "capacity": "436500000000000000000000", + "isEnabled": true, + "rate": "120765000000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "311250000000000000000000", + "isEnabled": true, + "rate": "86112500000000000000" + }, + "out": { + "capacity": "444750000000000000000000", + "isEnabled": true, + "rate": "123047500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "331500000000000000000000", + "isEnabled": true, + "rate": "91715000000000000000" + }, + "out": { + "capacity": "261750000000000000000000", + "isEnabled": true, + "rate": "72417500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "353250000000000000000000", + "isEnabled": true, + "rate": "97732500000000000000" + }, + "out": { + "capacity": "327750000000000000000000", + "isEnabled": true, + "rate": "90677500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "378750000000000000000000", + "isEnabled": true, + "rate": "104787500000000000000" + }, + "out": { + "capacity": "240750000000000000000000", + "isEnabled": true, + "rate": "66607500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + } + } + } + }, + "SDM": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": null, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + } + } + } + }, + "sDOLA": { + "berachain-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SDT": { + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "345500000000000000000000", + "isEnabled": true, + "rate": "95966080000000000000" + }, + "out": { + "capacity": "245000000000000000000000", + "isEnabled": true, + "rate": "68051200000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "174500000000000000000000", + "isEnabled": true, + "rate": "48469120000000000000" + }, + "out": { + "capacity": "342500000000000000000000", + "isEnabled": true, + "rate": "95132800000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "326500000000000000000000", + "isEnabled": true, + "rate": "90688640000000000000" + }, + "out": { + "capacity": "292000000000000000000000", + "isEnabled": true, + "rate": "81105920000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "314500000000000000000000", + "isEnabled": true, + "rate": "87355520000000000000" + }, + "out": { + "capacity": "222000000000000000000000", + "isEnabled": true, + "rate": "61662720000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "246000000000000000000000", + "isEnabled": true, + "rate": "68328960000000000000" + }, + "out": { + "capacity": "287500000000000000000000", + "isEnabled": true, + "rate": "79856000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + } + } + } + }, + "SDY": { + "avalanche-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1680000000000000000000000", + "isEnabled": true, + "rate": "19488000000000000000" + }, + "out": { + "capacity": "2880000000000000000000000", + "isEnabled": true, + "rate": "33408000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3240000000000000000000000", + "isEnabled": true, + "rate": "37584000000000000000" + }, + "out": { + "capacity": "2095000000000000000000000", + "isEnabled": true, + "rate": "24302000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3040000000000000000000000", + "isEnabled": true, + "rate": "35264000000000000000" + }, + "out": { + "capacity": "1780000000000000000000000", + "isEnabled": true, + "rate": "20648000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "3420000000000000000000000", + "isEnabled": true, + "rate": "39672000000000000000" + }, + "out": { + "capacity": "3270000000000000000000000", + "isEnabled": true, + "rate": "37932000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2640000000000000000000000", + "isEnabled": true, + "rate": "30624000000000000000" + }, + "out": { + "capacity": "3215000000000000000000000", + "isEnabled": true, + "rate": "37294000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + } + }, + "SHIB": { + "avalanche-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SHIPA": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "shibarium-mainnet": { + "custom": null, + "standard": null + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SHIRO": { + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SILO": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "sINV": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6230000000000000000000", + "isEnabled": true, + "rate": "68530000000000000" + }, + "out": { + "capacity": "6970000000000000000000", + "isEnabled": true, + "rate": "76670000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4090000000000000000000", + "isEnabled": true, + "rate": "44990000000000000" + }, + "out": { + "capacity": "5190000000000000000000", + "isEnabled": true, + "rate": "57090000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "6020000000000000000000", + "isEnabled": true, + "rate": "66220000000000000" + }, + "out": { + "capacity": "5920000000000000000000", + "isEnabled": true, + "rate": "65120000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "5780000000000000000000", + "isEnabled": true, + "rate": "63580000000000000" + }, + "out": { + "capacity": "5340000000000000000000", + "isEnabled": true, + "rate": "58740000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6800000000000000000000", + "isEnabled": true, + "rate": "74800000000000000" + }, + "out": { + "capacity": "3700000000000000000000", + "isEnabled": true, + "rate": "40700000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3170000000000000000000", + "isEnabled": true, + "rate": "34870000000000000" + }, + "out": { + "capacity": "6150000000000000000000", + "isEnabled": true, + "rate": "67650000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "5490000000000000000000", + "isEnabled": true, + "rate": "60390000000000000" + }, + "out": { + "capacity": "5850000000000000000000", + "isEnabled": true, + "rate": "64350000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "3670000000000000000000", + "isEnabled": true, + "rate": "40370000000000000" + }, + "out": { + "capacity": "6250000000000000000000", + "isEnabled": true, + "rate": "68750000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "4580000000000000000000", + "isEnabled": true, + "rate": "50380000000000000" + }, + "out": { + "capacity": "4720000000000000000000", + "isEnabled": true, + "rate": "51920000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + } + }, + "SKYA": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SNOW": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SOIL": { + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SolvBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1085000000000000000", + "isEnabled": true, + "rate": "50231160000000" + }, + "out": { + "capacity": "1522500000000000000", + "isEnabled": true, + "rate": "70485660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1030000000000000000", + "isEnabled": true, + "rate": "47684880000000" + }, + "out": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1045000000000000000", + "isEnabled": true, + "rate": "48379320000000" + }, + "out": { + "capacity": "1497500000000000000", + "isEnabled": true, + "rate": "69328260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1500000000000000000", + "isEnabled": true, + "rate": "69444000000000" + }, + "out": { + "capacity": "1662500000000000000", + "isEnabled": true, + "rate": "76967100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1705000000000000000", + "isEnabled": true, + "rate": "78934680000000" + }, + "out": { + "capacity": "1662500000000000000", + "isEnabled": true, + "rate": "76967100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "860000000000000000", + "isEnabled": true, + "rate": "39814560000000" + }, + "out": { + "capacity": "897500000000000000", + "isEnabled": true, + "rate": "41550660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1185000000000000000", + "isEnabled": true, + "rate": "54860760000000" + }, + "out": { + "capacity": "965000000000000000", + "isEnabled": true, + "rate": "44675640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "837500000000000000", + "isEnabled": true, + "rate": "38772900000000" + }, + "out": { + "capacity": "1055000000000000000", + "isEnabled": true, + "rate": "48842280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1027500000000000000", + "isEnabled": true, + "rate": "47569140000000" + }, + "out": { + "capacity": "1575000000000000000", + "isEnabled": true, + "rate": "72916200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1197500000000000000", + "isEnabled": true, + "rate": "55439460000000" + }, + "out": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1122500000000000000", + "isEnabled": true, + "rate": "51967260000000" + }, + "out": { + "capacity": "1412500000000000000", + "isEnabled": true, + "rate": "65393100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1225000000000000000", + "isEnabled": true, + "rate": "56712600000000" + }, + "out": { + "capacity": "1372500000000000000", + "isEnabled": true, + "rate": "63541260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1602500000000000000", + "isEnabled": true, + "rate": "74189340000000" + }, + "out": { + "capacity": "1192500000000000000", + "isEnabled": true, + "rate": "55207980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "782500000000000000", + "isEnabled": true, + "rate": "36226620000000" + }, + "out": { + "capacity": "1567500000000000000", + "isEnabled": true, + "rate": "72568980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1167500000000000000", + "isEnabled": true, + "rate": "54050580000000" + }, + "out": { + "capacity": "847500000000000000", + "isEnabled": true, + "rate": "39235860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1585000000000000000", + "isEnabled": true, + "rate": "73379160000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "835000000000000000", + "isEnabled": true, + "rate": "38657160000000" + }, + "out": { + "capacity": "1297500000000000000", + "isEnabled": true, + "rate": "60069060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + }, + "out": { + "capacity": "1675000000000000000", + "isEnabled": true, + "rate": "77545800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1042500000000000000", + "isEnabled": true, + "rate": "48263580000000" + }, + "out": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "817500000000000000", + "isEnabled": true, + "rate": "37846980000000" + }, + "out": { + "capacity": "1067500000000000000", + "isEnabled": true, + "rate": "49420980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1142500000000000000", + "isEnabled": true, + "rate": "52893180000000" + }, + "out": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "927500000000000000", + "isEnabled": true, + "rate": "42939540000000" + }, + "out": { + "capacity": "1227500000000000000", + "isEnabled": true, + "rate": "56828340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + }, + "out": { + "capacity": "765000000000000000", + "isEnabled": true, + "rate": "35416440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + }, + "out": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1230000000000000000", + "isEnabled": true, + "rate": "56944080000000" + }, + "out": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1492500000000000000", + "isEnabled": true, + "rate": "69096780000000" + }, + "out": { + "capacity": "930000000000000000", + "isEnabled": true, + "rate": "43055280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1735000000000000000", + "isEnabled": true, + "rate": "80323560000000" + }, + "out": { + "capacity": "1460000000000000000", + "isEnabled": true, + "rate": "67592160000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1745000000000000000", + "isEnabled": true, + "rate": "80786520000000" + }, + "out": { + "capacity": "1547500000000000000", + "isEnabled": true, + "rate": "71643060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1610000000000000000", + "isEnabled": true, + "rate": "74536560000000" + }, + "out": { + "capacity": "762500000000000000", + "isEnabled": true, + "rate": "35300700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1282500000000000000", + "isEnabled": true, + "rate": "59374620000000" + }, + "out": { + "capacity": "1015000000000000000", + "isEnabled": true, + "rate": "46990440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1467500000000000000", + "isEnabled": true, + "rate": "67939380000000" + }, + "out": { + "capacity": "1135000000000000000", + "isEnabled": true, + "rate": "52545960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1435000000000000000", + "isEnabled": true, + "rate": "66434760000000" + }, + "out": { + "capacity": "1347500000000000000", + "isEnabled": true, + "rate": "62383860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1520000000000000000", + "isEnabled": true, + "rate": "70369920000000" + }, + "out": { + "capacity": "1327500000000000000", + "isEnabled": true, + "rate": "61457940000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "875000000000000000", + "isEnabled": true, + "rate": "40509000000000" + }, + "out": { + "capacity": "1392500000000000000", + "isEnabled": true, + "rate": "64467180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "251250000", + "isEnabled": true, + "rate": "11631" + }, + "out": { + "capacity": "2977500000000000000", + "isEnabled": true, + "rate": "137846340000000" + } + }, + "standard": { + "in": { + "capacity": "750000000", + "isEnabled": true, + "rate": "34722" + }, + "out": { + "capacity": "7500000000000000000", + "isEnabled": true, + "rate": "347220000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1437500000000000000", + "isEnabled": true, + "rate": "66550500000000" + }, + "out": { + "capacity": "840000000000000000", + "isEnabled": true, + "rate": "38888640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1330000000000000000", + "isEnabled": true, + "rate": "61573680000000" + }, + "out": { + "capacity": "1270000000000000000", + "isEnabled": true, + "rate": "58795920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1197500000000000000", + "isEnabled": true, + "rate": "55439460000000" + }, + "out": { + "capacity": "1667500000000000000", + "isEnabled": true, + "rate": "77198580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1382500000000000000", + "isEnabled": true, + "rate": "64004220000000" + }, + "out": { + "capacity": "1570000000000000000", + "isEnabled": true, + "rate": "72684720000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1447500000000000000", + "isEnabled": true, + "rate": "67013460000000" + }, + "out": { + "capacity": "1380000000000000000", + "isEnabled": true, + "rate": "63888480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1217500000000000000", + "isEnabled": true, + "rate": "56365380000000" + }, + "out": { + "capacity": "1287500000000000000", + "isEnabled": true, + "rate": "59606100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "952500000000000000", + "isEnabled": true, + "rate": "44096940000000" + }, + "out": { + "capacity": "1172500000000000000", + "isEnabled": true, + "rate": "54282060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1035000000000000000", + "isEnabled": true, + "rate": "47916360000000" + }, + "out": { + "capacity": "980000000000000000", + "isEnabled": true, + "rate": "45370080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1652500000000000000", + "isEnabled": true, + "rate": "76504140000000" + }, + "out": { + "capacity": "1105000000000000000", + "isEnabled": true, + "rate": "51157080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1565000000000000000", + "isEnabled": true, + "rate": "72453240000000" + }, + "out": { + "capacity": "780000000000000000", + "isEnabled": true, + "rate": "36110880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1582500000000000000", + "isEnabled": true, + "rate": "73263420000000" + }, + "out": { + "capacity": "980000000000000000", + "isEnabled": true, + "rate": "45370080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + }, + "out": { + "capacity": "847500000000000000", + "isEnabled": true, + "rate": "39235860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1675000000000000000", + "isEnabled": true, + "rate": "77545800000000" + }, + "out": { + "capacity": "1602500000000000000", + "isEnabled": true, + "rate": "74189340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1062500000000000000", + "isEnabled": true, + "rate": "49189500000000" + }, + "out": { + "capacity": "1145000000000000000", + "isEnabled": true, + "rate": "53008920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1090000000000000000", + "isEnabled": true, + "rate": "50462640000000" + }, + "out": { + "capacity": "1430000000000000000", + "isEnabled": true, + "rate": "66203280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1450000000000000000", + "isEnabled": true, + "rate": "67129200000000" + }, + "out": { + "capacity": "1145000000000000000", + "isEnabled": true, + "rate": "53008920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1730000000000000000", + "isEnabled": true, + "rate": "80092080000000" + }, + "out": { + "capacity": "1547500000000000000", + "isEnabled": true, + "rate": "71643060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "987500000000000000", + "isEnabled": true, + "rate": "45717300000000" + }, + "out": { + "capacity": "895000000000000000", + "isEnabled": true, + "rate": "41434920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1135000000000000000", + "isEnabled": true, + "rate": "52545960000000" + }, + "out": { + "capacity": "907500000000000000", + "isEnabled": true, + "rate": "42013620000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1560000000000000000", + "isEnabled": true, + "rate": "72221760000000" + }, + "out": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1285000000000000000", + "isEnabled": true, + "rate": "59490360000000" + }, + "out": { + "capacity": "1300000000000000000", + "isEnabled": true, + "rate": "60184800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1727500000000000000", + "isEnabled": true, + "rate": "79976340000000" + }, + "out": { + "capacity": "1155000000000000000", + "isEnabled": true, + "rate": "53471880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1270000000000000000", + "isEnabled": true, + "rate": "58795920000000" + }, + "out": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1285000000000000000", + "isEnabled": true, + "rate": "59490360000000" + }, + "out": { + "capacity": "1477500000000000000", + "isEnabled": true, + "rate": "68402340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1400000000000000000", + "isEnabled": true, + "rate": "64814400000000" + }, + "out": { + "capacity": "850000000000000000", + "isEnabled": true, + "rate": "39351600000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1012500000000000000", + "isEnabled": true, + "rate": "46874700000000" + }, + "out": { + "capacity": "827500000000000000", + "isEnabled": true, + "rate": "38309940000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1077500000000000000", + "isEnabled": true, + "rate": "49883940000000" + }, + "out": { + "capacity": "1432500000000000000", + "isEnabled": true, + "rate": "66319020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1175000000000000000", + "isEnabled": true, + "rate": "54397800000000" + }, + "out": { + "capacity": "1462500000000000000", + "isEnabled": true, + "rate": "67707900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "817500000000000000", + "isEnabled": true, + "rate": "37846980000000" + }, + "out": { + "capacity": "817500000000000000", + "isEnabled": true, + "rate": "37846980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1047500000000000000", + "isEnabled": true, + "rate": "48495060000000" + }, + "out": { + "capacity": "942500000000000000", + "isEnabled": true, + "rate": "43633980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "937500000000000000", + "isEnabled": true, + "rate": "43402500000000" + }, + "out": { + "capacity": "1155000000000000000", + "isEnabled": true, + "rate": "53471880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1202500000000000000", + "isEnabled": true, + "rate": "55670940000000" + }, + "out": { + "capacity": "910000000000000000", + "isEnabled": true, + "rate": "42129360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1285000000000000000", + "isEnabled": true, + "rate": "59490360000000" + }, + "out": { + "capacity": "1450000000000000000", + "isEnabled": true, + "rate": "67129200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1160000000000000000", + "isEnabled": true, + "rate": "53703360000000" + }, + "out": { + "capacity": "1527500000000000000", + "isEnabled": true, + "rate": "70717140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-taiko-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "775000000000000000", + "isEnabled": true, + "rate": "35879400000000" + }, + "out": { + "capacity": "1107500000000000000", + "isEnabled": true, + "rate": "51272820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 6, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "855000000000000000", + "isEnabled": true, + "rate": "39583080000000" + }, + "out": { + "capacity": "1380000000000000000", + "isEnabled": true, + "rate": "63888480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1382500000000000000", + "isEnabled": true, + "rate": "64004220000000" + }, + "out": { + "capacity": "902500000000000000", + "isEnabled": true, + "rate": "41782140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "95850000000000000000", + "isEnabled": true, + "rate": "1109367900000000" + }, + "out": { + "capacity": "1577500000000000000", + "isEnabled": true, + "rate": "73031940000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736100000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1242500000000000000", + "isEnabled": true, + "rate": "57522780000000" + }, + "out": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1237500000000000000", + "isEnabled": true, + "rate": "57291300000000" + }, + "out": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1640000000000000000", + "isEnabled": true, + "rate": "75925440000000" + }, + "out": { + "capacity": "777500000000000000", + "isEnabled": true, + "rate": "35995140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "845000000000000000", + "isEnabled": true, + "rate": "39120120000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1737500000000000000", + "isEnabled": true, + "rate": "80439300000000" + }, + "out": { + "capacity": "792500000000000000", + "isEnabled": true, + "rate": "36689580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1382500000000000000", + "isEnabled": true, + "rate": "64004220000000" + }, + "out": { + "capacity": "897500000000000000", + "isEnabled": true, + "rate": "41550660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + }, + "out": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1470000000000000000", + "isEnabled": true, + "rate": "68055120000000" + }, + "out": { + "capacity": "867500000000000000", + "isEnabled": true, + "rate": "40161780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1557500000000000000", + "isEnabled": true, + "rate": "72106020000000" + }, + "out": { + "capacity": "1695000000000000000", + "isEnabled": true, + "rate": "78471720000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "752500000000000000", + "isEnabled": true, + "rate": "34837740000000" + }, + "out": { + "capacity": "1117500000000000000", + "isEnabled": true, + "rate": "51735780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-taiko-1": { + "custom": { + "in": { + "capacity": "1702500000000000000", + "isEnabled": true, + "rate": "78818940000000" + }, + "out": { + "capacity": "1325000000000000000", + "isEnabled": true, + "rate": "61342200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1040000000000000000", + "isEnabled": true, + "rate": "48147840000000" + }, + "out": { + "capacity": "82950000000000000000", + "isEnabled": true, + "rate": "960008000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736000000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1592500000000000000", + "isEnabled": true, + "rate": "73726380000000" + }, + "out": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "757500000000000000", + "isEnabled": true, + "rate": "35069220000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "3260000000000000000", + "isEnabled": true, + "rate": "37731240000000" + }, + "out": { + "capacity": "13500000000000000000", + "isEnabled": true, + "rate": "156249000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1565000000000000000", + "isEnabled": true, + "rate": "72453240000000" + }, + "out": { + "capacity": "1740000000000000000", + "isEnabled": true, + "rate": "80555040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "101000000", + "isEnabled": true, + "rate": "4675" + }, + "out": { + "capacity": "1557500000000000000", + "isEnabled": true, + "rate": "72106020000000" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1350000000000000000", + "isEnabled": true, + "rate": "62499600000000" + }, + "out": { + "capacity": "24120000000000000000", + "isEnabled": true, + "rate": "279164880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "875000000000000000", + "isEnabled": true, + "rate": "40509000000000" + }, + "out": { + "capacity": "930000000000000000", + "isEnabled": true, + "rate": "43055280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "947500000000000000", + "isEnabled": true, + "rate": "43865460000000" + }, + "out": { + "capacity": "1037500000000000000", + "isEnabled": true, + "rate": "48032100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1455000000000000000", + "isEnabled": true, + "rate": "67360680000000" + }, + "out": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1692500000000000000", + "isEnabled": true, + "rate": "78355980000000" + }, + "out": { + "capacity": "1597500000000000000", + "isEnabled": true, + "rate": "73957860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "765000000000000000", + "isEnabled": true, + "rate": "35416440000000" + }, + "out": { + "capacity": "935000000000000000", + "isEnabled": true, + "rate": "43286760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1632500000000000000", + "isEnabled": true, + "rate": "75578220000000" + }, + "out": { + "capacity": "1592500000000000000", + "isEnabled": true, + "rate": "73726380000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + }, + "out": { + "capacity": "915000000000000000", + "isEnabled": true, + "rate": "42360840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "830000000000000000", + "isEnabled": true, + "rate": "38425680000000" + }, + "out": { + "capacity": "927500000000000000", + "isEnabled": true, + "rate": "42939540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + }, + "out": { + "capacity": "982500000000000000", + "isEnabled": true, + "rate": "45485820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1590000000000000000", + "isEnabled": true, + "rate": "73610640000000" + }, + "out": { + "capacity": "1212500000000000000", + "isEnabled": true, + "rate": "56133900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "807500000000000000", + "isEnabled": true, + "rate": "37384020000000" + }, + "out": { + "capacity": "1662500000000000000", + "isEnabled": true, + "rate": "76967100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "855000000000000000", + "isEnabled": true, + "rate": "39583080000000" + }, + "out": { + "capacity": "1230000000000000000", + "isEnabled": true, + "rate": "56944080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "19530000000000000000", + "isEnabled": true, + "rate": "226040220000000" + }, + "out": { + "capacity": "2240000000000000000", + "isEnabled": true, + "rate": "25925760000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + }, + "out": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + } + } + } + } + }, + "sei-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + }, + "out": { + "capacity": "1317500000000000000", + "isEnabled": true, + "rate": "60994980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1125000000000000000", + "isEnabled": true, + "rate": "52083000000000" + }, + "out": { + "capacity": "1040000000000000000", + "isEnabled": true, + "rate": "48147840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "912500000000000000", + "isEnabled": true, + "rate": "42245100000000" + }, + "out": { + "capacity": "1135000000000000000", + "isEnabled": true, + "rate": "52545960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "820000000000000000", + "isEnabled": true, + "rate": "37962720000000" + }, + "out": { + "capacity": "1060000000000000000", + "isEnabled": true, + "rate": "49073760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1377500000000000000", + "isEnabled": true, + "rate": "63772740000000" + }, + "out": { + "capacity": "1097500000000000000", + "isEnabled": true, + "rate": "50809860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "750000000000000000", + "isEnabled": true, + "rate": "34722000000000" + }, + "out": { + "capacity": "930000000000000000", + "isEnabled": true, + "rate": "43055280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "419250000", + "isEnabled": true, + "rate": "19409" + }, + "out": { + "capacity": "415500000", + "isEnabled": true, + "rate": "19235" + } + }, + "standard": { + "in": { + "capacity": "750000000", + "isEnabled": true, + "rate": "34722" + }, + "out": { + "capacity": "750000000", + "isEnabled": true, + "rate": "34722" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "160000000", + "isEnabled": true, + "rate": "7407" + }, + "out": { + "capacity": "155500000", + "isEnabled": true, + "rate": "7199" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "990000000000000000", + "isEnabled": true, + "rate": "45833040000000" + }, + "out": { + "capacity": "1147500000000000000", + "isEnabled": true, + "rate": "53124660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1487500000000000000", + "isEnabled": true, + "rate": "68865300000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "39600000000000000000", + "isEnabled": true, + "rate": "458330400000000" + }, + "out": { + "capacity": "912500000000000000", + "isEnabled": true, + "rate": "42245100000000" + } + }, + "standard": { + "in": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1257500000000000000", + "isEnabled": true, + "rate": "58217220000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1340000000000000000", + "isEnabled": true, + "rate": "62036640000000" + }, + "out": { + "capacity": "1330000000000000000", + "isEnabled": true, + "rate": "61573680000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + } + }, + "SolvBTC.BERA": { + "berachain-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1215000000000000000", + "isEnabled": true, + "rate": "56249640000000" + }, + "out": { + "capacity": "800000000000000000", + "isEnabled": true, + "rate": "37036800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "947500000000000000", + "isEnabled": true, + "rate": "43865460000000" + }, + "out": { + "capacity": "762500000000000000", + "isEnabled": true, + "rate": "35300700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "887500000000000000", + "isEnabled": true, + "rate": "41087700000000" + }, + "out": { + "capacity": "1537500000000000000", + "isEnabled": true, + "rate": "71180100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 10, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1572500000000000000", + "isEnabled": true, + "rate": "72800460000000" + }, + "out": { + "capacity": "970000000000000000", + "isEnabled": true, + "rate": "44907120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1057500000000000000", + "isEnabled": true, + "rate": "48958020000000" + }, + "out": { + "capacity": "1330000000000000000", + "isEnabled": true, + "rate": "61573680000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1050000000000000000", + "isEnabled": true, + "rate": "48610800000000" + }, + "out": { + "capacity": "1720000000000000000", + "isEnabled": true, + "rate": "79629120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1667500000000000000", + "isEnabled": true, + "rate": "77198580000000" + }, + "out": { + "capacity": "985000000000000000", + "isEnabled": true, + "rate": "45601560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + }, + "out": { + "capacity": "1337500000000000000", + "isEnabled": true, + "rate": "61920900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "932500000000000000", + "isEnabled": true, + "rate": "43171020000000" + }, + "out": { + "capacity": "1087500000000000000", + "isEnabled": true, + "rate": "50346900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1435000000000000000", + "isEnabled": true, + "rate": "66434760000000" + }, + "out": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1422500000000000000", + "isEnabled": true, + "rate": "65856060000000" + }, + "out": { + "capacity": "1525000000000000000", + "isEnabled": true, + "rate": "70601400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1380000000000000000", + "isEnabled": true, + "rate": "63888480000000" + }, + "out": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + } + }, + "SolvBTC.JUP": { + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + }, + "out": { + "capacity": "1457500000000000000", + "isEnabled": true, + "rate": "67476420000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1282500000000000000", + "isEnabled": true, + "rate": "59374620000000" + }, + "out": { + "capacity": "1132500000000000000", + "isEnabled": true, + "rate": "52430220000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1225000000000000000", + "isEnabled": true, + "rate": "56712600000000" + }, + "out": { + "capacity": "1142500000000000000", + "isEnabled": true, + "rate": "52893180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "2940000000", + "isEnabled": true, + "rate": "34027" + }, + "out": { + "capacity": "34850000000000000000", + "isEnabled": true, + "rate": "403353900000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "57870" + }, + "out": { + "capacity": "50000000000000000000", + "isEnabled": true, + "rate": "578700000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "33900000000000000000", + "isEnabled": true, + "rate": "392358600000000" + }, + "out": { + "capacity": "53800000000000000000", + "isEnabled": true, + "rate": "622681200000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1675000000", + "isEnabled": true, + "rate": "19386" + }, + "out": { + "capacity": "1845000000", + "isEnabled": true, + "rate": "21354" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "57870" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "57870" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1457500000000000000", + "isEnabled": true, + "rate": "67476420000000" + }, + "out": { + "capacity": "1075000000000000000", + "isEnabled": true, + "rate": "49768200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "69000000000000000000", + "isEnabled": true, + "rate": "798606000000000" + }, + "out": { + "capacity": "67600000000000000000", + "isEnabled": true, + "rate": "782402400000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + } + } + } + } + } + }, + "STABLE": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "4704000000000000000000", + "isEnabled": true, + "rate": "54432000000000000" + }, + "out": { + "capacity": "2716000000000000000000", + "isEnabled": true, + "rate": "31428000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3661000000000000000000", + "isEnabled": true, + "rate": "42363000000000000" + }, + "out": { + "capacity": "3430000000000000000000", + "isEnabled": true, + "rate": "39690000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3976000000000000000000", + "isEnabled": true, + "rate": "46008000000000000" + }, + "out": { + "capacity": "3766000000000000000000", + "isEnabled": true, + "rate": "43578000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2625000000000000000000", + "isEnabled": true, + "rate": "30375000000000000" + }, + "out": { + "capacity": "4809000000000000000000", + "isEnabled": true, + "rate": "55647000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "3528000000000000000000", + "isEnabled": true, + "rate": "40824000000000000" + }, + "out": { + "capacity": "3885000000000000000000", + "isEnabled": true, + "rate": "44955000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + } + } + } + }, + "STABUL": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "stBTC": { + "bitcoin-mainnet-bsquared-1": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bitcoin-mainnet-bsquared-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "STBU": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "stTAO": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "145600000000", + "isEnabled": true, + "rate": "15142400" + }, + "out": { + "capacity": "209200000000", + "isEnabled": true, + "rate": "21756800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "157600000000", + "isEnabled": true, + "rate": "16390400" + }, + "out": { + "capacity": "269600000000", + "isEnabled": true, + "rate": "28038400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "191600000000", + "isEnabled": true, + "rate": "19926400" + }, + "out": { + "capacity": "129200000000", + "isEnabled": true, + "rate": "13436800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "134400000000", + "isEnabled": true, + "rate": "13977600" + }, + "out": { + "capacity": "243600000000", + "isEnabled": true, + "rate": "25334400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "241600000000", + "isEnabled": true, + "rate": "25126400" + }, + "out": { + "capacity": "121600000000", + "isEnabled": true, + "rate": "12646400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "184400000000", + "isEnabled": true, + "rate": "19177600" + }, + "out": { + "capacity": "207600000000", + "isEnabled": true, + "rate": "21590400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "145200000000", + "isEnabled": true, + "rate": "15100800" + }, + "out": { + "capacity": "139200000000", + "isEnabled": true, + "rate": "14476800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "272400000000", + "isEnabled": true, + "rate": "28329600" + }, + "out": { + "capacity": "272400000000", + "isEnabled": true, + "rate": "28329600" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "234000000000", + "isEnabled": true, + "rate": "24336000" + }, + "out": { + "capacity": "159200000000", + "isEnabled": true, + "rate": "16556800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "232000000000", + "isEnabled": true, + "rate": "24128000" + }, + "out": { + "capacity": "133200000000", + "isEnabled": true, + "rate": "13852800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "241600000000", + "isEnabled": true, + "rate": "25126400" + }, + "out": { + "capacity": "123600000000", + "isEnabled": true, + "rate": "12854400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "127600000000", + "isEnabled": true, + "rate": "13270400" + }, + "out": { + "capacity": "233200000000", + "isEnabled": true, + "rate": "24252800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + } + }, + "suBTC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "4216000000000000000", + "isEnabled": true, + "rate": "48800200000000" + }, + "out": { + "capacity": "3976000000000000000", + "isEnabled": true, + "rate": "46022200000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3480000000000000000", + "isEnabled": true, + "rate": "40281000000000" + }, + "out": { + "capacity": "5272000000000000000", + "isEnabled": true, + "rate": "61023400000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "5112000000000000000", + "isEnabled": true, + "rate": "59171400000000" + }, + "out": { + "capacity": "5400000000000000000", + "isEnabled": true, + "rate": "62505000000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2768000000000000000", + "isEnabled": true, + "rate": "32039600000000" + }, + "out": { + "capacity": "5280000000000000000", + "isEnabled": true, + "rate": "61116000000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "4056000000000000000", + "isEnabled": true, + "rate": "46948200000000" + }, + "out": { + "capacity": "3696000000000000000", + "isEnabled": true, + "rate": "42781200000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3256000000000000000", + "isEnabled": true, + "rate": "37688200000000" + }, + "out": { + "capacity": "4528000000000000000", + "isEnabled": true, + "rate": "52411600000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + } + } + } + }, + "suETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "86100000000000000000", + "isEnabled": true, + "rate": "975800000000000" + }, + "out": { + "capacity": "57000000000000000000", + "isEnabled": true, + "rate": "646000000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "74100000000000000000", + "isEnabled": true, + "rate": "839800000000000" + }, + "out": { + "capacity": "95850000000000000000", + "isEnabled": true, + "rate": "1086300000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "79050000000000000000", + "isEnabled": true, + "rate": "895900000000000" + }, + "out": { + "capacity": "78600000000000000000", + "isEnabled": true, + "rate": "890800000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "48900000000000000000", + "isEnabled": true, + "rate": "554200000000000" + }, + "out": { + "capacity": "91350000000000000000", + "isEnabled": true, + "rate": "1035300000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "97200000000000000000", + "isEnabled": true, + "rate": "1101600000000000" + }, + "out": { + "capacity": "58500000000000000000", + "isEnabled": true, + "rate": "663000000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "62700000000000000000", + "isEnabled": true, + "rate": "710600000000000" + }, + "out": { + "capacity": "90450000000000000000", + "isEnabled": true, + "rate": "1025100000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + } + }, + "sUSD1+": { + "bsc-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "suUSD": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "78200000000000000000000", + "isEnabled": true, + "rate": "904774000000000000" + }, + "out": { + "capacity": "100200000000000000000000", + "isEnabled": true, + "rate": "1159314000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "89400000000000000000000", + "isEnabled": true, + "rate": "1034358000000000000" + }, + "out": { + "capacity": "101000000000000000000000", + "isEnabled": true, + "rate": "1168570000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "116000000000000000000000", + "isEnabled": true, + "rate": "1342120000000000000" + }, + "out": { + "capacity": "139200000000000000000000", + "isEnabled": true, + "rate": "1610544000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "66600000000000000000000", + "isEnabled": true, + "rate": "770562000000000000" + }, + "out": { + "capacity": "78000000000000000000000", + "isEnabled": true, + "rate": "902460000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "64800000000000000000000", + "isEnabled": true, + "rate": "749736000000000000" + }, + "out": { + "capacity": "64600000000000000000000", + "isEnabled": true, + "rate": "747422000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "71000000000000000000000", + "isEnabled": true, + "rate": "821470000000000000" + }, + "out": { + "capacity": "111600000000000000000000", + "isEnabled": true, + "rate": "1291212000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + } + } + } + }, + "SXT": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "syrupUSDC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "syrupUSDT": { + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "tETH": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "THE": { + "binance-smart-chain-mainnet-opbnb-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "binance-smart-chain-mainnet-opbnb-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "297000000000000000000000", + "isEnabled": true, + "rate": "165132000000000000000" + }, + "out": { + "capacity": "394500000000000000000000", + "isEnabled": true, + "rate": "219342000000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "432000000000000000000000", + "isEnabled": true, + "rate": "240192000000000000000" + }, + "out": { + "capacity": "390750000000000000000000", + "isEnabled": true, + "rate": "217257000000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + } + } + } + } + } + }, + "TRADE": { + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "TREE": { + "avalanche-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "TURBO": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "4704000000000000000000000", + "isEnabled": true, + "rate": "1306666636800000000000" + }, + "out": { + "capacity": "3822000000000000000000000", + "isEnabled": true, + "rate": "1061666642400000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + }, + "out": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "4781000000000000000000000", + "isEnabled": true, + "rate": "1328055525200000000000" + }, + "out": { + "capacity": "2744000000000000000000000", + "isEnabled": true, + "rate": "762222204800000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + }, + "out": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + } + } + } + } + } + }, + "TURTLE": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "una.USDC": { + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "99600000000", + "isEnabled": true, + "rate": "27665560" + }, + "out": { + "capacity": "129000000000", + "isEnabled": true, + "rate": "35831900" + } + }, + "standard": { + "in": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + }, + "out": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "171300000000", + "isEnabled": true, + "rate": "47581430" + }, + "out": { + "capacity": "140100000000", + "isEnabled": true, + "rate": "38915110" + } + }, + "standard": { + "in": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + }, + "out": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + } + } + } + } + } + }, + "una.WEMIX": { + "avalanche-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "62600000000000000000000", + "isEnabled": true, + "rate": "17387150000000000000" + }, + "out": { + "capacity": "118800000000000000000000", + "isEnabled": true, + "rate": "32996700000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "83000000000000000000000", + "isEnabled": true, + "rate": "23053250000000000000" + }, + "out": { + "capacity": "129000000000000000000000", + "isEnabled": true, + "rate": "35829750000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "117000000000000000000000", + "isEnabled": true, + "rate": "32496750000000000000" + }, + "out": { + "capacity": "135400000000000000000000", + "isEnabled": true, + "rate": "37607350000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "71600000000000000000000", + "isEnabled": true, + "rate": "19886900000000000000" + }, + "out": { + "capacity": "90000000000000000000000", + "isEnabled": true, + "rate": "24997500000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "106600000000000000000000", + "isEnabled": true, + "rate": "29608150000000000000" + }, + "out": { + "capacity": "70200000000000000000000", + "isEnabled": true, + "rate": "19498050000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "127000000000000000000000", + "isEnabled": true, + "rate": "35274250000000000000" + }, + "out": { + "capacity": "73400000000000000000000", + "isEnabled": true, + "rate": "20386850000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "102000000000000000000000", + "isEnabled": true, + "rate": "28330500000000000000" + }, + "out": { + "capacity": "139000000000000000000000", + "isEnabled": true, + "rate": "38607250000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "118800000000000000000000", + "isEnabled": true, + "rate": "32996700000000000000" + }, + "out": { + "capacity": "95200000000000000000000", + "isEnabled": true, + "rate": "26441800000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "78400000000000000000000", + "isEnabled": true, + "rate": "21775600000000000000" + }, + "out": { + "capacity": "131400000000000000000000", + "isEnabled": true, + "rate": "36496350000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "63400000000000000000000", + "isEnabled": true, + "rate": "17609350000000000000" + }, + "out": { + "capacity": "123800000000000000000000", + "isEnabled": true, + "rate": "34385450000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "136000000000000000000000", + "isEnabled": true, + "rate": "37774000000000000000" + }, + "out": { + "capacity": "92200000000000000000000", + "isEnabled": true, + "rate": "25608550000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "126000000000000000000000", + "isEnabled": true, + "rate": "34996500000000000000" + }, + "out": { + "capacity": "82400000000000000000000", + "isEnabled": true, + "rate": "22886600000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + } + }, + "uniBTC": { + "aptos-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "94000000", + "isEnabled": true, + "rate": "1088" + }, + "out": { + "capacity": "134200000", + "isEnabled": true, + "rate": "1553" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "129000000", + "isEnabled": true, + "rate": "1493" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "97800000", + "isEnabled": true, + "rate": "1132" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bitcoin-mainnet-bsquared-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "89000000", + "isEnabled": true, + "rate": "5150" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "139800000", + "isEnabled": true, + "rate": "1618" + }, + "out": { + "capacity": "75000000", + "isEnabled": true, + "rate": "868" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "96000000", + "isEnabled": true, + "rate": "1111" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "corn-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "120200000", + "isEnabled": true, + "rate": "1391" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "98000000", + "isEnabled": true, + "rate": "1134" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "61400000", + "isEnabled": true, + "rate": "710" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "96000000", + "isEnabled": true, + "rate": "5555" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "139800000", + "isEnabled": true, + "rate": "8090" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "ethereum-mainnet-unichain-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "130600000", + "isEnabled": true, + "rate": "1511" + }, + "out": { + "capacity": "93600000", + "isEnabled": true, + "rate": "1083" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-xlayer-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "70200000", + "isEnabled": true, + "rate": "812" + }, + "out": { + "capacity": "78400000", + "isEnabled": true, + "rate": "907" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "66000000", + "isEnabled": true, + "rate": "763" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "120400000", + "isEnabled": true, + "rate": "1393" + }, + "out": { + "capacity": "125600000", + "isEnabled": true, + "rate": "1453" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "115800000", + "isEnabled": true, + "rate": "1340" + }, + "out": { + "capacity": "73400000", + "isEnabled": true, + "rate": "849" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "120400000", + "isEnabled": true, + "rate": "1393" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "bitcoin-mainnet-bsquared-1": { + "custom": { + "in": { + "capacity": "101600000", + "isEnabled": true, + "rate": "1176" + }, + "out": { + "capacity": "84000000", + "isEnabled": true, + "rate": "972" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "109000000", + "isEnabled": true, + "rate": "1261" + }, + "out": { + "capacity": "69000000", + "isEnabled": true, + "rate": "798" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "corn-mainnet": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "61200000", + "isEnabled": true, + "rate": "70816" + }, + "out": { + "capacity": "113800000", + "isEnabled": true, + "rate": "131682" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "231428" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "231428" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "127000000", + "isEnabled": true, + "rate": "1470" + }, + "out": { + "capacity": "82000000", + "isEnabled": true, + "rate": "949" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "107800000", + "isEnabled": true, + "rate": "1247" + }, + "out": { + "capacity": "137800000", + "isEnabled": true, + "rate": "1595" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "113600000", + "isEnabled": true, + "rate": "6574" + }, + "out": { + "capacity": "115800000", + "isEnabled": true, + "rate": "6701" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "118000000", + "isEnabled": true, + "rate": "6828" + }, + "out": { + "capacity": "78000000", + "isEnabled": true, + "rate": "4513" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "94800000", + "isEnabled": true, + "rate": "1097" + }, + "out": { + "capacity": "134400000", + "isEnabled": true, + "rate": "1555" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-xlayer-1": { + "custom": { + "in": { + "capacity": "91000000", + "isEnabled": true, + "rate": "1053" + }, + "out": { + "capacity": "73400000", + "isEnabled": true, + "rate": "849" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "0", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "115200000", + "isEnabled": true, + "rate": "1333" + }, + "out": { + "capacity": "75200000", + "isEnabled": true, + "rate": "870" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "137000000", + "isEnabled": true, + "rate": "1585" + }, + "out": { + "capacity": "123800000", + "isEnabled": true, + "rate": "1432" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "113200000", + "isEnabled": true, + "rate": "1310" + }, + "out": { + "capacity": "117400000", + "isEnabled": true, + "rate": "1358" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "96800000", + "isEnabled": true, + "rate": "1120" + }, + "out": { + "capacity": "117600000", + "isEnabled": true, + "rate": "1361" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "UNIO": { + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "32000000000000000000000000", + "isEnabled": true, + "rate": "8888883200000000000000" + }, + "out": { + "capacity": "34650000000000000000000000", + "isEnabled": true, + "rate": "9624993840000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6300000000000000000000000", + "isEnabled": true, + "rate": "218400000000000000000" + }, + "out": { + "capacity": "4800000000000000000000000", + "isEnabled": true, + "rate": "166400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "33900000000000000000000000", + "isEnabled": true, + "rate": "9416660640000000000000" + }, + "out": { + "capacity": "23750000000000000000000000", + "isEnabled": true, + "rate": "6597218000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6345000000000000000000000", + "isEnabled": true, + "rate": "219960000000000000000" + }, + "out": { + "capacity": "10200000000000000000000000", + "isEnabled": true, + "rate": "353600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "7485000000000000000000000", + "isEnabled": true, + "rate": "259480000000000000000" + }, + "out": { + "capacity": "9495000000000000000000000", + "isEnabled": true, + "rate": "329160000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "9630000000000000000000000", + "isEnabled": true, + "rate": "333840000000000000000" + }, + "out": { + "capacity": "6120000000000000000000000", + "isEnabled": true, + "rate": "212160000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + } + } + } + }, + "USAGI": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USD+": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "96800000000", + "isEnabled": true, + "rate": "26620000" + }, + "out": { + "capacity": "110200000000", + "isEnabled": true, + "rate": "30305000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "77400000000", + "isEnabled": true, + "rate": "21285000" + }, + "out": { + "capacity": "87200000000", + "isEnabled": true, + "rate": "23980000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "92000000000", + "isEnabled": true, + "rate": "25300000" + }, + "out": { + "capacity": "99000000000", + "isEnabled": true, + "rate": "27225000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "86800000000", + "isEnabled": true, + "rate": "23870000" + }, + "out": { + "capacity": "82400000000", + "isEnabled": true, + "rate": "22660000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "104600000000", + "isEnabled": true, + "rate": "28765000" + }, + "out": { + "capacity": "105400000000", + "isEnabled": true, + "rate": "28985000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + } + } + } + }, + "USD0": { + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1491000000000000000000000", + "isEnabled": true, + "rate": "17395000000000000000" + }, + "out": { + "capacity": "1020000000000000000000000", + "isEnabled": true, + "rate": "11900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "975000000000000000000000", + "isEnabled": true, + "rate": "11375000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "17500000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1203000000000000000000000", + "isEnabled": true, + "rate": "14035000000000000000" + }, + "out": { + "capacity": "906000000000000000000000", + "isEnabled": true, + "rate": "10570000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1506000000000000000000000", + "isEnabled": true, + "rate": "17570000000000000000" + }, + "out": { + "capacity": "1251000000000000000000000", + "isEnabled": true, + "rate": "14595000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + } + }, + "USD1": { + "ab-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "aptos-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ab-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "morph-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plume-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "morph-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plume-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDC": { + "0g-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "avalanche-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "19250000000", + "isEnabled": true, + "rate": "3850000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "50000000000", + "isEnabled": true, + "rate": "10000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-unichain-1": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDf": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDFI": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "29950000000000000000000", + "isEnabled": true, + "rate": "341430000000000000" + }, + "out": { + "capacity": "18450000000000000000000", + "isEnabled": true, + "rate": "210330000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "34250000000000000000000", + "isEnabled": true, + "rate": "390450000000000000" + }, + "out": { + "capacity": "29900000000000000000000", + "isEnabled": true, + "rate": "340860000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "24500000000000000000000", + "isEnabled": true, + "rate": "279300000000000000" + }, + "out": { + "capacity": "27400000000000000000000", + "isEnabled": true, + "rate": "312360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "20550000000000000000000", + "isEnabled": true, + "rate": "234270000000000000" + }, + "out": { + "capacity": "18600000000000000000000", + "isEnabled": true, + "rate": "212040000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "29850000000000000000000", + "isEnabled": true, + "rate": "340290000000000000" + }, + "out": { + "capacity": "30450000000000000000000", + "isEnabled": true, + "rate": "347130000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "17350000000000000000000", + "isEnabled": true, + "rate": "197790000000000000" + }, + "out": { + "capacity": "25300000000000000000000", + "isEnabled": true, + "rate": "288420000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + } + } + } + }, + "USDM": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "578000000000000000000000", + "isEnabled": true, + "rate": "6704800000000000000" + }, + "out": { + "capacity": "603000000000000000000000", + "isEnabled": true, + "rate": "6994800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "616000000000000000000000", + "isEnabled": true, + "rate": "7145600000000000000" + }, + "out": { + "capacity": "343000000000000000000000", + "isEnabled": true, + "rate": "3978800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "592000000000000000000000", + "isEnabled": true, + "rate": "6867200000000000000" + }, + "out": { + "capacity": "690000000000000000000000", + "isEnabled": true, + "rate": "8004000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "305000000000000000000000", + "isEnabled": true, + "rate": "3538000000000000000" + }, + "out": { + "capacity": "355000000000000000000000", + "isEnabled": true, + "rate": "4118000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "356000000000000000000000", + "isEnabled": true, + "rate": "4129600000000000000" + }, + "out": { + "capacity": "484000000000000000000000", + "isEnabled": true, + "rate": "5614400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "633000000000000000000000", + "isEnabled": true, + "rate": "7342800000000000000" + }, + "out": { + "capacity": "450000000000000000000000", + "isEnabled": true, + "rate": "5220000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "496000000000000000000000", + "isEnabled": true, + "rate": "5753600000000000000" + }, + "out": { + "capacity": "501000000000000000000000", + "isEnabled": true, + "rate": "5811600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "330000000000000000000000", + "isEnabled": true, + "rate": "3828000000000000000" + }, + "out": { + "capacity": "457000000000000000000000", + "isEnabled": true, + "rate": "5301200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "658000000000000000000000", + "isEnabled": true, + "rate": "7632800000000000000" + }, + "out": { + "capacity": "636000000000000000000000", + "isEnabled": true, + "rate": "7377600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "539000000000000000000000", + "isEnabled": true, + "rate": "6252400000000000000" + }, + "out": { + "capacity": "670000000000000000000000", + "isEnabled": true, + "rate": "7772000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4454400000000000000" + }, + "out": { + "capacity": "594000000000000000000000", + "isEnabled": true, + "rate": "6890400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "567000000000000000000000", + "isEnabled": true, + "rate": "6577200000000000000" + }, + "out": { + "capacity": "573000000000000000000000", + "isEnabled": true, + "rate": "6646800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "660000000000000000000000", + "isEnabled": true, + "rate": "7656000000000000000" + }, + "out": { + "capacity": "356000000000000000000000", + "isEnabled": true, + "rate": "4129600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "334000000000000000000000", + "isEnabled": true, + "rate": "3874400000000000000" + }, + "out": { + "capacity": "556000000000000000000000", + "isEnabled": true, + "rate": "6449600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "324000000000000000000000", + "isEnabled": true, + "rate": "3758400000000000000" + }, + "out": { + "capacity": "386000000000000000000000", + "isEnabled": true, + "rate": "4477600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "363000000000000000000000", + "isEnabled": true, + "rate": "4210800000000000000" + }, + "out": { + "capacity": "394000000000000000000000", + "isEnabled": true, + "rate": "4570400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "563000000000000000000000", + "isEnabled": true, + "rate": "6530800000000000000" + }, + "out": { + "capacity": "601000000000000000000000", + "isEnabled": true, + "rate": "6971600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "387000000000000000000000", + "isEnabled": true, + "rate": "4489200000000000000" + }, + "out": { + "capacity": "381000000000000000000000", + "isEnabled": true, + "rate": "4419600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "387000000000000000000000", + "isEnabled": true, + "rate": "4489200000000000000" + }, + "out": { + "capacity": "542000000000000000000000", + "isEnabled": true, + "rate": "6287200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "613000000000000000000000", + "isEnabled": true, + "rate": "7110800000000000000" + }, + "out": { + "capacity": "321000000000000000000000", + "isEnabled": true, + "rate": "3723600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "342000000000000000000000", + "isEnabled": true, + "rate": "3967200000000000000" + }, + "out": { + "capacity": "345000000000000000000000", + "isEnabled": true, + "rate": "4002000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "427000000000000000000000", + "isEnabled": true, + "rate": "4953200000000000000" + }, + "out": { + "capacity": "669000000000000000000000", + "isEnabled": true, + "rate": "7760400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "491000000000000000000000", + "isEnabled": true, + "rate": "5695600000000000000" + }, + "out": { + "capacity": "418000000000000000000000", + "isEnabled": true, + "rate": "4848800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "315000000000000000000000", + "isEnabled": true, + "rate": "3654000000000000000" + }, + "out": { + "capacity": "637000000000000000000000", + "isEnabled": true, + "rate": "7389200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "652000000000000000000000", + "isEnabled": true, + "rate": "7563200000000000000" + }, + "out": { + "capacity": "307000000000000000000000", + "isEnabled": true, + "rate": "3561200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "439000000000000000000000", + "isEnabled": true, + "rate": "5092400000000000000" + }, + "out": { + "capacity": "483000000000000000000000", + "isEnabled": true, + "rate": "5602800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "300000000000000000000000", + "isEnabled": true, + "rate": "3480000000000000000" + }, + "out": { + "capacity": "674000000000000000000000", + "isEnabled": true, + "rate": "7818400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "617000000000000000000000", + "isEnabled": true, + "rate": "7157200000000000000" + }, + "out": { + "capacity": "326000000000000000000000", + "isEnabled": true, + "rate": "3781600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "349000000000000000000000", + "isEnabled": true, + "rate": "4048400000000000000" + }, + "out": { + "capacity": "344000000000000000000000", + "isEnabled": true, + "rate": "3990400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "582000000000000000000000", + "isEnabled": true, + "rate": "6751200000000000000" + }, + "out": { + "capacity": "313000000000000000000000", + "isEnabled": true, + "rate": "3630800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "487000000000000000000000", + "isEnabled": true, + "rate": "5649200000000000000" + }, + "out": { + "capacity": "478000000000000000000000", + "isEnabled": true, + "rate": "5544800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "405000000000000000000000", + "isEnabled": true, + "rate": "4698000000000000000" + }, + "out": { + "capacity": "640000000000000000000000", + "isEnabled": true, + "rate": "7424000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "401000000000000000000000", + "isEnabled": true, + "rate": "4651600000000000000" + }, + "out": { + "capacity": "665000000000000000000000", + "isEnabled": true, + "rate": "7714000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "654000000000000000000000", + "isEnabled": true, + "rate": "7586400000000000000" + }, + "out": { + "capacity": "677000000000000000000000", + "isEnabled": true, + "rate": "7853200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "480000000000000000000000", + "isEnabled": true, + "rate": "5568000000000000000" + }, + "out": { + "capacity": "514000000000000000000000", + "isEnabled": true, + "rate": "5962400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "562000000000000000000000", + "isEnabled": true, + "rate": "6519200000000000000" + }, + "out": { + "capacity": "367000000000000000000000", + "isEnabled": true, + "rate": "4257200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "322000000000000000000000", + "isEnabled": true, + "rate": "3735200000000000000" + }, + "out": { + "capacity": "686000000000000000000000", + "isEnabled": true, + "rate": "7957600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "350000000000000000000000", + "isEnabled": true, + "rate": "4060000000000000000" + }, + "out": { + "capacity": "452000000000000000000000", + "isEnabled": true, + "rate": "5243200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "418000000000000000000000", + "isEnabled": true, + "rate": "4848800000000000000" + }, + "out": { + "capacity": "629000000000000000000000", + "isEnabled": true, + "rate": "7296400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "363000000000000000000000", + "isEnabled": true, + "rate": "4210800000000000000" + }, + "out": { + "capacity": "389000000000000000000000", + "isEnabled": true, + "rate": "4512400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + } + }, + "USDO": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "7276500000000000000000000", + "isEnabled": true, + "rate": "803880000000000000000" + }, + "out": { + "capacity": "6430000000000000000000000", + "isEnabled": true, + "rate": "745880000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "5838000000000000000000000", + "isEnabled": true, + "rate": "644960000000000000000" + }, + "out": { + "capacity": "4830000000000000000000000", + "isEnabled": true, + "rate": "560280000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "3391500000000000000000000", + "isEnabled": true, + "rate": "374680000000000000000" + }, + "out": { + "capacity": "5800000000000000000000000", + "isEnabled": true, + "rate": "672800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "2020000000000000000000000", + "isEnabled": true, + "rate": "23379641600000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870400000000000000" + } + } + } + } + }, + "kaia-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "7686000000000000000000000", + "isEnabled": true, + "rate": "84912000000000000000" + }, + "out": { + "capacity": "13680000000000000000000000", + "isEnabled": true, + "rate": "158688000000000000000" + } + }, + "standard": { + "in": { + "capacity": "21000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "7213500000000000000000000", + "isEnabled": true, + "rate": "796920000000000000000" + }, + "out": { + "capacity": "3920000000000000000000000", + "isEnabled": true, + "rate": "454720000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3674000000000000000000000", + "isEnabled": true, + "rate": "42523169920000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "5500000000000000000000000", + "isEnabled": true, + "rate": "63657440000000000000" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "kaia-mainnet": { + "custom": { + "in": { + "capacity": "14238000000000000000000000", + "isEnabled": true, + "rate": "157296000000000000000" + }, + "out": { + "capacity": "6420000000000000000000000", + "isEnabled": true, + "rate": "74472000000000000000" + } + }, + "standard": { + "in": { + "capacity": "21000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + } + } + } + } + } + }, + "USDT": { + "0g-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3590000000000", + "isEnabled": true, + "rate": "1795000000" + }, + "out": { + "capacity": "5130000000000", + "isEnabled": true, + "rate": "2565000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "16850000000", + "isEnabled": true, + "rate": "3370000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "50000000000", + "isEnabled": true, + "rate": "10000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5960000000000", + "isEnabled": true, + "rate": "2980000000" + }, + "out": { + "capacity": "5120000000000", + "isEnabled": true, + "rate": "2560000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4020000000000", + "isEnabled": true, + "rate": "2010000000" + }, + "out": { + "capacity": "6600000000000", + "isEnabled": true, + "rate": "3300000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "3170000000000", + "isEnabled": true, + "rate": "1585000000" + }, + "out": { + "capacity": "5890000000000", + "isEnabled": true, + "rate": "2945000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "bitcoin-mainnet-botanix": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3040000000000", + "isEnabled": true, + "rate": "1520000000" + }, + "out": { + "capacity": "6900000000000", + "isEnabled": true, + "rate": "3450000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "4310000000000", + "isEnabled": true, + "rate": "2155000000" + }, + "out": { + "capacity": "5170000000000", + "isEnabled": true, + "rate": "2585000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "4450000000000", + "isEnabled": true, + "rate": "2225000000" + }, + "out": { + "capacity": "5060000000000", + "isEnabled": true, + "rate": "2530000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "6730000000000", + "isEnabled": true, + "rate": "3365000000" + }, + "out": { + "capacity": "3820000000000", + "isEnabled": true, + "rate": "1910000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "4620000000000", + "isEnabled": true, + "rate": "2310000000" + }, + "out": { + "capacity": "4190000000000", + "isEnabled": true, + "rate": "2095000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "4080000000000", + "isEnabled": true, + "rate": "2040000000" + }, + "out": { + "capacity": "4240000000000", + "isEnabled": true, + "rate": "2120000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3600000000000", + "isEnabled": true, + "rate": "1800000000" + }, + "out": { + "capacity": "5900000000000", + "isEnabled": true, + "rate": "2950000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "3380000000000", + "isEnabled": true, + "rate": "1690000000" + }, + "out": { + "capacity": "3790000000000", + "isEnabled": true, + "rate": "1895000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "ethereum-mainnet-hashkey-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3120000000000", + "isEnabled": true, + "rate": "1560000000" + }, + "out": { + "capacity": "3760000000000", + "isEnabled": true, + "rate": "1880000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "4980000000000", + "isEnabled": true, + "rate": "2490000000" + }, + "out": { + "capacity": "6080000000000", + "isEnabled": true, + "rate": "3040000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4330000000000", + "isEnabled": true, + "rate": "2165000000" + }, + "out": { + "capacity": "4650000000000", + "isEnabled": true, + "rate": "2325000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 2, + "remote": { + "celo-mainnet": { + "custom": { + "in": { + "capacity": "3890000000000", + "isEnabled": true, + "rate": "1945000000" + }, + "out": { + "capacity": "4420000000000", + "isEnabled": true, + "rate": "2210000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5030000000000", + "isEnabled": true, + "rate": "2515000000" + }, + "out": { + "capacity": "4660000000000", + "isEnabled": true, + "rate": "2330000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "5450000000000", + "isEnabled": true, + "rate": "2725000000" + }, + "out": { + "capacity": "6780000000000", + "isEnabled": true, + "rate": "3390000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4100000000000", + "isEnabled": true, + "rate": "2050000000" + }, + "out": { + "capacity": "6560000000000", + "isEnabled": true, + "rate": "3280000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "5420000000000", + "isEnabled": true, + "rate": "2710000000" + }, + "out": { + "capacity": "6140000000000", + "isEnabled": true, + "rate": "3070000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "5140000000000", + "isEnabled": true, + "rate": "2570000000" + }, + "out": { + "capacity": "5060000000000", + "isEnabled": true, + "rate": "2530000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "5570000000000", + "isEnabled": true, + "rate": "2785000000" + }, + "out": { + "capacity": "4390000000000", + "isEnabled": true, + "rate": "2195000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "bitcoin-mainnet-botanix": { + "custom": { + "in": { + "capacity": "3380000000000", + "isEnabled": true, + "rate": "1690000000" + }, + "out": { + "capacity": "3600000000000", + "isEnabled": true, + "rate": "1800000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "4990000000000", + "isEnabled": true, + "rate": "2495000000" + }, + "out": { + "capacity": "6970000000000", + "isEnabled": true, + "rate": "3485000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5880000000000", + "isEnabled": true, + "rate": "2940000000" + }, + "out": { + "capacity": "6300000000000", + "isEnabled": true, + "rate": "3150000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "5100000000000", + "isEnabled": true, + "rate": "2550000000" + }, + "out": { + "capacity": "6150000000000", + "isEnabled": true, + "rate": "3075000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "6150000000000", + "isEnabled": true, + "rate": "3075000000" + }, + "out": { + "capacity": "4040000000000", + "isEnabled": true, + "rate": "2020000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "6310000000000", + "isEnabled": true, + "rate": "3155000000" + }, + "out": { + "capacity": "6280000000000", + "isEnabled": true, + "rate": "3140000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "4540000000000", + "isEnabled": true, + "rate": "2270000000" + }, + "out": { + "capacity": "5930000000000", + "isEnabled": true, + "rate": "2965000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "4280000000000", + "isEnabled": true, + "rate": "2140000000" + }, + "out": { + "capacity": "6820000000000", + "isEnabled": true, + "rate": "3410000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "6640000000000", + "isEnabled": true, + "rate": "3320000000" + }, + "out": { + "capacity": "4700000000000", + "isEnabled": true, + "rate": "2350000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6220000000000", + "isEnabled": true, + "rate": "3110000000" + }, + "out": { + "capacity": "6230000000000", + "isEnabled": true, + "rate": "3115000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + } + }, + "USELESS": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USUAL": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1431000000000000000000000", + "isEnabled": true, + "rate": "16695000000000000000" + }, + "out": { + "capacity": "2034000000000000000000000", + "isEnabled": true, + "rate": "23730000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1356000000000000000000000", + "isEnabled": true, + "rate": "15820000000000000000" + }, + "out": { + "capacity": "1557000000000000000000000", + "isEnabled": true, + "rate": "18165000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1707000000000000000000000", + "isEnabled": true, + "rate": "19915000000000000000" + }, + "out": { + "capacity": "930000000000000000000000", + "isEnabled": true, + "rate": "10850000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + } + } + } + }, + "USX": { + "plasma-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": null, + "remote": { + "plasma-mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "VOOI": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "VRTX": { + "avalanche-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "6770000000000000000000000", + "isEnabled": true, + "rate": "677000000000000000000000" + }, + "out": { + "capacity": "3420000000000000000000000", + "isEnabled": true, + "rate": "342000000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2200000000000000000000000", + "isEnabled": true, + "rate": "25462800000000000000" + }, + "out": { + "capacity": "1740000000000000000000000", + "isEnabled": true, + "rate": "20138760000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "3160000000000000000000000", + "isEnabled": true, + "rate": "36573840000000000000" + }, + "out": { + "capacity": "1885000000000000000000000", + "isEnabled": true, + "rate": "21816990000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "2810000000000000000000000", + "isEnabled": true, + "rate": "32522940000000000000" + }, + "out": { + "capacity": "3090000000000000000000000", + "isEnabled": true, + "rate": "35763660000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "5440000000000000000000000", + "isEnabled": true, + "rate": "544000000000000000000000" + }, + "out": { + "capacity": "4570000000000000000000000", + "isEnabled": true, + "rate": "457000000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2060000000000000000000000", + "isEnabled": true, + "rate": "23842440000000000000" + }, + "out": { + "capacity": "1895000000000000000000000", + "isEnabled": true, + "rate": "21932730000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "2845000000000000000000000", + "isEnabled": true, + "rate": "32928030000000000000" + }, + "out": { + "capacity": "2720000000000000000000000", + "isEnabled": true, + "rate": "31481280000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1670000000000000000000000", + "isEnabled": true, + "rate": "19328580000000000000" + }, + "out": { + "capacity": "1530000000000000000000000", + "isEnabled": true, + "rate": "17708220000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2715000000000000000000000", + "isEnabled": true, + "rate": "31423410000000000000" + }, + "out": { + "capacity": "1785000000000000000000000", + "isEnabled": true, + "rate": "20659590000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sei-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "6690000000000000000000000", + "isEnabled": true, + "rate": "669000000000000000000000" + }, + "out": { + "capacity": "4380000000000000000000000", + "isEnabled": true, + "rate": "438000000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "VSN": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "29947500000000000000000000", + "isEnabled": true, + "rate": "25047000000000000000" + }, + "out": { + "capacity": "47850000000000000000000000", + "isEnabled": true, + "rate": "44022000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "33825000000000000000000000", + "isEnabled": true, + "rate": "28290000000000000000" + }, + "out": { + "capacity": "38100000000000000000000000", + "isEnabled": true, + "rate": "35052000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "41085000000000000000000000", + "isEnabled": true, + "rate": "34362000000000000000" + }, + "out": { + "capacity": "40650000000000000000000000", + "isEnabled": true, + "rate": "37398000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "53377500000000000000000000", + "isEnabled": true, + "rate": "44643000000000000000" + }, + "out": { + "capacity": "49725000000000000000000000", + "isEnabled": true, + "rate": "45747000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "25162500000000000000000000", + "isEnabled": true, + "rate": "21045000000000000000" + }, + "out": { + "capacity": "32025000000000000000000000", + "isEnabled": true, + "rate": "29463000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "45375000000000000000000000", + "isEnabled": true, + "rate": "37950000000000000000" + }, + "out": { + "capacity": "37875000000000000000000000", + "isEnabled": true, + "rate": "34845000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "29370000000000000000000000", + "isEnabled": true, + "rate": "24564000000000000000" + }, + "out": { + "capacity": "52350000000000000000000000", + "isEnabled": true, + "rate": "48162000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "36877500000000000000000000", + "isEnabled": true, + "rate": "30843000000000000000" + }, + "out": { + "capacity": "30900000000000000000000000", + "isEnabled": true, + "rate": "28428000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + } + }, + "W0G": { + "0g-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WASTR": { + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "4880000000000000000000000", + "isEnabled": true, + "rate": "1355664000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "3270000000000000000000000", + "isEnabled": true, + "rate": "908406000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "5190000000000000000000000", + "isEnabled": true, + "rate": "1441782000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "10720000000000000000000000", + "isEnabled": true, + "rate": "2978016000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "5556000000000000000000" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": null, + "standard": null + } + } + } + }, + "WBTC": { + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "2100000000", + "isEnabled": true, + "rate": "24305" + }, + "out": { + "capacity": "2381400000", + "isEnabled": true, + "rate": "27562" + } + }, + "standard": { + "in": { + "capacity": "4200000000", + "isEnabled": true, + "rate": "48610" + }, + "out": { + "capacity": "3780000000", + "isEnabled": true, + "rate": "43750" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1650600000", + "isEnabled": true, + "rate": "19103" + }, + "out": { + "capacity": "2570400000", + "isEnabled": true, + "rate": "29750" + } + }, + "standard": { + "in": { + "capacity": "4200000000", + "isEnabled": true, + "rate": "48610" + }, + "out": { + "capacity": "3780000000", + "isEnabled": true, + "rate": "43750" + } + } + } + } + } + }, + "WECO": { + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "189000000000000000000000000", + "isEnabled": true, + "rate": "13124160000000000000000" + }, + "out": { + "capacity": "190000000000000000000000000", + "isEnabled": true, + "rate": "13193600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "177500000000000000000000000", + "isEnabled": true, + "rate": "12325600000000000000000" + }, + "out": { + "capacity": "220500000000000000000000000", + "isEnabled": true, + "rate": "15311520000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "176000000000000000000000000", + "isEnabled": true, + "rate": "12221440000000000000000" + }, + "out": { + "capacity": "253000000000000000000000000", + "isEnabled": true, + "rate": "17568320000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "216500000000000000000000000", + "isEnabled": true, + "rate": "15033760000000000000000" + }, + "out": { + "capacity": "322500000000000000000000000", + "isEnabled": true, + "rate": "22394400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "199500000000000000000000000", + "isEnabled": true, + "rate": "13853280000000000000000" + }, + "out": { + "capacity": "193000000000000000000000000", + "isEnabled": true, + "rate": "13401920000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "302000000000000000000000000", + "isEnabled": true, + "rate": "20970880000000000000000" + }, + "out": { + "capacity": "238000000000000000000000000", + "isEnabled": true, + "rate": "16526720000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "198500000000000000000000000", + "isEnabled": true, + "rate": "13783840000000000000000" + }, + "out": { + "capacity": "211500000000000000000000000", + "isEnabled": true, + "rate": "14686560000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "168000000000000000000000000", + "isEnabled": true, + "rate": "11665920000000000000000" + }, + "out": { + "capacity": "167000000000000000000000000", + "isEnabled": true, + "rate": "11596480000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "204000000000000000000000000", + "isEnabled": true, + "rate": "14165760000000000000000" + }, + "out": { + "capacity": "253000000000000000000000000", + "isEnabled": true, + "rate": "17568320000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "254500000000000000000000000", + "isEnabled": true, + "rate": "17672480000000000000000" + }, + "out": { + "capacity": "168000000000000000000000000", + "isEnabled": true, + "rate": "11665920000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + } + } + } + }, + "WETH": { + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "12366000000000000000", + "isEnabled": true, + "rate": "3435000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "18000000000000000000", + "isEnabled": true, + "rate": "5000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "36481500000000000000", + "isEnabled": true, + "rate": "10133748660000000" + }, + "out": { + "capacity": "28314000000000000000", + "isEnabled": true, + "rate": "7864998960000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "52635000000000000000", + "isEnabled": true, + "rate": "14620831400000000" + }, + "out": { + "capacity": "47825250000000000000", + "isEnabled": true, + "rate": "13284789910000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "31458960000000000000", + "isEnabled": true, + "rate": "8738599999999999" + }, + "out": { + "capacity": "60076500000000000000", + "isEnabled": true, + "rate": "16687916666666666" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "47280750000000000000", + "isEnabled": true, + "rate": "13133539930000000" + }, + "out": { + "capacity": "43923000000000000000", + "isEnabled": true, + "rate": "12200831720000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "37389000000000000000", + "isEnabled": true, + "rate": "10385831960000000" + }, + "out": { + "capacity": "30764250000000000000", + "isEnabled": true, + "rate": "8545623870000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "58481400000000000000", + "isEnabled": true, + "rate": "16244833333333333" + }, + "out": { + "capacity": "60984000000000000000", + "isEnabled": true, + "rate": "16939999999999999" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "13453200000000000000", + "isEnabled": true, + "rate": "3737000000000000" + }, + "out": { + "capacity": "9120000000000000000", + "isEnabled": true, + "rate": "2533333333333333" + } + }, + "standard": { + "in": { + "capacity": "33300000000000000000", + "isEnabled": true, + "rate": "9250000000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "8333333333333333" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "61528500000000000000", + "isEnabled": true, + "rate": "17091247740000000" + }, + "out": { + "capacity": "47825250000000000000", + "isEnabled": true, + "rate": "13284789910000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "57263250000000000000", + "isEnabled": true, + "rate": "15906456230000000" + }, + "out": { + "capacity": "36753750000000000000", + "isEnabled": true, + "rate": "10209373650000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "31458960000000000000", + "isEnabled": true, + "rate": "8738599999999999" + }, + "out": { + "capacity": "57807750000000000000", + "isEnabled": true, + "rate": "16057708333333333" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "36252000000000000000", + "isEnabled": true, + "rate": "10176000000000000" + }, + "out": { + "capacity": "38760000000000000000", + "isEnabled": true, + "rate": "10880000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "40634490000000000000", + "isEnabled": true, + "rate": "11287358333333333" + }, + "out": { + "capacity": "33033000000000000000", + "isEnabled": true, + "rate": "9175833333333333" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "35290500000000000000", + "isEnabled": true, + "rate": "9802916666666666" + }, + "out": { + "capacity": "40928250000000000000", + "isEnabled": true, + "rate": "11368958333333333" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "17582400000000000000", + "isEnabled": true, + "rate": "4884000000000000" + }, + "out": { + "capacity": "17940000000000000000", + "isEnabled": true, + "rate": "4983333333333333" + } + }, + "standard": { + "in": { + "capacity": "33300000000000000000", + "isEnabled": true, + "rate": "9250000000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "8333333333333333" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "59792190000000000000", + "isEnabled": true, + "rate": "16608941666666666" + }, + "out": { + "capacity": "39476250000000000000", + "isEnabled": true, + "rate": "10965624999999999" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WFRAGSOL": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WHLP": { + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WHSK": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-hashkey-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WHY": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WLD": { + "ethereum-mainnet-worldchain-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "36900000000000000000000", + "isEnabled": true, + "rate": "10249971300000000000" + }, + "out": { + "capacity": "67900000000000000000000", + "isEnabled": true, + "rate": "18861058300000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-worldchain-1": { + "custom": { + "in": { + "capacity": "50900000000000000000000", + "isEnabled": true, + "rate": "14138849300000000000" + }, + "out": { + "capacity": "67300000000000000000000", + "isEnabled": true, + "rate": "18694392100000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + } + } + } + } + } + }, + "WLFI": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WMTX": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "602000000000", + "isEnabled": true, + "rate": "167217540" + }, + "out": { + "capacity": "532000000000", + "isEnabled": true, + "rate": "147773640" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1865000000000", + "isEnabled": true, + "rate": "86349500" + }, + "out": { + "capacity": "3305000000000", + "isEnabled": true, + "rate": "153021500" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "561000000000", + "isEnabled": true, + "rate": "155828970" + }, + "out": { + "capacity": "560000000000", + "isEnabled": true, + "rate": "155551200" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "499000000000", + "isEnabled": true, + "rate": "138607230" + }, + "out": { + "capacity": "349000000000", + "isEnabled": true, + "rate": "96941730" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "617000000000", + "isEnabled": true, + "rate": "171384090" + }, + "out": { + "capacity": "382000000000", + "isEnabled": true, + "rate": "106108140" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3255000000000", + "isEnabled": true, + "rate": "150706500" + }, + "out": { + "capacity": "2795000000000", + "isEnabled": true, + "rate": "129408500" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "353000000000", + "isEnabled": true, + "rate": "98052810" + }, + "out": { + "capacity": "324000000000", + "isEnabled": true, + "rate": "89997480" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "494000000000", + "isEnabled": true, + "rate": "137218380" + }, + "out": { + "capacity": "529000000000", + "isEnabled": true, + "rate": "146940330" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "384000000000", + "isEnabled": true, + "rate": "106663680" + }, + "out": { + "capacity": "368000000000", + "isEnabled": true, + "rate": "102219360" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "351000000000", + "isEnabled": true, + "rate": "97497270" + }, + "out": { + "capacity": "497000000000", + "isEnabled": true, + "rate": "138051690" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "306000000000", + "isEnabled": true, + "rate": "84997620" + }, + "out": { + "capacity": "638000000000", + "isEnabled": true, + "rate": "177217260" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2600000000000", + "isEnabled": true, + "rate": "120380000" + }, + "out": { + "capacity": "2820000000000", + "isEnabled": true, + "rate": "130566000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2600000000000", + "isEnabled": true, + "rate": "120380000" + }, + "out": { + "capacity": "3420000000000", + "isEnabled": true, + "rate": "158346000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "606000000000", + "isEnabled": true, + "rate": "168328620" + }, + "out": { + "capacity": "536000000000", + "isEnabled": true, + "rate": "148884720" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "681000000000", + "isEnabled": true, + "rate": "189161370" + }, + "out": { + "capacity": "666000000000", + "isEnabled": true, + "rate": "184994820" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "533000000000", + "isEnabled": true, + "rate": "148051410" + }, + "out": { + "capacity": "626000000000", + "isEnabled": true, + "rate": "173884020" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "501000000000", + "isEnabled": true, + "rate": "139162770" + }, + "out": { + "capacity": "581000000000", + "isEnabled": true, + "rate": "161384370" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "567000000000", + "isEnabled": true, + "rate": "157495590" + }, + "out": { + "capacity": "484000000000", + "isEnabled": true, + "rate": "134440680" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "382000000000", + "isEnabled": true, + "rate": "106108140" + }, + "out": { + "capacity": "495000000000", + "isEnabled": true, + "rate": "137496150" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + } + }, + "wOETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "70566000000000000000", + "isEnabled": true, + "rate": "19808000000000000" + }, + "out": { + "capacity": "78774000000000000000", + "isEnabled": true, + "rate": "22112000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "924000000000000000000", + "isEnabled": true, + "rate": "256872000000000000" + }, + "out": { + "capacity": "825000000000000000000", + "isEnabled": true, + "rate": "229350000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + }, + "out": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "77178000000000000000", + "isEnabled": true, + "rate": "21664000000000000" + }, + "out": { + "capacity": "39102000000000000000", + "isEnabled": true, + "rate": "10976000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "400000000000000000000", + "isEnabled": true, + "rate": "111120000000000000" + }, + "out": { + "capacity": "682000000000000000000", + "isEnabled": true, + "rate": "189459600000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "493500000000000000000", + "isEnabled": true, + "rate": "137193000000000000" + }, + "out": { + "capacity": "484500000000000000000", + "isEnabled": true, + "rate": "134691000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + }, + "out": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "414000000000000000000", + "isEnabled": true, + "rate": "115009200000000000" + }, + "out": { + "capacity": "671000000000000000000", + "isEnabled": true, + "rate": "186403800000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + } + } + } + } + } + }, + "WOLF": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WOW": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WSDM": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "657000000000", + "isEnabled": true, + "rate": "7884000" + }, + "out": { + "capacity": "596000000000", + "isEnabled": true, + "rate": "7152000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "513000000000", + "isEnabled": true, + "rate": "6156000" + }, + "out": { + "capacity": "558000000000", + "isEnabled": true, + "rate": "6696000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "575000000000", + "isEnabled": true, + "rate": "6900000" + }, + "out": { + "capacity": "574000000000", + "isEnabled": true, + "rate": "6888000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "305000000000", + "isEnabled": true, + "rate": "3660000" + }, + "out": { + "capacity": "406000000000", + "isEnabled": true, + "rate": "4872000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "522000000000", + "isEnabled": true, + "rate": "6264000" + }, + "out": { + "capacity": "386000000000", + "isEnabled": true, + "rate": "4632000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "500000000000", + "isEnabled": true, + "rate": "6000000" + }, + "out": { + "capacity": "527000000000", + "isEnabled": true, + "rate": "6324000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "598000000000", + "isEnabled": true, + "rate": "7176000" + }, + "out": { + "capacity": "459000000000", + "isEnabled": true, + "rate": "5508000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "674000000000", + "isEnabled": true, + "rate": "8088000" + }, + "out": { + "capacity": "364000000000", + "isEnabled": true, + "rate": "4368000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "485000000000", + "isEnabled": true, + "rate": "5820000" + }, + "out": { + "capacity": "380000000000", + "isEnabled": true, + "rate": "4560000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "315000000000", + "isEnabled": true, + "rate": "3780000" + }, + "out": { + "capacity": "578000000000", + "isEnabled": true, + "rate": "6936000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "474000000000", + "isEnabled": true, + "rate": "5688000" + }, + "out": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "3600000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "394000000000", + "isEnabled": true, + "rate": "4728000" + }, + "out": { + "capacity": "362000000000", + "isEnabled": true, + "rate": "4344000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + } + }, + "wstETH": { + "0g-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "71706000000000000000", + "isEnabled": true, + "rate": "20128000000000000" + }, + "out": { + "capacity": "56202000000000000000", + "isEnabled": true, + "rate": "15776000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "12366000000000000000", + "isEnabled": true, + "rate": "3435000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "18000000000000000000", + "isEnabled": true, + "rate": "5000000000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1296000000000000000000", + "isEnabled": true, + "rate": "14999999994720000" + }, + "out": { + "capacity": "742000000000000000000", + "isEnabled": true, + "rate": "8587962959940000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1342000000000000000000", + "isEnabled": true, + "rate": "15532407401940000" + }, + "out": { + "capacity": "614000000000000000000", + "isEnabled": true, + "rate": "7106481478980000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "946000000000000000000", + "isEnabled": true, + "rate": "10949074070220000" + }, + "out": { + "capacity": "1282000000000000000000", + "isEnabled": true, + "rate": "14837962957740000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "0g-mainnet": { + "custom": null, + "standard": null + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "67944000000000000000", + "isEnabled": true, + "rate": "19072000000000000" + }, + "out": { + "capacity": "75354000000000000000", + "isEnabled": true, + "rate": "21152000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "950000000000000000000", + "isEnabled": true, + "rate": "10995370366500000" + }, + "out": { + "capacity": "730000000000000000000", + "isEnabled": true, + "rate": "8449074071100000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "678000000000000000000", + "isEnabled": true, + "rate": "7847222219460000" + }, + "out": { + "capacity": "806000000000000000000", + "isEnabled": true, + "rate": "9328703700420000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "658000000000000000000", + "isEnabled": true, + "rate": "7615740738060000" + }, + "out": { + "capacity": "1274000000000000000000", + "isEnabled": true, + "rate": "14745370365180000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1234000000000000000000", + "isEnabled": true, + "rate": "14282407402380000" + }, + "out": { + "capacity": "664000000000000000000", + "isEnabled": true, + "rate": "7685185182480000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1268000000000000000000", + "isEnabled": true, + "rate": "14675925920760000" + }, + "out": { + "capacity": "1256000000000000000000", + "isEnabled": true, + "rate": "14537037031920000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "892000000000000000000", + "isEnabled": true, + "rate": "10324074070440000" + }, + "out": { + "capacity": "1292000000000000000000", + "isEnabled": true, + "rate": "14953703698440000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-ink-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000" + }, + "out": { + "capacity": "1124000000000000000000", + "isEnabled": true, + "rate": "13009259254680000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1244000000000000000000", + "isEnabled": true, + "rate": "14398148143080000" + }, + "out": { + "capacity": "634000000000000000000", + "isEnabled": true, + "rate": "7337962960380000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + } + }, + "wstLINK": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "9795000000000000000000", + "isEnabled": true, + "rate": "2612000000000000000" + }, + "out": { + "capacity": "7230000000000000000000", + "isEnabled": true, + "rate": "1928000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "5805000000000000000000", + "isEnabled": true, + "rate": "1548000000000000000" + }, + "out": { + "capacity": "10245000000000000000000", + "isEnabled": true, + "rate": "2732000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "wstPOL": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "wUSDx": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "228830000000", + "isEnabled": true, + "rate": "63563837" + }, + "out": { + "capacity": "314580000000", + "isEnabled": true, + "rate": "87383262" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "185710000000", + "isEnabled": true, + "rate": "51586069" + }, + "out": { + "capacity": "327320000000", + "isEnabled": true, + "rate": "90922148" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "231280000000", + "isEnabled": true, + "rate": "64244392" + }, + "out": { + "capacity": "265580000000", + "isEnabled": true, + "rate": "73772162" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "237650000000", + "isEnabled": true, + "rate": "66013835" + }, + "out": { + "capacity": "249900000000", + "isEnabled": true, + "rate": "69416610" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "315070000000", + "isEnabled": true, + "rate": "87519373" + }, + "out": { + "capacity": "215110000000", + "isEnabled": true, + "rate": "59752729" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "294980000000", + "isEnabled": true, + "rate": "81938822" + }, + "out": { + "capacity": "187180000000", + "isEnabled": true, + "rate": "51994402" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "299390000000", + "isEnabled": true, + "rate": "83163821" + }, + "out": { + "capacity": "193060000000", + "isEnabled": true, + "rate": "53627734" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "289590000000", + "isEnabled": true, + "rate": "80441601" + }, + "out": { + "capacity": "331730000000", + "isEnabled": true, + "rate": "92147147" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "189630000000", + "isEnabled": true, + "rate": "52674957" + }, + "out": { + "capacity": "155330000000", + "isEnabled": true, + "rate": "43147187" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "248430000000", + "isEnabled": true, + "rate": "69008277" + }, + "out": { + "capacity": "154350000000", + "isEnabled": true, + "rate": "42874965" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "325360000000", + "isEnabled": true, + "rate": "90377704" + }, + "out": { + "capacity": "316540000000", + "isEnabled": true, + "rate": "87927706" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "165620000000", + "isEnabled": true, + "rate": "46005518" + }, + "out": { + "capacity": "161700000000", + "isEnabled": true, + "rate": "44916630" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "297920000000", + "isEnabled": true, + "rate": "82755488" + }, + "out": { + "capacity": "212660000000", + "isEnabled": true, + "rate": "59072174" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "261660000000", + "isEnabled": true, + "rate": "72683274" + }, + "out": { + "capacity": "246470000000", + "isEnabled": true, + "rate": "68463833" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "271460000000", + "isEnabled": true, + "rate": "75405494" + }, + "out": { + "capacity": "184240000000", + "isEnabled": true, + "rate": "51177736" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "267540000000", + "isEnabled": true, + "rate": "74316606" + }, + "out": { + "capacity": "317520000000", + "isEnabled": true, + "rate": "88199928" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "308210000000", + "isEnabled": true, + "rate": "85613819" + }, + "out": { + "capacity": "213150000000", + "isEnabled": true, + "rate": "59208285" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "171500000000", + "isEnabled": true, + "rate": "47638850" + }, + "out": { + "capacity": "318500000000", + "isEnabled": true, + "rate": "88472150" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "202860000000", + "isEnabled": true, + "rate": "56349954" + }, + "out": { + "capacity": "197960000000", + "isEnabled": true, + "rate": "54988844" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "179340000000", + "isEnabled": true, + "rate": "49816626" + }, + "out": { + "capacity": "266560000000", + "isEnabled": true, + "rate": "74044384" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "182280000000", + "isEnabled": true, + "rate": "50633292" + }, + "out": { + "capacity": "218540000000", + "isEnabled": true, + "rate": "60705506" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "247450000000", + "isEnabled": true, + "rate": "68736055" + }, + "out": { + "capacity": "173950000000", + "isEnabled": true, + "rate": "48319405" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "247940000000", + "isEnabled": true, + "rate": "68872166" + }, + "out": { + "capacity": "163660000000", + "isEnabled": true, + "rate": "45461074" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "294980000000", + "isEnabled": true, + "rate": "81938822" + }, + "out": { + "capacity": "173950000000", + "isEnabled": true, + "rate": "48319405" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "282240000000", + "isEnabled": true, + "rate": "78399936" + }, + "out": { + "capacity": "239610000000", + "isEnabled": true, + "rate": "66558279" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "188160000000", + "isEnabled": true, + "rate": "52266624" + }, + "out": { + "capacity": "267540000000", + "isEnabled": true, + "rate": "74316606" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "235690000000", + "isEnabled": true, + "rate": "65469391" + }, + "out": { + "capacity": "174440000000", + "isEnabled": true, + "rate": "48455516" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "250880000000", + "isEnabled": true, + "rate": "69688832" + }, + "out": { + "capacity": "303310000000", + "isEnabled": true, + "rate": "84252709" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "269500000000", + "isEnabled": true, + "rate": "74861050" + }, + "out": { + "capacity": "281260000000", + "isEnabled": true, + "rate": "78127714" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "177870000000", + "isEnabled": true, + "rate": "49408293" + }, + "out": { + "capacity": "202860000000", + "isEnabled": true, + "rate": "56349954" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "181790000000", + "isEnabled": true, + "rate": "50497181" + }, + "out": { + "capacity": "338100000000", + "isEnabled": true, + "rate": "93916590" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "260680000000", + "isEnabled": true, + "rate": "72411052" + }, + "out": { + "capacity": "148960000000", + "isEnabled": true, + "rate": "41377744" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "254800000000", + "isEnabled": true, + "rate": "70777720" + }, + "out": { + "capacity": "186690000000", + "isEnabled": true, + "rate": "51858291" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "226870000000", + "isEnabled": true, + "rate": "63019393" + }, + "out": { + "capacity": "295960000000", + "isEnabled": true, + "rate": "82211044" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "269010000000", + "isEnabled": true, + "rate": "74724939" + }, + "out": { + "capacity": "158760000000", + "isEnabled": true, + "rate": "44099964" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "325360000000", + "isEnabled": true, + "rate": "90377704" + }, + "out": { + "capacity": "295470000000", + "isEnabled": true, + "rate": "82074933" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "214130000000", + "isEnabled": true, + "rate": "59480507" + }, + "out": { + "capacity": "261660000000", + "isEnabled": true, + "rate": "72683274" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "248920000000", + "isEnabled": true, + "rate": "69144388" + }, + "out": { + "capacity": "184240000000", + "isEnabled": true, + "rate": "51177736" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "158760000000", + "isEnabled": true, + "rate": "44099964" + }, + "out": { + "capacity": "249900000000", + "isEnabled": true, + "rate": "69416610" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "303800000000", + "isEnabled": true, + "rate": "84388820" + }, + "out": { + "capacity": "246470000000", + "isEnabled": true, + "rate": "68463833" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "213640000000", + "isEnabled": true, + "rate": "59344396" + }, + "out": { + "capacity": "250390000000", + "isEnabled": true, + "rate": "69552721" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + } + }, + "xGold": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hedera-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hedera-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "XLAB": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xrETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xRPL": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xSILO": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xSolvBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "950000000000000000", + "isEnabled": true, + "rate": "43981200000000" + }, + "out": { + "capacity": "1235000000000000000", + "isEnabled": true, + "rate": "57175560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1335000000000000000", + "isEnabled": true, + "rate": "61805160000000" + }, + "out": { + "capacity": "1057500000000000000", + "isEnabled": true, + "rate": "48958020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1537500000000000000", + "isEnabled": true, + "rate": "71180100000000" + }, + "out": { + "capacity": "1240000000000000000", + "isEnabled": true, + "rate": "57407040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1167500000000000000", + "isEnabled": true, + "rate": "54050580000000" + }, + "out": { + "capacity": "1492500000000000000", + "isEnabled": true, + "rate": "69096780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1460000000000000000", + "isEnabled": true, + "rate": "67592160000000" + }, + "out": { + "capacity": "1727500000000000000", + "isEnabled": true, + "rate": "79976340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1317500000000000000", + "isEnabled": true, + "rate": "60994980000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1457500000000000000", + "isEnabled": true, + "rate": "67476420000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1130000000000000000", + "isEnabled": true, + "rate": "52314480000000" + }, + "out": { + "capacity": "800000000000000000", + "isEnabled": true, + "rate": "37036800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "857500000000000000", + "isEnabled": true, + "rate": "39698820000000" + }, + "out": { + "capacity": "1092500000000000000", + "isEnabled": true, + "rate": "50578380000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1650000000000000000", + "isEnabled": true, + "rate": "76388400000000" + }, + "out": { + "capacity": "1027500000000000000", + "isEnabled": true, + "rate": "47569140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + }, + "out": { + "capacity": "1267500000000000000", + "isEnabled": true, + "rate": "58680180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1297500000000000000", + "isEnabled": true, + "rate": "60069060000000" + }, + "out": { + "capacity": "960000000000000000", + "isEnabled": true, + "rate": "44444160000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "887500000000000000", + "isEnabled": true, + "rate": "41087700000000" + }, + "out": { + "capacity": "1027500000000000000", + "isEnabled": true, + "rate": "47569140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "922500000000000000", + "isEnabled": true, + "rate": "42708060000000" + }, + "out": { + "capacity": "1150000000000000000", + "isEnabled": true, + "rate": "53240400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + }, + "out": { + "capacity": "1552500000000000000", + "isEnabled": true, + "rate": "71874540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "792500000000000000", + "isEnabled": true, + "rate": "36689580000000" + }, + "out": { + "capacity": "1035000000000000000", + "isEnabled": true, + "rate": "47916360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1472500000000000000", + "isEnabled": true, + "rate": "68170860000000" + }, + "out": { + "capacity": "1395000000000000000", + "isEnabled": true, + "rate": "64582920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1672500000000000000", + "isEnabled": true, + "rate": "77430060000000" + }, + "out": { + "capacity": "857500000000000000", + "isEnabled": true, + "rate": "39698820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1035000000000000000", + "isEnabled": true, + "rate": "47916360000000" + }, + "out": { + "capacity": "1187500000000000000", + "isEnabled": true, + "rate": "54976500000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "920000000000000000", + "isEnabled": true, + "rate": "42592320000000" + }, + "out": { + "capacity": "1522500000000000000", + "isEnabled": true, + "rate": "70485660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1102500000000000000", + "isEnabled": true, + "rate": "51041340000000" + }, + "out": { + "capacity": "1515000000000000000", + "isEnabled": true, + "rate": "70138440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1072500000000000000", + "isEnabled": true, + "rate": "49652460000000" + }, + "out": { + "capacity": "917500000000000000", + "isEnabled": true, + "rate": "42476580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1007500000000000000", + "isEnabled": true, + "rate": "46643220000000" + }, + "out": { + "capacity": "937500000000000000", + "isEnabled": true, + "rate": "43402500000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "910000000000000000", + "isEnabled": true, + "rate": "42129360000000" + }, + "out": { + "capacity": "1447500000000000000", + "isEnabled": true, + "rate": "67013460000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": null, + "standard": null + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "790000000000000000", + "isEnabled": true, + "rate": "36573840000000" + }, + "out": { + "capacity": "880000000000000000", + "isEnabled": true, + "rate": "40740480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "872500000000000000", + "isEnabled": true, + "rate": "40393260000000" + }, + "out": { + "capacity": "1317500000000000000", + "isEnabled": true, + "rate": "60994980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1005000000000000000", + "isEnabled": true, + "rate": "46527480000000" + }, + "out": { + "capacity": "1310000000000000000", + "isEnabled": true, + "rate": "60647760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "865000000000000000", + "isEnabled": true, + "rate": "40046040000000" + }, + "out": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1087500000000000000", + "isEnabled": true, + "rate": "50346900000000" + }, + "out": { + "capacity": "1432500000000000000", + "isEnabled": true, + "rate": "66319020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1220000000000000000", + "isEnabled": true, + "rate": "56481120000000" + }, + "out": { + "capacity": "1592500000000000000", + "isEnabled": true, + "rate": "73726380000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1337500000000000000", + "isEnabled": true, + "rate": "61920900000000" + }, + "out": { + "capacity": "1622500000000000000", + "isEnabled": true, + "rate": "75115260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "770000000000000000", + "isEnabled": true, + "rate": "35647920000000" + }, + "out": { + "capacity": "750000000000000000", + "isEnabled": true, + "rate": "34722000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1147500000000000000", + "isEnabled": true, + "rate": "53124660000000" + }, + "out": { + "capacity": "1625000000000000000", + "isEnabled": true, + "rate": "75231000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "109250000", + "isEnabled": true, + "rate": "5057" + }, + "out": { + "capacity": "1305000000000000000", + "isEnabled": true, + "rate": "60416280000000" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1307500000000000000", + "isEnabled": true, + "rate": "60532020000000" + }, + "out": { + "capacity": "792500000000000000", + "isEnabled": true, + "rate": "36689580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1365000000000000000", + "isEnabled": true, + "rate": "63194040000000" + }, + "out": { + "capacity": "1002500000000000000", + "isEnabled": true, + "rate": "46411740000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "795000000000000000", + "isEnabled": true, + "rate": "36805320000000" + }, + "out": { + "capacity": "1267500000000000000", + "isEnabled": true, + "rate": "58680180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1487500000000000000", + "isEnabled": true, + "rate": "68865300000000" + }, + "out": { + "capacity": "1200000000000000000", + "isEnabled": true, + "rate": "55555200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1150000000000000000", + "isEnabled": true, + "rate": "53240400000000" + }, + "out": { + "capacity": "1192500000000000000", + "isEnabled": true, + "rate": "55207980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1677500000000000000", + "isEnabled": true, + "rate": "77661540000000" + }, + "out": { + "capacity": "1550000000000000000", + "isEnabled": true, + "rate": "71758800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "752500000000000000", + "isEnabled": true, + "rate": "34837740000000" + }, + "out": { + "capacity": "850000000000000000", + "isEnabled": true, + "rate": "39351600000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "772500000000000000", + "isEnabled": true, + "rate": "35763660000000" + }, + "out": { + "capacity": "1375000000000000000", + "isEnabled": true, + "rate": "63657000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1050000000000000000", + "isEnabled": true, + "rate": "48610800000000" + }, + "out": { + "capacity": "1452500000000000000", + "isEnabled": true, + "rate": "67244940000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1010000000000000000", + "isEnabled": true, + "rate": "46758960000000" + }, + "out": { + "capacity": "800000000000000000", + "isEnabled": true, + "rate": "37036800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1725000000000000000", + "isEnabled": true, + "rate": "79860600000000" + }, + "out": { + "capacity": "1552500000000000000", + "isEnabled": true, + "rate": "71874540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1297500000000000000", + "isEnabled": true, + "rate": "60069060000000" + }, + "out": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "982500000000000000", + "isEnabled": true, + "rate": "45485820000000" + }, + "out": { + "capacity": "1667500000000000000", + "isEnabled": true, + "rate": "77198580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + }, + "out": { + "capacity": "1352500000000000000", + "isEnabled": true, + "rate": "62615340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1600000000000000000", + "isEnabled": true, + "rate": "74073600000000" + }, + "out": { + "capacity": "1220000000000000000", + "isEnabled": true, + "rate": "56481120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1080000000000000000", + "isEnabled": true, + "rate": "49999680000000" + }, + "out": { + "capacity": "1417500000000000000", + "isEnabled": true, + "rate": "65624580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1620000000000000000", + "isEnabled": true, + "rate": "74999520000000" + }, + "out": { + "capacity": "1215000000000000000", + "isEnabled": true, + "rate": "56249640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1397500000000000000", + "isEnabled": true, + "rate": "64698660000000" + }, + "out": { + "capacity": "1175000000000000000", + "isEnabled": true, + "rate": "54397800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1145000000000000000", + "isEnabled": true, + "rate": "53008920000000" + }, + "out": { + "capacity": "860000000000000000", + "isEnabled": true, + "rate": "39814560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1350000000000000000", + "isEnabled": true, + "rate": "62499600000000" + }, + "out": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1527500000000000000", + "isEnabled": true, + "rate": "70717140000000" + }, + "out": { + "capacity": "775000000000000000", + "isEnabled": true, + "rate": "35879400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1440000000000000000", + "isEnabled": true, + "rate": "66666240000000" + }, + "out": { + "capacity": "1505000000000000000", + "isEnabled": true, + "rate": "69675480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1117500000000000000", + "isEnabled": true, + "rate": "51735780000000" + }, + "out": { + "capacity": "1362500000000000000", + "isEnabled": true, + "rate": "63078300000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1337500000000000000", + "isEnabled": true, + "rate": "61920900000000" + }, + "out": { + "capacity": "1127500000000000000", + "isEnabled": true, + "rate": "52198740000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1607500000000000000", + "isEnabled": true, + "rate": "74420820000000" + }, + "out": { + "capacity": "1747500000000000000", + "isEnabled": true, + "rate": "80902260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1685000000000000000", + "isEnabled": true, + "rate": "78008760000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1625000000000000000", + "isEnabled": true, + "rate": "75231000000000" + }, + "out": { + "capacity": "765000000000000000", + "isEnabled": true, + "rate": "35416440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "837500000000000000", + "isEnabled": true, + "rate": "38772900000000" + }, + "out": { + "capacity": "1442500000000000000", + "isEnabled": true, + "rate": "66781980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1335000000000000000", + "isEnabled": true, + "rate": "61805160000000" + }, + "out": { + "capacity": "767500000000000000", + "isEnabled": true, + "rate": "35532180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1262500000000000000", + "isEnabled": true, + "rate": "58448700000000" + }, + "out": { + "capacity": "915000000000000000", + "isEnabled": true, + "rate": "42360840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1127500000000000000", + "isEnabled": true, + "rate": "52198740000000" + }, + "out": { + "capacity": "1712500000000000000", + "isEnabled": true, + "rate": "79281900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1747500000000000000", + "isEnabled": true, + "rate": "80902260000000" + }, + "out": { + "capacity": "1512500000000000000", + "isEnabled": true, + "rate": "70022700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-taiko-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1387500000000000000", + "isEnabled": true, + "rate": "64235700000000" + }, + "out": { + "capacity": "1557500000000000000", + "isEnabled": true, + "rate": "72106020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 3, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + }, + "out": { + "capacity": "1472500000000000000", + "isEnabled": true, + "rate": "68170860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "752500000000000000", + "isEnabled": true, + "rate": "34837740000000" + }, + "out": { + "capacity": "775000000000000000", + "isEnabled": true, + "rate": "35879400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "63600000000000000000", + "isEnabled": true, + "rate": "736064000000000" + }, + "out": { + "capacity": "1580000000000000000", + "isEnabled": true, + "rate": "73147680000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736000000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1327500000000000000", + "isEnabled": true, + "rate": "61457940000000" + }, + "out": { + "capacity": "1260000000000000000", + "isEnabled": true, + "rate": "58332960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1080000000000000000", + "isEnabled": true, + "rate": "49999680000000" + }, + "out": { + "capacity": "1510000000000000000", + "isEnabled": true, + "rate": "69906960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1032500000000000000", + "isEnabled": true, + "rate": "47800620000000" + }, + "out": { + "capacity": "865000000000000000", + "isEnabled": true, + "rate": "40046040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1690000000000000000", + "isEnabled": true, + "rate": "78240240000000" + }, + "out": { + "capacity": "1535000000000000000", + "isEnabled": true, + "rate": "71064360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1147500000000000000", + "isEnabled": true, + "rate": "53124660000000" + }, + "out": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1620000000000000000", + "isEnabled": true, + "rate": "74999520000000" + }, + "out": { + "capacity": "1117500000000000000", + "isEnabled": true, + "rate": "51735780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1107500000000000000", + "isEnabled": true, + "rate": "51272820000000" + }, + "out": { + "capacity": "1365000000000000000", + "isEnabled": true, + "rate": "63194040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + }, + "out": { + "capacity": "1522500000000000000", + "isEnabled": true, + "rate": "70485660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1672500000000000000", + "isEnabled": true, + "rate": "77430060000000" + }, + "out": { + "capacity": "1412500000000000000", + "isEnabled": true, + "rate": "65393100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1617500000000000000", + "isEnabled": true, + "rate": "74883780000000" + }, + "out": { + "capacity": "812500000000000000", + "isEnabled": true, + "rate": "37615500000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-taiko-1": { + "custom": { + "in": { + "capacity": "1472500000000000000", + "isEnabled": true, + "rate": "68170860000000" + }, + "out": { + "capacity": "1290000000000000000", + "isEnabled": true, + "rate": "59721840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1465000000000000000", + "isEnabled": true, + "rate": "67823640000000" + }, + "out": { + "capacity": "92700000000000000000", + "isEnabled": true, + "rate": "1072848000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736000000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1050000000000000000", + "isEnabled": true, + "rate": "48610800000000" + }, + "out": { + "capacity": "1465000000000000000", + "isEnabled": true, + "rate": "67823640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1332500000000000000", + "isEnabled": true, + "rate": "61689420000000" + }, + "out": { + "capacity": "1422500000000000000", + "isEnabled": true, + "rate": "65856060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "monad-mainnet": { + "custom": null, + "standard": null + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1675000000000000000", + "isEnabled": true, + "rate": "77545800000000" + }, + "out": { + "capacity": "1730000000000000000", + "isEnabled": true, + "rate": "80092080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "138750000", + "isEnabled": true, + "rate": "6423" + }, + "out": { + "capacity": "980000000000000000", + "isEnabled": true, + "rate": "45370080000000" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "922500000000000000", + "isEnabled": true, + "rate": "42708060000000" + }, + "out": { + "capacity": "26220000000000000000", + "isEnabled": true, + "rate": "303470280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + } + } + }, + "sonic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "957500000000000000", + "isEnabled": true, + "rate": "44328420000000" + }, + "out": { + "capacity": "1535000000000000000", + "isEnabled": true, + "rate": "71064360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1417500000000000000", + "isEnabled": true, + "rate": "65624580000000" + }, + "out": { + "capacity": "862500000000000000", + "isEnabled": true, + "rate": "39930300000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1370000000000000000", + "isEnabled": true, + "rate": "63425520000000" + }, + "out": { + "capacity": "1042500000000000000", + "isEnabled": true, + "rate": "48263580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "862500000000000000", + "isEnabled": true, + "rate": "39930300000000" + }, + "out": { + "capacity": "1192500000000000000", + "isEnabled": true, + "rate": "55207980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1162500000000000000", + "isEnabled": true, + "rate": "53819100000000" + }, + "out": { + "capacity": "1170000000000000000", + "isEnabled": true, + "rate": "54166320000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1560000000000000000", + "isEnabled": true, + "rate": "72221760000000" + }, + "out": { + "capacity": "1220000000000000000", + "isEnabled": true, + "rate": "56481120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1295000000000000000", + "isEnabled": true, + "rate": "59953320000000" + }, + "out": { + "capacity": "1357500000000000000", + "isEnabled": true, + "rate": "62846820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1120000000000000000", + "isEnabled": true, + "rate": "51851520000000" + }, + "out": { + "capacity": "1160000000000000000", + "isEnabled": true, + "rate": "53703360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1127500000000000000", + "isEnabled": true, + "rate": "52198740000000" + }, + "out": { + "capacity": "772500000000000000", + "isEnabled": true, + "rate": "35763660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1217500000000000000", + "isEnabled": true, + "rate": "56365380000000" + }, + "out": { + "capacity": "807500000000000000", + "isEnabled": true, + "rate": "37384020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "10110000000000000000", + "isEnabled": true, + "rate": "117013140000000" + }, + "out": { + "capacity": "1610000000000000000", + "isEnabled": true, + "rate": "18634140000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + }, + "out": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + } + } + } + } + }, + "sei-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1555000000000000000", + "isEnabled": true, + "rate": "71990280000000" + }, + "out": { + "capacity": "1660000000000000000", + "isEnabled": true, + "rate": "76851360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1312500000000000000", + "isEnabled": true, + "rate": "60763500000000" + }, + "out": { + "capacity": "1197500000000000000", + "isEnabled": true, + "rate": "55439460000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1567500000000000000", + "isEnabled": true, + "rate": "72568980000000" + }, + "out": { + "capacity": "1120000000000000000", + "isEnabled": true, + "rate": "51851520000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1722500000000000000", + "isEnabled": true, + "rate": "79744860000000" + }, + "out": { + "capacity": "985000000000000000", + "isEnabled": true, + "rate": "45601560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1597500000000000000", + "isEnabled": true, + "rate": "73957860000000" + }, + "out": { + "capacity": "1420000000000000000", + "isEnabled": true, + "rate": "65740320000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "153250000", + "isEnabled": true, + "rate": "7094" + }, + "out": { + "capacity": "155750000", + "isEnabled": true, + "rate": "7210" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "152500000", + "isEnabled": true, + "rate": "7060" + }, + "out": { + "capacity": "169000000", + "isEnabled": true, + "rate": "7824" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "890000000000000000", + "isEnabled": true, + "rate": "41203440000000" + }, + "out": { + "capacity": "1617500000000000000", + "isEnabled": true, + "rate": "74883780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "942500000000000000", + "isEnabled": true, + "rate": "43633980000000" + }, + "out": { + "capacity": "1677500000000000000", + "isEnabled": true, + "rate": "77661540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "22980000000000000000", + "isEnabled": true, + "rate": "265970520000000" + }, + "out": { + "capacity": "1057500000000000000", + "isEnabled": true, + "rate": "48958020000000" + } + }, + "standard": { + "in": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1702500000000000000", + "isEnabled": true, + "rate": "78818940000000" + }, + "out": { + "capacity": "1387500000000000000", + "isEnabled": true, + "rate": "64235700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1150000000000000000", + "isEnabled": true, + "rate": "53240400000000" + }, + "out": { + "capacity": "1580000000000000000", + "isEnabled": true, + "rate": "73147680000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + } + }, + "XSWAP": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "12120000000000000000000000", + "isEnabled": true, + "rate": "280578000000000000000" + }, + "out": { + "capacity": "8600000000000000000000000", + "isEnabled": true, + "rate": "199090000000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "13420000000000000000000000", + "isEnabled": true, + "rate": "310673000000000000000" + }, + "out": { + "capacity": "9240000000000000000000000", + "isEnabled": true, + "rate": "213906000000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + } + } + } + } + } + }, + "XTFBRICK1": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "memento-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "XTFCLOBOND": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "memento-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "YBTC.B": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plume-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plume-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "YGG": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1208000000000000000000000", + "isEnabled": true, + "rate": "13981452400000000000" + }, + "out": { + "capacity": "1116000000000000000000000", + "isEnabled": true, + "rate": "12916646000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148100000000000000" + }, + "out": { + "capacity": "1800000000000000000000000", + "isEnabled": true, + "rate": "20833300000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1194000000000000000000000", + "isEnabled": true, + "rate": "13819415700000000000" + }, + "out": { + "capacity": "833400000000000000000000", + "isEnabled": true, + "rate": "9645817900000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148100000000000000" + }, + "out": { + "capacity": "1800000000000000000000000", + "isEnabled": true, + "rate": "20833300000000000000" + } + } + } + } + } + }, + "YNE": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "zBTC": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "484000000", + "isEnabled": true, + "rate": "5601" + }, + "out": { + "capacity": "316000000", + "isEnabled": true, + "rate": "3657" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "480000000", + "isEnabled": true, + "rate": "5555" + }, + "out": { + "capacity": "353000000", + "isEnabled": true, + "rate": "4085" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "328000000", + "isEnabled": true, + "rate": "3796" + }, + "out": { + "capacity": "639000000", + "isEnabled": true, + "rate": "7395" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "479000000", + "isEnabled": true, + "rate": "5543" + }, + "out": { + "capacity": "691000000", + "isEnabled": true, + "rate": "7997" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "429000000", + "isEnabled": true, + "rate": "4965" + }, + "out": { + "capacity": "419000000", + "isEnabled": true, + "rate": "4849" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "676000000", + "isEnabled": true, + "rate": "7824" + }, + "out": { + "capacity": "495000000", + "isEnabled": true, + "rate": "5729" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "520000000", + "isEnabled": true, + "rate": "6018" + }, + "out": { + "capacity": "409000000", + "isEnabled": true, + "rate": "4733" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "495000000", + "isEnabled": true, + "rate": "5729" + }, + "out": { + "capacity": "616000000", + "isEnabled": true, + "rate": "7129" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "325000000", + "isEnabled": true, + "rate": "3761" + }, + "out": { + "capacity": "620000000", + "isEnabled": true, + "rate": "7175" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "656000000", + "isEnabled": true, + "rate": "7592" + }, + "out": { + "capacity": "621000000", + "isEnabled": true, + "rate": "7187" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "449000000", + "isEnabled": true, + "rate": "5196" + }, + "out": { + "capacity": "574000000", + "isEnabled": true, + "rate": "6643" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + } + }, + "ZENT": { + "mainnet": { + "minBlockConfirmation": null, + "remote": { + "ronin-mainnet": { + "custom": null, + "standard": null + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ZeUSD": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ZUN": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1138000000000000000000000", + "isEnabled": true, + "rate": "13166660000000000000" + }, + "out": { + "capacity": "1018000000000000000000000", + "isEnabled": true, + "rate": "11778260000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "686000000000000000000000", + "isEnabled": true, + "rate": "7937020000000000000" + }, + "out": { + "capacity": "792000000000000000000000", + "isEnabled": true, + "rate": "9163440000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "648000000000000000000000", + "isEnabled": true, + "rate": "7497360000000000000" + }, + "out": { + "capacity": "1292000000000000000000000", + "isEnabled": true, + "rate": "14948440000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "988000000000000000000000", + "isEnabled": true, + "rate": "11431160000000000000" + }, + "out": { + "capacity": "1100000000000000000000000", + "isEnabled": true, + "rate": "12727000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1106000000000000000000000", + "isEnabled": true, + "rate": "12796420000000000000" + }, + "out": { + "capacity": "934000000000000000000000", + "isEnabled": true, + "rate": "10806380000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1384000000000000000000000", + "isEnabled": true, + "rate": "16012880000000000000" + }, + "out": { + "capacity": "1010000000000000000000000", + "isEnabled": true, + "rate": "11685700000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1072000000000000000000000", + "isEnabled": true, + "rate": "12403040000000000000" + }, + "out": { + "capacity": "698000000000000000000000", + "isEnabled": true, + "rate": "8075860000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "996000000000000000000000", + "isEnabled": true, + "rate": "11523720000000000000" + }, + "out": { + "capacity": "626000000000000000000000", + "isEnabled": true, + "rate": "7242820000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "966000000000000000000000", + "isEnabled": true, + "rate": "11176620000000000000" + }, + "out": { + "capacity": "1170000000000000000000000", + "isEnabled": true, + "rate": "13536900000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1078000000000000000000000", + "isEnabled": true, + "rate": "12472460000000000000" + }, + "out": { + "capacity": "970000000000000000000000", + "isEnabled": true, + "rate": "11222900000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "682000000000000000000000", + "isEnabled": true, + "rate": "7890740000000000000" + }, + "out": { + "capacity": "618000000000000000000000", + "isEnabled": true, + "rate": "7150260000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + } + }, + "zunETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "39096000000000000000", + "isEnabled": true, + "rate": "904638000000000" + }, + "out": { + "capacity": "25128000000000000000", + "isEnabled": true, + "rate": "581434000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "37080000000000000000", + "isEnabled": true, + "rate": "857990000000000" + }, + "out": { + "capacity": "22032000000000000000", + "isEnabled": true, + "rate": "509796000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "39456000000000000000", + "isEnabled": true, + "rate": "912968000000000" + }, + "out": { + "capacity": "48456000000000000000", + "isEnabled": true, + "rate": "1121218000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "49248000000000000000", + "isEnabled": true, + "rate": "1139544000000000" + }, + "out": { + "capacity": "45360000000000000000", + "isEnabled": true, + "rate": "1049580000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "25344000000000000000", + "isEnabled": true, + "rate": "586432000000000" + }, + "out": { + "capacity": "45504000000000000000", + "isEnabled": true, + "rate": "1052912000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "32256000000000000000", + "isEnabled": true, + "rate": "746368000000000" + }, + "out": { + "capacity": "36072000000000000000", + "isEnabled": true, + "rate": "834666000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "33696000000000000000", + "isEnabled": true, + "rate": "779688000000000" + }, + "out": { + "capacity": "41184000000000000000", + "isEnabled": true, + "rate": "952952000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "40752000000000000000", + "isEnabled": true, + "rate": "942956000000000" + }, + "out": { + "capacity": "39888000000000000000", + "isEnabled": true, + "rate": "922964000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "23472000000000000000", + "isEnabled": true, + "rate": "543116000000000" + }, + "out": { + "capacity": "38160000000000000000", + "isEnabled": true, + "rate": "882980000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "37008000000000000000", + "isEnabled": true, + "rate": "856324000000000" + }, + "out": { + "capacity": "36576000000000000000", + "isEnabled": true, + "rate": "846328000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "45072000000000000000", + "isEnabled": true, + "rate": "1042916000000000" + }, + "out": { + "capacity": "46152000000000000000", + "isEnabled": true, + "rate": "1067906000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "35712000000000000000", + "isEnabled": true, + "rate": "826336000000000" + }, + "out": { + "capacity": "33480000000000000000", + "isEnabled": true, + "rate": "774690000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + } + }, + "zunUSD": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "125000000000000000000000", + "isEnabled": true, + "rate": "2893500000000000000" + }, + "out": { + "capacity": "129250000000000000000000", + "isEnabled": true, + "rate": "2991879000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "155750000000000000000000", + "isEnabled": true, + "rate": "3605301000000000000" + }, + "out": { + "capacity": "91250000000000000000000", + "isEnabled": true, + "rate": "2112255000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "113750000000000000000000", + "isEnabled": true, + "rate": "2633085000000000000" + }, + "out": { + "capacity": "147250000000000000000000", + "isEnabled": true, + "rate": "3408543000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "77500000000000000000000", + "isEnabled": true, + "rate": "1793970000000000000" + }, + "out": { + "capacity": "89000000000000000000000", + "isEnabled": true, + "rate": "2060172000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "171250000000000000000000", + "isEnabled": true, + "rate": "3964095000000000000" + }, + "out": { + "capacity": "117250000000000000000000", + "isEnabled": true, + "rate": "2714103000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "109250000000000000000000", + "isEnabled": true, + "rate": "2528919000000000000" + }, + "out": { + "capacity": "138000000000000000000000", + "isEnabled": true, + "rate": "3194424000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "123750000000000000000000", + "isEnabled": true, + "rate": "2864565000000000000" + }, + "out": { + "capacity": "116250000000000000000000", + "isEnabled": true, + "rate": "2690955000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "158000000000000000000000", + "isEnabled": true, + "rate": "3657384000000000000" + }, + "out": { + "capacity": "97250000000000000000000", + "isEnabled": true, + "rate": "2251143000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "86000000000000000000000", + "isEnabled": true, + "rate": "1990728000000000000" + }, + "out": { + "capacity": "126000000000000000000000", + "isEnabled": true, + "rate": "2916648000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "92500000000000000000000", + "isEnabled": true, + "rate": "2141190000000000000" + }, + "out": { + "capacity": "131750000000000000000000", + "isEnabled": true, + "rate": "3049749000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "172250000000000000000000", + "isEnabled": true, + "rate": "3987243000000000000" + }, + "out": { + "capacity": "86500000000000000000000", + "isEnabled": true, + "rate": "2002302000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "101250000000000000000000", + "isEnabled": true, + "rate": "2343735000000000000" + }, + "out": { + "capacity": "124250000000000000000000", + "isEnabled": true, + "rate": "2876139000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + } + } +} diff --git a/src/__mocks__/rate-limits-testnet.json b/src/__mocks__/rate-limits-testnet.json new file mode 100644 index 00000000000..0dfaf068b79 --- /dev/null +++ b/src/__mocks__/rate-limits-testnet.json @@ -0,0 +1,7465 @@ +{ + "CCIP-BnM": { + "abstract-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45500000000000000000000", + "isEnabled": true, + "rate": "75985000000000000000" + }, + "out": { + "capacity": "60300000000000000000000", + "isEnabled": true, + "rate": "100701000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "apechain-testnet-curtis": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "53700000000000000000000", + "isEnabled": true, + "rate": "89679000000000000000" + }, + "out": { + "capacity": "45300000000000000000000", + "isEnabled": true, + "rate": "75651000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "aptos-testnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-testnet-blaze": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "avalanche-fuji-testnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "44900000000000000000000", + "isEnabled": true, + "rate": "74983000000000000000" + }, + "out": { + "capacity": "48500000000000000000000", + "isEnabled": true, + "rate": "80995000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45500000000000000000000", + "isEnabled": true, + "rate": "75985000000000000000" + }, + "out": { + "capacity": "47900000000000000000000", + "isEnabled": true, + "rate": "79993000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "33700000000000000000000", + "isEnabled": true, + "rate": "56279000000000000000" + }, + "out": { + "capacity": "56300000000000000000000", + "isEnabled": true, + "rate": "94021000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "66400000000000000000000", + "isEnabled": true, + "rate": "110888000000000000000" + }, + "out": { + "capacity": "42900000000000000000000", + "isEnabled": true, + "rate": "71643000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "60700000000000000000000", + "isEnabled": true, + "rate": "101369000000000000000" + }, + "out": { + "capacity": "44300000000000000000000", + "isEnabled": true, + "rate": "73981000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + }, + "out": { + "capacity": "44100000000000000000000", + "isEnabled": true, + "rate": "73647000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "42300000000000000000000", + "isEnabled": true, + "rate": "70641000000000000000" + }, + "out": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "51800000000000000000000", + "isEnabled": true, + "rate": "86506000000000000000" + }, + "out": { + "capacity": "50400000000000000000000", + "isEnabled": true, + "rate": "84168000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "57900000000000000000000", + "isEnabled": true, + "rate": "96693000000000000000" + }, + "out": { + "capacity": "46000000000000000000000", + "isEnabled": true, + "rate": "76820000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bitcoin-testnet-bsquared-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "68000000000000000000000", + "isEnabled": true, + "rate": "113560000000000000000" + }, + "out": { + "capacity": "58300000000000000000000", + "isEnabled": true, + "rate": "97361000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bitcoin-testnet-rootstock": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "35000000000000000000000", + "isEnabled": true, + "rate": "58450000000000000000" + }, + "out": { + "capacity": "47800000000000000000000", + "isEnabled": true, + "rate": "79826000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bitcoin-testnet-sepolia-bob-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "39000000000000000000000", + "isEnabled": true, + "rate": "65130000000000000000" + }, + "out": { + "capacity": "40400000000000000000000", + "isEnabled": true, + "rate": "67468000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bsc-testnet": { + "minBlockConfirmation": 7, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "52400000000000000000000", + "isEnabled": true, + "rate": "87508000000000000000" + }, + "out": { + "capacity": "59100000000000000000000", + "isEnabled": true, + "rate": "98697000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "42400000000000000000000", + "isEnabled": true, + "rate": "70808000000000000000" + }, + "out": { + "capacity": "38400000000000000000000", + "isEnabled": true, + "rate": "64128000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "32900000000000000000000", + "isEnabled": true, + "rate": "54943000000000000000" + }, + "out": { + "capacity": "65800000000000000000000", + "isEnabled": true, + "rate": "109886000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "65900000000000000000000", + "isEnabled": true, + "rate": "110053000000000000000" + }, + "out": { + "capacity": "65600000000000000000000", + "isEnabled": true, + "rate": "109552000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "34100000000000000000000", + "isEnabled": true, + "rate": "56947000000000000000" + }, + "out": { + "capacity": "64300000000000000000000", + "isEnabled": true, + "rate": "107381000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "62600000000000000000000", + "isEnabled": true, + "rate": "104542000000000000000" + }, + "out": { + "capacity": "37500000000000000000000", + "isEnabled": true, + "rate": "62625000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "57400000000000000000000", + "isEnabled": true, + "rate": "95858000000000000000" + }, + "out": { + "capacity": "33900000000000000000000", + "isEnabled": true, + "rate": "56613000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "celo-testnet-alfajores": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "36700000000000000000000", + "isEnabled": true, + "rate": "61289000000000000000" + }, + "out": { + "capacity": "44400000000000000000000", + "isEnabled": true, + "rate": "74148000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "cronos-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "47900000000000000000000", + "isEnabled": true, + "rate": "79993000000000000000" + }, + "out": { + "capacity": "35600000000000000000000", + "isEnabled": true, + "rate": "59452000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-holesky": { + "minBlockConfirmation": 1, + "remote": { + "polygon-testnet-tatara": { + "custom": { + "in": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + }, + "out": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-holesky-fraxtal-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "49000000000000000000000", + "isEnabled": true, + "rate": "81830000000000000000" + }, + "out": { + "capacity": "53400000000000000000000", + "isEnabled": true, + "rate": "89178000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-holesky-taiko-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "51400000000000000000000", + "isEnabled": true, + "rate": "85838000000000000000" + }, + "out": { + "capacity": "42300000000000000000000", + "isEnabled": true, + "rate": "70641000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-hoodi-morph": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 3, + "remote": { + "abstract-testnet": { + "custom": { + "in": { + "capacity": "66900000000000000000000", + "isEnabled": true, + "rate": "111723000000000000000" + }, + "out": { + "capacity": "35800000000000000000000", + "isEnabled": true, + "rate": "59786000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "apechain-testnet-curtis": { + "custom": { + "in": { + "capacity": "65500000000000000000000", + "isEnabled": true, + "rate": "109385000000000000000" + }, + "out": { + "capacity": "55500000000000000000000", + "isEnabled": true, + "rate": "92685000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": null, + "standard": null + }, + "bitcoin-testnet-bsquared-1": { + "custom": { + "in": { + "capacity": "68800000000000000000000", + "isEnabled": true, + "rate": "114896000000000000000" + }, + "out": { + "capacity": "65900000000000000000000", + "isEnabled": true, + "rate": "110053000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bitcoin-testnet-rootstock": { + "custom": { + "in": { + "capacity": "60300000000000000000000", + "isEnabled": true, + "rate": "100701000000000000000" + }, + "out": { + "capacity": "64300000000000000000000", + "isEnabled": true, + "rate": "107381000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bitcoin-testnet-sepolia-bob-1": { + "custom": { + "in": { + "capacity": "54200000000000000000000", + "isEnabled": true, + "rate": "90514000000000000000" + }, + "out": { + "capacity": "57200000000000000000000", + "isEnabled": true, + "rate": "95524000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "48300000000000000000000", + "isEnabled": true, + "rate": "80661000000000000000" + }, + "out": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "celo-testnet-alfajores": { + "custom": { + "in": { + "capacity": "58700000000000000000000", + "isEnabled": true, + "rate": "98029000000000000000" + }, + "out": { + "capacity": "62800000000000000000000", + "isEnabled": true, + "rate": "104876000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "cronos-testnet": { + "custom": { + "in": { + "capacity": "44500000000000000000000", + "isEnabled": true, + "rate": "74315000000000000000" + }, + "out": { + "capacity": "67400000000000000000000", + "isEnabled": true, + "rate": "112558000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-holesky-fraxtal-1": { + "custom": { + "in": { + "capacity": "33000000000000000000000", + "isEnabled": true, + "rate": "55110000000000000000" + }, + "out": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-holesky-taiko-1": { + "custom": { + "in": { + "capacity": "45200000000000000000000", + "isEnabled": true, + "rate": "75484000000000000000" + }, + "out": { + "capacity": "57800000000000000000000", + "isEnabled": true, + "rate": "96526000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-hoodi-morph": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "custom": { + "in": { + "capacity": "40100000000000000000000", + "isEnabled": true, + "rate": "66967000000000000000" + }, + "out": { + "capacity": "65600000000000000000000", + "isEnabled": true, + "rate": "109552000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "54700000000000000000000", + "isEnabled": true, + "rate": "91349000000000000000" + }, + "out": { + "capacity": "33900000000000000000000", + "isEnabled": true, + "rate": "56613000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "custom": { + "in": { + "capacity": "65000000000000000000000", + "isEnabled": true, + "rate": "108550000000000000000" + }, + "out": { + "capacity": "65400000000000000000000", + "isEnabled": true, + "rate": "109218000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-hashkey-1": { + "custom": { + "in": { + "capacity": "57700000000000000000000", + "isEnabled": true, + "rate": "96359000000000000000" + }, + "out": { + "capacity": "52000000000000000000000", + "isEnabled": true, + "rate": "86840000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-lisk-1": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-mantle-1": { + "custom": { + "in": { + "capacity": "65200000000000000000000", + "isEnabled": true, + "rate": "108884000000000000000" + }, + "out": { + "capacity": "58600000000000000000000", + "isEnabled": true, + "rate": "97862000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "44100000000000000000000", + "isEnabled": true, + "rate": "73647000000000000000" + }, + "out": { + "capacity": "62900000000000000000000", + "isEnabled": true, + "rate": "105043000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "38200000000000000000000", + "isEnabled": true, + "rate": "63794000000000000000" + }, + "out": { + "capacity": "57100000000000000000000", + "isEnabled": true, + "rate": "95357000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "custom": { + "in": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + }, + "out": { + "capacity": "31400000000000000000000", + "isEnabled": true, + "rate": "52438000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-worldchain-1": { + "custom": { + "in": { + "capacity": "63400000000000000000000", + "isEnabled": true, + "rate": "105878000000000000000" + }, + "out": { + "capacity": "35300000000000000000000", + "isEnabled": true, + "rate": "58951000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "custom": { + "in": { + "capacity": "57400000000000000000000", + "isEnabled": true, + "rate": "95858000000000000000" + }, + "out": { + "capacity": "69300000000000000000000", + "isEnabled": true, + "rate": "115731000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "hedera-testnet": { + "custom": { + "in": { + "capacity": "57700000000000000000000", + "isEnabled": true, + "rate": "96359000000000000000" + }, + "out": { + "capacity": "60700000000000000000000", + "isEnabled": true, + "rate": "101369000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ink-testnet-sepolia": { + "custom": null, + "standard": null + }, + "jovay-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "metal-testnet": { + "custom": { + "in": { + "capacity": "69400000000000000000000", + "isEnabled": true, + "rate": "115898000000000000000" + }, + "out": { + "capacity": "30100000000000000000000", + "isEnabled": true, + "rate": "50267000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "mint-testnet": { + "custom": { + "in": { + "capacity": "36700000000000000000000", + "isEnabled": true, + "rate": "61289000000000000000" + }, + "out": { + "capacity": "40700000000000000000000", + "isEnabled": true, + "rate": "67969000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "plume-testnet-sepolia": { + "custom": { + "in": { + "capacity": "58900000000000000000000", + "isEnabled": true, + "rate": "98363000000000000000" + }, + "out": { + "capacity": "49300000000000000000000", + "isEnabled": true, + "rate": "82331000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polkadot-testnet-astar-shibuya": { + "custom": { + "in": { + "capacity": "61300000000000000000000", + "isEnabled": true, + "rate": "102371000000000000000" + }, + "out": { + "capacity": "35700000000000000000000", + "isEnabled": true, + "rate": "59619000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "54500000000000000000000", + "isEnabled": true, + "rate": "91015000000000000000" + }, + "out": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ronin-testnet-saigon": { + "custom": { + "in": { + "capacity": "33300000000000000000000", + "isEnabled": true, + "rate": "55611000000000000000" + }, + "out": { + "capacity": "47800000000000000000000", + "isEnabled": true, + "rate": "79826000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "sei-testnet-atlantic": { + "custom": { + "in": { + "capacity": "30600000000000000000000", + "isEnabled": true, + "rate": "51102000000000000000" + }, + "out": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "42000000000000000000000", + "isEnabled": true, + "rate": "70140000000000000000" + }, + "out": { + "capacity": "49700000000000000000000", + "isEnabled": true, + "rate": "82999000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "65200000000000000000000", + "isEnabled": true, + "rate": "108884000000000000000" + }, + "out": { + "capacity": "56100000000000000000000", + "isEnabled": true, + "rate": "93687000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "sonic-testnet-blaze": { + "custom": { + "in": { + "capacity": "40700000000000000000000", + "isEnabled": true, + "rate": "67969000000000000000" + }, + "out": { + "capacity": "54700000000000000000000", + "isEnabled": true, + "rate": "91349000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "tac-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "69900000000000000000000", + "isEnabled": true, + "rate": "116733000000000000000" + }, + "out": { + "capacity": "47600000000000000000000", + "isEnabled": true, + "rate": "79492000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "35100000000000000000000", + "isEnabled": true, + "rate": "58617000000000000000" + }, + "out": { + "capacity": "48200000000000000000000", + "isEnabled": true, + "rate": "80494000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdc-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "49000000000000000000000", + "isEnabled": true, + "rate": "81830000000000000000" + }, + "out": { + "capacity": "37600000000000000000000", + "isEnabled": true, + "rate": "62792000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "37100000000000000000000", + "isEnabled": true, + "rate": "61957000000000000000" + }, + "out": { + "capacity": "30000000000000000000000", + "isEnabled": true, + "rate": "50100000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45600000000000000000000", + "isEnabled": true, + "rate": "76152000000000000000" + }, + "out": { + "capacity": "34800000000000000000000", + "isEnabled": true, + "rate": "58116000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "59900000000000000000000", + "isEnabled": true, + "rate": "100033000000000000000" + }, + "out": { + "capacity": "38000000000000000000000", + "isEnabled": true, + "rate": "63460000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + }, + "out": { + "capacity": "51400000000000000000000", + "isEnabled": true, + "rate": "85838000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "38900000000000000000000", + "isEnabled": true, + "rate": "64963000000000000000" + }, + "out": { + "capacity": "51300000000000000000000", + "isEnabled": true, + "rate": "85671000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "58100000000000000000000", + "isEnabled": true, + "rate": "97027000000000000000" + }, + "out": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "31100000000000000000000", + "isEnabled": true, + "rate": "51937000000000000000" + }, + "out": { + "capacity": "66900000000000000000000", + "isEnabled": true, + "rate": "111723000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "38500000000000000000000", + "isEnabled": true, + "rate": "64295000000000000000" + }, + "out": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 5, + "remote": { + "aptos-testnet": { + "custom": null, + "standard": null + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "31200000000000000000000", + "isEnabled": true, + "rate": "52104000000000000000" + }, + "out": { + "capacity": "62900000000000000000000", + "isEnabled": true, + "rate": "105043000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68400000000000000000000", + "isEnabled": true, + "rate": "114228000000000000000" + }, + "out": { + "capacity": "43600000000000000000000", + "isEnabled": true, + "rate": "72812000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "33700000000000000000000", + "isEnabled": true, + "rate": "56279000000000000000" + }, + "out": { + "capacity": "44300000000000000000000", + "isEnabled": true, + "rate": "73981000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "60000000000000000000000", + "isEnabled": true, + "rate": "100200000000000000000" + }, + "out": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "63600000000000000000000", + "isEnabled": true, + "rate": "106212000000000000000" + }, + "out": { + "capacity": "43000000000000000000000", + "isEnabled": true, + "rate": "71810000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "54000000000000000000000", + "isEnabled": true, + "rate": "90180000000000000000" + }, + "out": { + "capacity": "46900000000000000000000", + "isEnabled": true, + "rate": "78323000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + }, + "out": { + "capacity": "34600000000000000000000", + "isEnabled": true, + "rate": "57782000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "51900000000000000000000", + "isEnabled": true, + "rate": "86673000000000000000" + }, + "out": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "39000000000000000000000", + "isEnabled": true, + "rate": "65130000000000000000" + }, + "out": { + "capacity": "48200000000000000000000", + "isEnabled": true, + "rate": "80494000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-hashkey-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "43700000000000000000000", + "isEnabled": true, + "rate": "72979000000000000000" + }, + "out": { + "capacity": "33800000000000000000000", + "isEnabled": true, + "rate": "56446000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-lisk-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "35400000000000000000000", + "isEnabled": true, + "rate": "59118000000000000000" + }, + "out": { + "capacity": "46300000000000000000000", + "isEnabled": true, + "rate": "77321000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "34700000000000000000000", + "isEnabled": true, + "rate": "57949000000000000000" + }, + "out": { + "capacity": "51500000000000000000000", + "isEnabled": true, + "rate": "86005000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + }, + "out": { + "capacity": "49200000000000000000000", + "isEnabled": true, + "rate": "82164000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "46900000000000000000000", + "isEnabled": true, + "rate": "78323000000000000000" + }, + "out": { + "capacity": "40200000000000000000000", + "isEnabled": true, + "rate": "67134000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "61000000000000000000000", + "isEnabled": true, + "rate": "101870000000000000000" + }, + "out": { + "capacity": "48800000000000000000000", + "isEnabled": true, + "rate": "81496000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "47300000000000000000000", + "isEnabled": true, + "rate": "78991000000000000000" + }, + "out": { + "capacity": "38600000000000000000000", + "isEnabled": true, + "rate": "64462000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "54100000000000000000000", + "isEnabled": true, + "rate": "90347000000000000000" + }, + "out": { + "capacity": "54900000000000000000000", + "isEnabled": true, + "rate": "91683000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "53400000000000000000000", + "isEnabled": true, + "rate": "89178000000000000000" + }, + "out": { + "capacity": "52300000000000000000000", + "isEnabled": true, + "rate": "87341000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "51100000000000000000000", + "isEnabled": true, + "rate": "85337000000000000000" + }, + "out": { + "capacity": "40400000000000000000000", + "isEnabled": true, + "rate": "67468000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "34700000000000000000000", + "isEnabled": true, + "rate": "57949000000000000000" + }, + "out": { + "capacity": "33500000000000000000000", + "isEnabled": true, + "rate": "55945000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "49600000000000000000000", + "isEnabled": true, + "rate": "82832000000000000000" + }, + "out": { + "capacity": "65900000000000000000000", + "isEnabled": true, + "rate": "110053000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "53500000000000000000000", + "isEnabled": true, + "rate": "89345000000000000000" + }, + "out": { + "capacity": "35800000000000000000000", + "isEnabled": true, + "rate": "59786000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "69700000000000000000000", + "isEnabled": true, + "rate": "116399000000000000000" + }, + "out": { + "capacity": "69400000000000000000000", + "isEnabled": true, + "rate": "115898000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "61100000000000000000000", + "isEnabled": true, + "rate": "102037000000000000000" + }, + "out": { + "capacity": "64200000000000000000000", + "isEnabled": true, + "rate": "107214000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-worldchain-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "32400000000000000000000", + "isEnabled": true, + "rate": "54108000000000000000" + }, + "out": { + "capacity": "47700000000000000000000", + "isEnabled": true, + "rate": "79659000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "minBlockConfirmation": null, + "remote": { + "ethereum-testnet-sepolia": { + "custom": null, + "standard": null + } + } + }, + "hedera-testnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "68100000000000000000000", + "isEnabled": true, + "rate": "113727000000000000000" + }, + "out": { + "capacity": "64900000000000000000000", + "isEnabled": true, + "rate": "108383000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ink-testnet-sepolia": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "62400000000000000000000", + "isEnabled": true, + "rate": "104208000000000000000" + }, + "out": { + "capacity": "68900000000000000000000", + "isEnabled": true, + "rate": "115063000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "jovay-testnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "memento-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "metal-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + }, + "out": { + "capacity": "59900000000000000000000", + "isEnabled": true, + "rate": "100033000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "mint-testnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "44900000000000000000000", + "isEnabled": true, + "rate": "74983000000000000000" + }, + "out": { + "capacity": "57400000000000000000000", + "isEnabled": true, + "rate": "95858000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "plume-testnet-sepolia": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45900000000000000000000", + "isEnabled": true, + "rate": "76653000000000000000" + }, + "out": { + "capacity": "32800000000000000000000", + "isEnabled": true, + "rate": "54776000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polkadot-testnet-astar-shibuya": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + }, + "out": { + "capacity": "50300000000000000000000", + "isEnabled": true, + "rate": "84001000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polygon-testnet-amoy": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "40000000000000000000000", + "isEnabled": true, + "rate": "66800000000000000000" + }, + "out": { + "capacity": "55200000000000000000000", + "isEnabled": true, + "rate": "92184000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "37800000000000000000000", + "isEnabled": true, + "rate": "63126000000000000000" + }, + "out": { + "capacity": "41600000000000000000000", + "isEnabled": true, + "rate": "69472000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "62200000000000000000000", + "isEnabled": true, + "rate": "103874000000000000000" + }, + "out": { + "capacity": "65300000000000000000000", + "isEnabled": true, + "rate": "109051000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "59500000000000000000000", + "isEnabled": true, + "rate": "99365000000000000000" + }, + "out": { + "capacity": "64600000000000000000000", + "isEnabled": true, + "rate": "107882000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "53700000000000000000000", + "isEnabled": true, + "rate": "89679000000000000000" + }, + "out": { + "capacity": "61200000000000000000000", + "isEnabled": true, + "rate": "102204000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polygon-testnet-tatara": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-holesky": { + "custom": { + "in": { + "capacity": "37500000000000000000000", + "isEnabled": true, + "rate": "62625000000000000000" + }, + "out": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ronin-testnet-saigon": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "53400000000000000000000", + "isEnabled": true, + "rate": "89178000000000000000" + }, + "out": { + "capacity": "39700000000000000000000", + "isEnabled": true, + "rate": "66299000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "sei-testnet-atlantic": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "62900000000000000000000", + "isEnabled": true, + "rate": "105043000000000000000" + }, + "out": { + "capacity": "34200000000000000000000", + "isEnabled": true, + "rate": "57114000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "shibarium-testnet-puppynet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "46200000000000000000000", + "isEnabled": true, + "rate": "77154000000000000000" + }, + "out": { + "capacity": "65700000000000000000000", + "isEnabled": true, + "rate": "109719000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + }, + "out": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + }, + "out": { + "capacity": "69400000000000000000000", + "isEnabled": true, + "rate": "115898000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "45100000000000000000000", + "isEnabled": true, + "rate": "75317000000000000000" + }, + "out": { + "capacity": "63200000000000000000000", + "isEnabled": true, + "rate": "105544000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "solana-devnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "62200000000000", + "isEnabled": true, + "rate": "103874000000" + }, + "out": { + "capacity": "50400000000000", + "isEnabled": true, + "rate": "84168000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "54200000000000", + "isEnabled": true, + "rate": "90514000000" + }, + "out": { + "capacity": "55300000000000", + "isEnabled": true, + "rate": "92351000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "60900000000000", + "isEnabled": true, + "rate": "101703000000" + }, + "out": { + "capacity": "65000000000000", + "isEnabled": true, + "rate": "108550000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "40800000000000", + "isEnabled": true, + "rate": "68136000000" + }, + "out": { + "capacity": "68300000000000", + "isEnabled": true, + "rate": "114061000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "36800000000000", + "isEnabled": true, + "rate": "61456000000" + }, + "out": { + "capacity": "41500000000000", + "isEnabled": true, + "rate": "69305000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "sonic-testnet-blaze": { + "custom": { + "in": { + "capacity": "64300000000000", + "isEnabled": true, + "rate": "107381000000" + }, + "out": { + "capacity": "31800000000000", + "isEnabled": true, + "rate": "53106000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + } + } + }, + "sonic-testnet-blaze": { + "minBlockConfirmation": 9, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "68500000000000000000000", + "isEnabled": true, + "rate": "114395000000000000000" + }, + "out": { + "capacity": "49500000000000000000000", + "isEnabled": true, + "rate": "82665000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + }, + "out": { + "capacity": "43200000000000000000000", + "isEnabled": true, + "rate": "72144000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "tac-testnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-testnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "45600000000000000000000", + "isEnabled": true, + "rate": "76152000000000000000" + }, + "out": { + "capacity": "44700000000000000000000", + "isEnabled": true, + "rate": "74649000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "60500000000000000000000", + "isEnabled": true, + "rate": "101035000000000000000" + }, + "out": { + "capacity": "52500000000000000000000", + "isEnabled": true, + "rate": "87675000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45100000000000000000000", + "isEnabled": true, + "rate": "75317000000000000000" + }, + "out": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "38300000000000000000000", + "isEnabled": true, + "rate": "63961000000000000000" + }, + "out": { + "capacity": "30700000000000000000000", + "isEnabled": true, + "rate": "51269000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "66000000000000000000000", + "isEnabled": true, + "rate": "110220000000000000000" + }, + "out": { + "capacity": "38700000000000000000000", + "isEnabled": true, + "rate": "64629000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + }, + "out": { + "capacity": "42700000000000000000000", + "isEnabled": true, + "rate": "71309000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "xdai-testnet-chiado": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "44700000000000000000000", + "isEnabled": true, + "rate": "74649000000000000000" + }, + "out": { + "capacity": "38100000000000000000000", + "isEnabled": true, + "rate": "63627000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "59100000000000000000000", + "isEnabled": true, + "rate": "98697000000000000000" + }, + "out": { + "capacity": "51300000000000000000000", + "isEnabled": true, + "rate": "85671000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "52500000000000000000000", + "isEnabled": true, + "rate": "87675000000000000000" + }, + "out": { + "capacity": "61300000000000000000000", + "isEnabled": true, + "rate": "102371000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "40300000000000000000000", + "isEnabled": true, + "rate": "67301000000000000000" + }, + "out": { + "capacity": "51500000000000000000000", + "isEnabled": true, + "rate": "86005000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83500000000000000000" + }, + "out": { + "capacity": "54500000000000000000000", + "isEnabled": true, + "rate": "91015000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "56900000000000000000000", + "isEnabled": true, + "rate": "95023000000000000000" + }, + "out": { + "capacity": "45900000000000000000000", + "isEnabled": true, + "rate": "76653000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "64700000000000000000000", + "isEnabled": true, + "rate": "108049000000000000000" + }, + "out": { + "capacity": "53500000000000000000000", + "isEnabled": true, + "rate": "89345000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "xdc-testnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CCIP-LnM": { + "avalanche-fuji-testnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "31500000000000000000000", + "isEnabled": true, + "rate": "52605000000000000000" + }, + "out": { + "capacity": "49900000000000000000000", + "isEnabled": true, + "rate": "83333000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "58000000000000000000000", + "isEnabled": true, + "rate": "96860000000000000000" + }, + "out": { + "capacity": "47600000000000000000000", + "isEnabled": true, + "rate": "79492000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "43000000000000000000000", + "isEnabled": true, + "rate": "71810000000000000000" + }, + "out": { + "capacity": "57200000000000000000000", + "isEnabled": true, + "rate": "95524000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "32600000000000000000000", + "isEnabled": true, + "rate": "54442000000000000000" + }, + "out": { + "capacity": "49100000000000000000000", + "isEnabled": true, + "rate": "81997000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "37400000000000000000000", + "isEnabled": true, + "rate": "62458000000000000000" + }, + "out": { + "capacity": "37600000000000000000000", + "isEnabled": true, + "rate": "62792000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "56600000000000000000000", + "isEnabled": true, + "rate": "94522000000000000000" + }, + "out": { + "capacity": "64000000000000000000000", + "isEnabled": true, + "rate": "106880000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "38000000000000000000000", + "isEnabled": true, + "rate": "63460000000000000000" + }, + "out": { + "capacity": "34800000000000000000000", + "isEnabled": true, + "rate": "58116000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": null, + "standard": null + } + } + }, + "bsc-testnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "60000000000000000000000", + "isEnabled": true, + "rate": "100200000000000000000" + }, + "out": { + "capacity": "60200000000000000000000", + "isEnabled": true, + "rate": "100534000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "42400000000000000000000", + "isEnabled": true, + "rate": "70808000000000000000" + }, + "out": { + "capacity": "51700000000000000000000", + "isEnabled": true, + "rate": "86339000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "46000000000000000000000", + "isEnabled": true, + "rate": "76820000000000000000" + }, + "out": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "67200000000000000000000", + "isEnabled": true, + "rate": "112224000000000000000" + }, + "out": { + "capacity": "69300000000000000000000", + "isEnabled": true, + "rate": "115731000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "65300000000000000000000", + "isEnabled": true, + "rate": "109051000000000000000" + }, + "out": { + "capacity": "39300000000000000000000", + "isEnabled": true, + "rate": "65631000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "48700000000000000000000", + "isEnabled": true, + "rate": "81329000000000000000" + }, + "out": { + "capacity": "60000000000000000000000", + "isEnabled": true, + "rate": "100200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "celo-testnet-alfajores": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "67700000000000000000000", + "isEnabled": true, + "rate": "113059000000000000000" + }, + "out": { + "capacity": "64100000000000000000000", + "isEnabled": true, + "rate": "107047000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "44500000000000000000000", + "isEnabled": true, + "rate": "74315000000000000000" + }, + "out": { + "capacity": "64400000000000000000000", + "isEnabled": true, + "rate": "107548000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68800000000000000000000", + "isEnabled": true, + "rate": "114896000000000000000" + }, + "out": { + "capacity": "35200000000000000000000", + "isEnabled": true, + "rate": "58784000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "celo-testnet-alfajores": { + "custom": { + "in": { + "capacity": "41000000000000000000000", + "isEnabled": true, + "rate": "68470000000000000000" + }, + "out": { + "capacity": "60800000000000000000000", + "isEnabled": true, + "rate": "101536000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "custom": { + "in": { + "capacity": "68000000000000000000000", + "isEnabled": true, + "rate": "113560000000000000000" + }, + "out": { + "capacity": "45500000000000000000000", + "isEnabled": true, + "rate": "75985000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "52900000000000000000000", + "isEnabled": true, + "rate": "88343000000000000000" + }, + "out": { + "capacity": "36700000000000000000000", + "isEnabled": true, + "rate": "61289000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "35000000000000000000000", + "isEnabled": true, + "rate": "58450000000000000000" + }, + "out": { + "capacity": "47700000000000000000000", + "isEnabled": true, + "rate": "79659000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "custom": { + "in": { + "capacity": "50300000000000000000000", + "isEnabled": true, + "rate": "84001000000000000000" + }, + "out": { + "capacity": "47800000000000000000000", + "isEnabled": true, + "rate": "79826000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-linea-1": { + "custom": { + "in": { + "capacity": "51600000000000000000000", + "isEnabled": true, + "rate": "86172000000000000000" + }, + "out": { + "capacity": "43400000000000000000000", + "isEnabled": true, + "rate": "72478000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "custom": { + "in": { + "capacity": "54400000000000000000000", + "isEnabled": true, + "rate": "90848000000000000000" + }, + "out": { + "capacity": "52000000000000000000000", + "isEnabled": true, + "rate": "86840000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "53800000000000000000000", + "isEnabled": true, + "rate": "89846000000000000000" + }, + "out": { + "capacity": "59400000000000000000000", + "isEnabled": true, + "rate": "99198000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "59300000000000000000000", + "isEnabled": true, + "rate": "99031000000000000000" + }, + "out": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-polygon-zkevm-1": { + "custom": { + "in": { + "capacity": "65400000000000000000000", + "isEnabled": true, + "rate": "109218000000000000000" + }, + "out": { + "capacity": "32400000000000000000000", + "isEnabled": true, + "rate": "54108000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-scroll-1": { + "custom": { + "in": { + "capacity": "67400000000000000000000", + "isEnabled": true, + "rate": "112558000000000000000" + }, + "out": { + "capacity": "53200000000000000000000", + "isEnabled": true, + "rate": "88844000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-xlayer-1": { + "custom": { + "in": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + }, + "out": { + "capacity": "55500000000000000000000", + "isEnabled": true, + "rate": "92685000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "custom": { + "in": { + "capacity": "40800000000000000000000", + "isEnabled": true, + "rate": "68136000000000000000" + }, + "out": { + "capacity": "62400000000000000000000", + "isEnabled": true, + "rate": "104208000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polkadot-testnet-astar-shibuya": { + "custom": { + "in": { + "capacity": "114228000000000000000", + "isEnabled": true, + "rate": "68400000000000000000" + }, + "out": { + "capacity": "84001000000000000000", + "isEnabled": true, + "rate": "50300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + }, + "out": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "36900000000000000000000", + "isEnabled": true, + "rate": "61623000000000000000" + }, + "out": { + "capacity": "44600000000000000000000", + "isEnabled": true, + "rate": "74482000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ronin-testnet-saigon": { + "custom": { + "in": { + "capacity": "59400000000000000000000", + "isEnabled": true, + "rate": "99198000000000000000" + }, + "out": { + "capacity": "38200000000000000000000", + "isEnabled": true, + "rate": "63794000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "69700000000000000000000", + "isEnabled": true, + "rate": "116399000000000000000" + }, + "out": { + "capacity": "101703000000000000000", + "isEnabled": true, + "rate": "60900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + }, + "out": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "61100000000000000000000", + "isEnabled": true, + "rate": "102037000000000000000" + }, + "out": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "47300000000000000000000", + "isEnabled": true, + "rate": "78991000000000000000" + }, + "out": { + "capacity": "30900000000000000000000", + "isEnabled": true, + "rate": "51603000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "69900000000000000000000", + "isEnabled": true, + "rate": "116733000000000000000" + }, + "out": { + "capacity": "48500000000000000000000", + "isEnabled": true, + "rate": "80995000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "41300000000000000000000", + "isEnabled": true, + "rate": "68971000000000000000" + }, + "out": { + "capacity": "52700000000000000000000", + "isEnabled": true, + "rate": "88009000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "41900000000000000000000", + "isEnabled": true, + "rate": "69973000000000000000" + }, + "out": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + }, + "out": { + "capacity": "66400000000000000000000", + "isEnabled": true, + "rate": "110888000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "31400000000000000000000", + "isEnabled": true, + "rate": "52438000000000000000" + }, + "out": { + "capacity": "47300000000000000000000", + "isEnabled": true, + "rate": "78991000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "44400000000000000000000", + "isEnabled": true, + "rate": "74148000000000000000" + }, + "out": { + "capacity": "61600000000000000000000", + "isEnabled": true, + "rate": "102872000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "46400000000000000000000", + "isEnabled": true, + "rate": "77488000000000000000" + }, + "out": { + "capacity": "55000000000000000000000", + "isEnabled": true, + "rate": "91850000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "50200000000000000000000", + "isEnabled": true, + "rate": "83834000000000000000" + }, + "out": { + "capacity": "32300000000000000000000", + "isEnabled": true, + "rate": "53941000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "61800000000000000000000", + "isEnabled": true, + "rate": "103206000000000000000" + }, + "out": { + "capacity": "39200000000000000000000", + "isEnabled": true, + "rate": "65464000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "47000000000000000000000", + "isEnabled": true, + "rate": "78490000000000000000" + }, + "out": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "32600000000000000000000", + "isEnabled": true, + "rate": "54442000000000000000" + }, + "out": { + "capacity": "37300000000000000000000", + "isEnabled": true, + "rate": "62291000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "35600000000000000000000", + "isEnabled": true, + "rate": "59452000000000000000" + }, + "out": { + "capacity": "44000000000000000000000", + "isEnabled": true, + "rate": "73480000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "35900000000000000000000", + "isEnabled": true, + "rate": "59953000000000000000" + }, + "out": { + "capacity": "43900000000000000000000", + "isEnabled": true, + "rate": "73313000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-kroma-1": { + "minBlockConfirmation": 1, + "remote": { + "wemix-testnet": { + "custom": { + "in": { + "capacity": "48200000000000000000000", + "isEnabled": true, + "rate": "80494000000000000000" + }, + "out": { + "capacity": "53500000000000000000000", + "isEnabled": true, + "rate": "89345000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-linea-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "63800000000000000000000", + "isEnabled": true, + "rate": "106546000000000000000" + }, + "out": { + "capacity": "65400000000000000000000", + "isEnabled": true, + "rate": "109218000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "63200000000000000000000", + "isEnabled": true, + "rate": "105544000000000000000" + }, + "out": { + "capacity": "35500000000000000000000", + "isEnabled": true, + "rate": "59285000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "50700000000000000000000", + "isEnabled": true, + "rate": "84669000000000000000" + }, + "out": { + "capacity": "49500000000000000000000", + "isEnabled": true, + "rate": "82665000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "40900000000000000000000", + "isEnabled": true, + "rate": "68303000000000000000" + }, + "out": { + "capacity": "45900000000000000000000", + "isEnabled": true, + "rate": "76653000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "68400000000000000000000", + "isEnabled": true, + "rate": "114228000000000000000" + }, + "out": { + "capacity": "41500000000000000000000", + "isEnabled": true, + "rate": "69305000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "52900000000000000000000", + "isEnabled": true, + "rate": "88343000000000000000" + }, + "out": { + "capacity": "59700000000000000000000", + "isEnabled": true, + "rate": "99699000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "50400000000000000000000", + "isEnabled": true, + "rate": "84168000000000000000" + }, + "out": { + "capacity": "54800000000000000000000", + "isEnabled": true, + "rate": "91516000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "61100000000000000000000", + "isEnabled": true, + "rate": "102037000000000000000" + }, + "out": { + "capacity": "57200000000000000000000", + "isEnabled": true, + "rate": "95524000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "54100000000000000000000", + "isEnabled": true, + "rate": "90347000000000000000" + }, + "out": { + "capacity": "48600000000000000000000", + "isEnabled": true, + "rate": "81162000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "33300000000000000000000", + "isEnabled": true, + "rate": "55611000000000000000" + }, + "out": { + "capacity": "38900000000000000000000", + "isEnabled": true, + "rate": "64963000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "52100000000000000000000", + "isEnabled": true, + "rate": "87007000000000000000" + }, + "out": { + "capacity": "61200000000000000000000", + "isEnabled": true, + "rate": "102204000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-polygon-zkevm-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "46000000000000000000000", + "isEnabled": true, + "rate": "76820000000000000000" + }, + "out": { + "capacity": "42000000000000000000000", + "isEnabled": true, + "rate": "70140000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-scroll-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "41500000000000000000000", + "isEnabled": true, + "rate": "69305000000000000000" + }, + "out": { + "capacity": "57000000000000000000000", + "isEnabled": true, + "rate": "95190000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-xlayer-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "55100000000000000000000", + "isEnabled": true, + "rate": "92017000000000000000" + }, + "out": { + "capacity": "52200000000000000000000", + "isEnabled": true, + "rate": "87174000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "69000000000000000000000", + "isEnabled": true, + "rate": "115230000000000000000" + }, + "out": { + "capacity": "48400000000000000000000", + "isEnabled": true, + "rate": "80828000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polkadot-testnet-astar-shibuya": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "78490000000000000000", + "isEnabled": true, + "rate": "47000000000000000000" + }, + "out": { + "capacity": "92351000000000000000", + "isEnabled": true, + "rate": "55300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + }, + "out": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + } + } + } + } + }, + "polygon-testnet-amoy": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "63700000000000000000000", + "isEnabled": true, + "rate": "106379000000000000000" + }, + "out": { + "capacity": "41100000000000000000000", + "isEnabled": true, + "rate": "68637000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "64800000000000000000000", + "isEnabled": true, + "rate": "108216000000000000000" + }, + "out": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "58400000000000000000000", + "isEnabled": true, + "rate": "97528000000000000000" + }, + "out": { + "capacity": "37100000000000000000000", + "isEnabled": true, + "rate": "61957000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "36600000000000000000000", + "isEnabled": true, + "rate": "61122000000000000000" + }, + "out": { + "capacity": "56400000000000000000000", + "isEnabled": true, + "rate": "94188000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "32300000000000000000000", + "isEnabled": true, + "rate": "53941000000000000000" + }, + "out": { + "capacity": "30900000000000000000000", + "isEnabled": true, + "rate": "51603000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "34200000000000000000000", + "isEnabled": true, + "rate": "57114000000000000000" + }, + "out": { + "capacity": "68200000000000000000000", + "isEnabled": true, + "rate": "113894000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ronin-testnet-saigon": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "56900000000000000000000", + "isEnabled": true, + "rate": "95023000000000000000" + }, + "out": { + "capacity": "53000000000000000000000", + "isEnabled": true, + "rate": "88510000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "wemix-testnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "54300000000000000000000", + "isEnabled": true, + "rate": "90681000000000000000" + }, + "out": { + "capacity": "46600000000000000000000", + "isEnabled": true, + "rate": "77822000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68900000000000000000000", + "isEnabled": true, + "rate": "115063000000000000000" + }, + "out": { + "capacity": "66400000000000000000000", + "isEnabled": true, + "rate": "110888000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "43200000000000000000000", + "isEnabled": true, + "rate": "72144000000000000000" + }, + "out": { + "capacity": "43200000000000000000000", + "isEnabled": true, + "rate": "72144000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + }, + "out": { + "capacity": "64100000000000000000000", + "isEnabled": true, + "rate": "107047000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-kroma-1": { + "custom": { + "in": { + "capacity": "48600000000000000000000", + "isEnabled": true, + "rate": "81162000000000000000" + }, + "out": { + "capacity": "37500000000000000000000", + "isEnabled": true, + "rate": "62625000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "63600000000000000000000", + "isEnabled": true, + "rate": "106212000000000000000" + }, + "out": { + "capacity": "59500000000000000000000", + "isEnabled": true, + "rate": "99365000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "63200000000000000000000", + "isEnabled": true, + "rate": "105544000000000000000" + }, + "out": { + "capacity": "35200000000000000000000", + "isEnabled": true, + "rate": "58784000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "xdai-testnet-chiado": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "63600000000000000000000", + "isEnabled": true, + "rate": "106212000000000000000" + }, + "out": { + "capacity": "36900000000000000000000", + "isEnabled": true, + "rate": "61623000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + }, + "out": { + "capacity": "67200000000000000000000", + "isEnabled": true, + "rate": "112224000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "64900000000000000000000", + "isEnabled": true, + "rate": "108383000000000000000" + }, + "out": { + "capacity": "37200000000000000000000", + "isEnabled": true, + "rate": "62124000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "59800000000000000000000", + "isEnabled": true, + "rate": "99866000000000000000" + }, + "out": { + "capacity": "60800000000000000000000", + "isEnabled": true, + "rate": "101536000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "60300000000000000000000", + "isEnabled": true, + "rate": "100701000000000000000" + }, + "out": { + "capacity": "60500000000000000000000", + "isEnabled": true, + "rate": "101035000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "30800000000000000000000", + "isEnabled": true, + "rate": "51436000000000000000" + }, + "out": { + "capacity": "32800000000000000000000", + "isEnabled": true, + "rate": "54776000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + }, + "out": { + "capacity": "46400000000000000000000", + "isEnabled": true, + "rate": "77488000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + } + }, + "syrupUSDC": { + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-devnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "syrupUSDT": { + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-testnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-testnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDC": { + "avalanche-fuji-testnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polygon-testnet-amoy": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": null, + "standard": null + } + } + }, + "solana-devnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + } +} diff --git a/src/components/Address.tsx b/src/components/Address.tsx index 5544b5e225b..1acc8b3c07d 100644 --- a/src/components/Address.tsx +++ b/src/components/Address.tsx @@ -55,6 +55,7 @@ const AddressComponent = ({ padding: 1px 5px; border-radius: var(--border-radius-10); word-break: break-word; + color: var(--blue-600); } .addressContainer { diff --git a/src/components/AddressReact.tsx b/src/components/AddressReact.tsx index 84648e9f3e4..46d3e69bace 100644 --- a/src/components/AddressReact.tsx +++ b/src/components/AddressReact.tsx @@ -40,6 +40,7 @@ const AddressComponent = ({ contractUrl, address, endLength, urlClass, urlId }: padding: 1px 0px; border-radius: var(--border-radius-10); word-break: break-word; + color: var(--blue-600); } .addressContainer { diff --git a/src/components/CCIP/AddButton/AddButton.astro b/src/components/CCIP/AddButton/AddButton.astro new file mode 100644 index 00000000000..bd52b43b126 --- /dev/null +++ b/src/components/CCIP/AddButton/AddButton.astro @@ -0,0 +1,47 @@ +--- +export interface Props { + href: string + text: string + urlClass?: string +} + +const { href, text, urlClass } = Astro.props +--- + + + Add + {text} + + + diff --git a/src/components/CCIP/Cards/Card.css b/src/components/CCIP/Cards/Card.css new file mode 100644 index 00000000000..bb77dae5555 --- /dev/null +++ b/src/components/CCIP/Cards/Card.css @@ -0,0 +1,40 @@ +.card__container { + display: flex; + padding: var(--space-6x); + gap: var(--space-3x); + width: 100%; + background: var(--white); + border: 1px solid var(--gray-200); + border-radius: var(--space-1x); + /* Optimize rendering performance */ + contain: layout style paint; + will-change: background-color; +} + +.card__container:hover { + background-color: var(--gray-50); +} + +.card__container img, +.card__container object, +.card__container object img { + width: var(--space-10x); + height: var(--space-10x); + margin-top: auto; + margin-bottom: auto; +} + +.card__container h3 { + font-size: var(--space-4x); + font-weight: var(--font-weight-medium); + line-height: var(--space-6x); + color: var(--gray-950); + margin-bottom: var(--space-1x); +} + +.card__container p { + margin-bottom: 0; + font-size: var(--space-3x); + line-height: var(--space-5x); + color: var(--gray-500); +} diff --git a/src/components/CCIP/Cards/Card.tsx b/src/components/CCIP/Cards/Card.tsx new file mode 100644 index 00000000000..669bd9155ff --- /dev/null +++ b/src/components/CCIP/Cards/Card.tsx @@ -0,0 +1,43 @@ +import { memo, type ReactNode } from "react" +import "./Card.css" + +interface CardProps { + logo: ReactNode + title: string + subtitle?: string + link?: string + onClick?: () => void + ariaLabel?: string +} + +const Card = memo(function Card({ logo, title, subtitle, link, onClick, ariaLabel }: CardProps) { + const content = ( + <> + {logo} +
+

{title}

+ {subtitle &&

{subtitle}

} +
+ + ) + + if (link) { + return ( + +
{content}
+
+ ) + } + + if (onClick) { + return ( + + ) + } + + return
{content}
+}) + +export default Card diff --git a/src/components/CCIP/Cards/NetworkCard.tsx b/src/components/CCIP/Cards/NetworkCard.tsx index 839f4389d4d..5d5ee0f4e99 100644 --- a/src/components/CCIP/Cards/NetworkCard.tsx +++ b/src/components/CCIP/Cards/NetworkCard.tsx @@ -1,5 +1,5 @@ import { memo } from "react" -import "./NetworkCard.css" +import Card from "./Card.tsx" interface NetworkCardProps { name: string @@ -9,17 +9,9 @@ interface NetworkCardProps { } const NetworkCard = memo(function NetworkCard({ name, totalLanes, totalTokens, logo }: NetworkCardProps) { - return ( -
- -
-

{name}

-

- {totalLanes} {totalLanes > 1 ? "lanes" : "lane"} | {totalTokens} {totalTokens > 1 ? "tokens" : "token"} -

-
-
- ) + const subtitle = `${totalLanes} ${totalLanes === 1 ? "lane" : "lanes"} | ${totalTokens} ${totalTokens === 1 ? "token" : "tokens"}` + + return } title={name} subtitle={subtitle} /> }) export default NetworkCard diff --git a/src/components/CCIP/Cards/TokenCard.css b/src/components/CCIP/Cards/TokenCard.css index c2d092aa132..ae035e97a19 100644 --- a/src/components/CCIP/Cards/TokenCard.css +++ b/src/components/CCIP/Cards/TokenCard.css @@ -1,19 +1,11 @@ .token-card__container { display: flex; - width: 100%; - height: 110px; - min-width: 110px; - margin: 0 auto; - flex-direction: column; - align-items: center; - text-align: center; - padding: var(--space-4x); + padding: var(--space-6x); gap: var(--space-3x); - background: #ffffff; + width: 100%; + background: var(--white); border: 1px solid var(--gray-200); border-radius: var(--space-1x); - justify-content: center; - cursor: pointer; /* Optimize rendering performance */ contain: layout style paint; will-change: background-color; @@ -27,14 +19,24 @@ .token-card__container object img { width: var(--space-10x); height: var(--space-10x); + margin-top: auto; + margin-bottom: auto; border-radius: 50%; } .token-card__container h3 { font-size: var(--space-4x); - font-weight: 500; + font-weight: var(--font-weight-medium); + line-height: var(--space-6x); color: var(--gray-950); + margin-bottom: var(--space-1x); +} + +.token-card__container p { margin-bottom: 0; + font-size: var(--space-3x); + line-height: var(--space-5x); + color: var(--gray-500); } .truncate { @@ -49,3 +51,58 @@ height: 124px; } } + +/* Square variant styles */ +.token-card__square-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--space-6x); + width: 100%; + background: var(--white); + border: 1px solid var(--gray-200); + border-radius: var(--space-1x); + text-align: center; +} + +.token-card__square-container:hover { + background-color: var(--gray-50); +} + +.token-card__square-logo { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: var(--space-4x); +} + +.token-card__square-logo object, +.token-card__square-logo object img { + width: var(--space-16x); + height: var(--space-16x); + border-radius: 50%; +} + +.token-card__square-content { + display: flex; + flex-direction: column; + align-items: center; +} + +.token-card__square-content h3 { + font-size: var(--space-4x); + font-weight: var(--font-weight-medium); + line-height: var(--space-6x); + color: var(--gray-950); + margin-bottom: var(--space-1x); + text-align: center; +} + +.token-card__square-content p { + margin-bottom: 0; + font-size: var(--space-3x); + line-height: var(--space-5x); + color: var(--gray-500); + text-align: center; +} diff --git a/src/components/CCIP/Cards/TokenCard.tsx b/src/components/CCIP/Cards/TokenCard.tsx index 653908ec260..51372209112 100644 --- a/src/components/CCIP/Cards/TokenCard.tsx +++ b/src/components/CCIP/Cards/TokenCard.tsx @@ -1,5 +1,6 @@ import { memo } from "react" import { fallbackTokenIconUrl } from "~/features/utils/index.ts" +import Card from "./Card.tsx" import "./TokenCard.css" interface TokenCardProps { @@ -7,42 +8,71 @@ interface TokenCardProps { logo?: string link?: string onClick?: () => void + totalNetworks?: number + variant?: "default" | "square" } -const TokenCard = memo(function TokenCard({ id, logo, link, onClick }: TokenCardProps) { - if (link) { - return ( - -
- {/* We cannot use the normal Image/onError syntax as a fallback as the element is server rendered - and the onerror does not seem to work correctly. Using Picture will also not work. */} - - {`${id} - +const TokenCard = memo(function TokenCard({ + id, + logo, + link, + onClick, + totalNetworks, + variant = "default", +}: TokenCardProps) { + const logoElement = ( + + {`${id} + + ) + + const subtitle = + totalNetworks !== undefined ? `${totalNetworks} ${totalNetworks === 1 ? "network" : "networks"}` : undefined + + if (variant === "square") { + const content = ( + <> +
{logoElement}
+

{id}

+ {subtitle &&

{subtitle}

}
-
+ ) - } - if (onClick) { - return ( - - ) + if (link) { + return ( + +
{content}
+
+ ) + } + + if (onClick) { + return ( + + ) + } + + return
{content}
} return ( -
- - - -

{id}

-
+ ) }) diff --git a/src/components/CCIP/Chain/Chain.astro b/src/components/CCIP/Chain/Chain.astro index fd726a209a2..1dc9bf70e46 100644 --- a/src/components/CCIP/Chain/Chain.astro +++ b/src/components/CCIP/Chain/Chain.astro @@ -6,6 +6,7 @@ import { Network, getAllNetworkLanes, getAllNetworks, + getAllUniqueVerifiers, getSearchLanes, getTokensOfChain, Version, @@ -17,6 +18,7 @@ import ChainTokenGrid from "./ChainTokenGrid" import { generateChainStructuredData } from "~/utils/ccipStructuredData" import StructuredData from "~/components/StructuredData.astro" import { DOCS_BASE_URL } from "~/utils/structuredData" +import AddButton from "~/components/CCIP/AddButton/AddButton.astro" interface Props { environment: Environment @@ -48,6 +50,11 @@ const lanes = await getAllNetworkLanes({ const searchLanes = getSearchLanes({ environment }) +const allVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) + // Generate dynamic metadata for this specific chain const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" const logoPath = network.logo || "" @@ -106,6 +113,7 @@ const chainStructuredData = generateChainStructuredData( network={network} environment={environment} lanes={searchLanes} + verifiers={allVerifiers} client:load />
@@ -128,14 +136,11 @@ const chainStructuredData = generateChainStructuredData(

Tokens ({allTokens.length})

{ network.chainType !== "solana" && network.chainType !== "aptos" && ( - - Add - Add my token - + ) }
@@ -180,6 +185,14 @@ const chainStructuredData = generateChainStructuredData( grid-template-columns: 1fr; gap: var(--space-2x); } + :global(.chain-add-button) { + border-color: var(--blue-600) !important; + color: var(--blue-600) !important; + } + + :global(.chain-add-button:hover) { + background-color: var(--blue-100) !important; + } @media (min-width: 50em) { .layout { @@ -193,8 +206,12 @@ const chainStructuredData = generateChainStructuredData( display: grid; --doc-padding: var(--space-10x); padding: var(--doc-padding) var(--space-8x); - grid-template-columns: 1fr 1fr; - gap: var(--space-24x); + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: var(--space-8x); + } + + .layout > div { + min-width: 0; } .networks__grid { diff --git a/src/components/CCIP/Chain/ChainTokenGrid.css b/src/components/CCIP/Chain/ChainTokenGrid.css index 9f61a1e8472..aa0bcdbcc86 100644 --- a/src/components/CCIP/Chain/ChainTokenGrid.css +++ b/src/components/CCIP/Chain/ChainTokenGrid.css @@ -6,7 +6,6 @@ @media (min-width: 992px) { .tokens__grid { - min-height: 420px; grid-template-columns: 1fr 1fr 1fr 1fr; gap: var(--space-4x); } diff --git a/src/components/CCIP/Chain/ChainTokenGrid.tsx b/src/components/CCIP/Chain/ChainTokenGrid.tsx index ad2502efcff..c74a8fa0211 100644 --- a/src/components/CCIP/Chain/ChainTokenGrid.tsx +++ b/src/components/CCIP/Chain/ChainTokenGrid.tsx @@ -1,7 +1,7 @@ -import { Environment, Version, Network } from "~/config/data/ccip/types.ts" +import { Environment, Version, Network, PoolType } from "~/config/data/ccip/types.ts" import { getAllTokenLanes, getTokenData } from "~/config/data/ccip/data.ts" import TokenCard from "../Cards/TokenCard.tsx" -import { drawerContentStore } from "../Drawer/drawerStore.ts" +import { drawerContentStore, DrawerWidth, drawerWidthStore } from "../Drawer/drawerStore.ts" import TokenDrawer from "../Drawer/TokenDrawer.tsx" import { directoryToSupportedChain, getChainIcon, getChainTypeAndFamily, getTitle } from "~/features/utils/index.ts" import { useState } from "react" @@ -36,6 +36,7 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { id={token.id} logo={token.logo} key={token.id} + variant="square" onClick={() => { const selectedNetwork = Object.keys(data) .map((key) => { @@ -53,8 +54,9 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { tokenSymbol: data[key].symbol, tokenDecimals: data[key].decimals, tokenAddress: data[key].tokenAddress, - tokenPoolType: data[key].poolType, - tokenPoolAddress: data[key].poolAddress || "", + tokenPoolType: (data[key].pool?.type || data[key].poolType) as PoolType, + tokenPoolAddress: data[key].pool?.address || data[key].poolAddress || "", + tokenPoolVersion: data[key].pool?.version || "", explorer: network.explorer, chainType, } @@ -67,6 +69,7 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { version: Version.V1_2_0, token: token.id, })[selectedNetwork.key] + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( } -function ChainHero({ chains, tokens, network, token, environment, lanes }: ChainHeroProps) { +function ChainHero({ + chains, + tokens, + network, + token, + environment, + lanes, + verifiers = [], + breadcrumbItems, +}: ChainHeroProps) { // Get chain-specific tooltip configuration const chainTooltipConfig = network?.chain ? getChainTooltip(network.chain) : null @@ -99,55 +119,58 @@ function ChainHero({ chains, tokens, network, token, environment, lanes }: Chain
- +
-
- { - currentTarget.onerror = null // prevents looping - currentTarget.src = fallbackTokenIconUrl - }} - /> -

- {network?.name || token?.id} - {token?.name} + {(network || token) && ( +
+ { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackTokenIconUrl + }} + /> +

+ {network?.name || token?.name} + {token?.id} - {chainTooltipConfig && ( - - )} -

-
+ {chainTooltipConfig && ( + + )} +

+
+ )} {network && (
@@ -189,7 +212,7 @@ function ChainHero({ chains, tokens, network, token, environment, lanes }: Chain RMN ( - <> +
{label} {tooltip}
{children}
- +
) function LaneDetailsHero({ @@ -83,20 +84,14 @@ function LaneDetailsHero({ destinationNetwork, onRamp, offRamp, + sourceAddress, destinationAddress, - enforceOutOfOrder, explorer, inOutbound, + inDrawer = false, }: LaneDetailsHeroProps) { - // Map boolean values to display strings - const getOutOfOrderText = (value?: boolean) => { - if (value === true) return "Required" - if (value === false) return "Optional" - return "N/A" - } - return ( -
+
{/* Display networks with direction based on lane type */}
{inOutbound === LaneFilter.Inbound ? ( @@ -115,16 +110,7 @@ function LaneDetailsHero({
- {/* Display address information based on lane type */} - {inOutbound === LaneFilter.Inbound ? ( - - - - ) : ( + {onRamp && ( )} - - {destinationAddress ? : "n/a"}{" "} - + {offRamp && ( + + + + )} + + {sourceAddress && ( + } + > + + + )} - {inOutbound === LaneFilter.Outbound && ( + {destinationAddress && ( - } + label="Destination chain selector" + clipboardType="destination-chain-selector" + tooltip={} > - {getOutOfOrderText(enforceOutOfOrder)} + )}
diff --git a/src/components/CCIP/ChainHero/TokenDetailsHero.tsx b/src/components/CCIP/ChainHero/TokenDetailsHero.tsx index 94ce250d01f..382b2f849bb 100644 --- a/src/components/CCIP/ChainHero/TokenDetailsHero.tsx +++ b/src/components/CCIP/ChainHero/TokenDetailsHero.tsx @@ -4,6 +4,7 @@ import { PoolType } from "~/config/data/ccip/types.ts" import { tokenPoolDisplay } from "~/config/data/ccip/utils.ts" import "./ChainHero.css" import { ExplorerInfo, ChainType } from "~/config/types.ts" +import { getNetworkIconUrl } from "~/config/data/ccip/data.ts" interface TokenDetailsHeroProps { network: { @@ -22,15 +23,16 @@ interface TokenDetailsHeroProps { poolType: PoolType poolAddress: string } + inDrawer?: boolean } -function TokenDetailsHero({ network, token }: TokenDetailsHeroProps) { +function TokenDetailsHero({ network, token, inDrawer = false }: TokenDetailsHeroProps) { return ( -
+
- + (null) const drawerContentRef = useRef(null) const $drawerContent = useStore(drawerContentStore) as (() => ReactNode) | ReactNode | null + const $drawerWidth = useStore(drawerWidthStore) const [isOpened, setIsOpened] = useState(false) // exit when press esc @@ -47,6 +48,7 @@ function Drawer() { // Use transitionend event instead of setTimeout for better performance const handleTransitionEnd = () => { drawerContentStore.set(null) + drawerWidthStore.set(DrawerWidth.Default) drawerRef.current?.removeEventListener("transitionend", handleTransitionEnd) } @@ -62,7 +64,12 @@ function Drawer() { ref={drawerRef} onClick={handleClickOutside} > -
+
@@ -285,6 +298,36 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { )} + + {verifiersResults.length > 0 && ( + <> + Verifiers + + + )}
)}
diff --git a/src/components/CCIP/SeeMore/SeeMore.css b/src/components/CCIP/SeeMore/SeeMore.css index 8c4c9209c51..102d96cf4b1 100644 --- a/src/components/CCIP/SeeMore/SeeMore.css +++ b/src/components/CCIP/SeeMore/SeeMore.css @@ -7,6 +7,6 @@ } .seeMore__container { display: flex; - justify-content: center; + justify-content: flex-start; align-items: center; } diff --git a/src/components/CCIP/SeeMore/SeeMore.tsx b/src/components/CCIP/SeeMore/SeeMore.tsx index 3e0b7c17278..cab963897c7 100644 --- a/src/components/CCIP/SeeMore/SeeMore.tsx +++ b/src/components/CCIP/SeeMore/SeeMore.tsx @@ -1,14 +1,22 @@ import "./SeeMore.css" interface SeeMoreProps { onClick?: () => void + label?: string + href?: string } -function SeeMore({ onClick }: SeeMoreProps) { +function SeeMore({ onClick, label = "See more", href }: SeeMoreProps) { return (
- + {href ? ( + + {label} + + ) : ( + + )}
) } diff --git a/src/components/CCIP/Tables/ChainTable.tsx b/src/components/CCIP/Tables/ChainTable.tsx index d487faf20ee..7ab6c7c559e 100644 --- a/src/components/CCIP/Tables/ChainTable.tsx +++ b/src/components/CCIP/Tables/ChainTable.tsx @@ -4,7 +4,7 @@ import Tabs from "./Tabs.tsx" import TableSearchInput from "./TableSearchInput.tsx" import { useEffect, useState } from "react" import { getExplorerAddressUrl } from "~/features/utils/index.ts" -import { drawerContentStore } from "../Drawer/drawerStore.ts" +import { drawerContentStore, drawerWidthStore, DrawerWidth } from "../Drawer/drawerStore.ts" import LaneDrawer from "../Drawer/LaneDrawer.tsx" import { Environment, Version, LaneFilter } from "~/config/data/ccip/types.ts" import { getLane } from "~/config/data/ccip/data.ts" @@ -68,9 +68,6 @@ function ChainTable({ lanes, explorer, sourceNetwork, environment }: TableProps) onChange={(key) => setInOutbound(key as LaneFilter)} />
-
- -
View lane status +
+ +
@@ -130,6 +130,7 @@ function ChainTable({ lanes, explorer, sourceNetwork, environment }: TableProps) version: Version.V1_2_0, }) + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( .ccip-table { + font-size: 11px; + } + + .ccip-table__wrapper > .ccip-table thead th { + padding: var(--space-2x) var(--space-1x); + font-size: 10px; + line-height: 1.2; + white-space: nowrap; + } + + .ccip-table__wrapper > .ccip-table tbody td { + padding: var(--space-2x) var(--space-1x); + font-size: 10px; + vertical-align: middle; + } + + .ccip-table__wrapper > .ccip-table tbody td > div { + display: flex; + align-items: center; + gap: var(--space-1x); + } + + .ccip-table__wrapper > .ccip-table .ccip-table__logo { + width: 16px !important; + height: 16px !important; + margin-right: 0 !important; + flex-shrink: 0; + } + + /* Make verifier name column slightly wider */ + .ccip-table__wrapper > .ccip-table thead th:nth-child(1) { + min-width: 90px; + } + + /* Compress address column */ + .ccip-table__wrapper > .ccip-table thead th:nth-child(2) { + min-width: 70px; + } + + /* Make type and threshold columns narrower */ + .ccip-table__wrapper > .ccip-table thead th:nth-child(3), + .ccip-table__wrapper > .ccip-table thead th:nth-child(4) { + min-width: 60px; + } +} diff --git a/src/components/CCIP/Tables/TokenChainsTable.tsx b/src/components/CCIP/Tables/TokenChainsTable.tsx index ca40a294da8..7ddfe2e0a38 100644 --- a/src/components/CCIP/Tables/TokenChainsTable.tsx +++ b/src/components/CCIP/Tables/TokenChainsTable.tsx @@ -1,6 +1,6 @@ import Address from "~/components/AddressReact.tsx" import "./Table.css" -import { drawerContentStore } from "../Drawer/drawerStore.ts" +import { drawerContentStore, DrawerWidth, drawerWidthStore } from "../Drawer/drawerStore.ts" import { Environment, SupportedTokenConfig, tokenPoolDisplay, PoolType } from "~/config/data/ccip/index.ts" import { areAllLanesPaused } from "~/config/data/ccip/utils.ts" import { ChainType, ExplorerInfo } from "~/config/types.ts" @@ -8,6 +8,8 @@ import TableSearchInput from "./TableSearchInput.tsx" import { useState } from "react" import { getExplorerAddressUrl, fallbackTokenIconUrl } from "~/features/utils/index.ts" import TokenDrawer from "../Drawer/TokenDrawer.tsx" +import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" +import { useTokenFinality } from "~/hooks/useTokenFinality.ts" interface TableProps { networks: { @@ -23,6 +25,7 @@ interface TableProps { tokenAddress: string tokenPoolType: PoolType tokenPoolAddress: string + tokenPoolVersion: string explorer: ExplorerInfo }[] token: { @@ -41,6 +44,10 @@ interface TableProps { function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { const [search, setSearch] = useState("") + + // Fetch finality data using custom hook + const { finalityData, isLoading: loading } = useTokenFinality(token.id, environment, "internal_id") + return ( <>
@@ -60,6 +67,9 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { Token address Token pool type Token pool address + Pool version + Custom finality + Min Blocks required @@ -76,6 +86,7 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { type="button" className={`ccip-table__network-name ${allLanesPaused ? "ccip-table__network-name--paused" : ""}`} onClick={() => { + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( {tokenPoolDisplay(network.tokenPoolType)} @@ -136,9 +147,44 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { network.chainType )(network.tokenPoolAddress)} address={network.tokenPoolAddress} - endLength={6} + endLength={4} /> + {network.tokenPoolVersion} + + {loading ? ( + "-" + ) : finalityData[network.key] ? ( + finalityData[network.key].hasCustomFinality === null ? ( + + ) : finalityData[network.key].hasCustomFinality ? ( + "Yes" + ) : ( + "No" + ) + ) : ( + + )} + + + {loading + ? "-" + : finalityData[network.key] + ? finalityData[network.key].minBlockConfirmation === null + ? "-" + : finalityData[network.key].minBlockConfirmation + : "-"} + ) })} diff --git a/src/components/CCIP/Tables/VerifiersTable.tsx b/src/components/CCIP/Tables/VerifiersTable.tsx new file mode 100644 index 00000000000..dc79bf8753e --- /dev/null +++ b/src/components/CCIP/Tables/VerifiersTable.tsx @@ -0,0 +1,124 @@ +import Address from "~/components/AddressReact.tsx" +import "./Table.css" +import { Environment, Verifier, getVerifierTypeDisplay } from "~/config/data/ccip/index.ts" +import TableSearchInput from "./TableSearchInput.tsx" +import { useState } from "react" +import { + getExplorerAddressUrl, + fallbackVerifierIconUrl, + getChainIcon, + getTitle, + directoryToSupportedChain, + getExplorer, + getChainTypeAndFamily, +} from "~/features/utils/index.ts" + +interface VerifiersTableProps { + verifiers: Verifier[] +} + +function VerifiersTable({ verifiers }: VerifiersTableProps) { + const [search, setSearch] = useState("") + + // Transform verifiers data to include network information + const verifiersWithNetworkInfo = verifiers.map((verifier) => { + const supportedChain = directoryToSupportedChain(verifier.network) + const networkName = getTitle(supportedChain) || verifier.network + const networkLogo = getChainIcon(supportedChain) || "" + const explorer = getExplorer(supportedChain) + const { chainType } = getChainTypeAndFamily(supportedChain) + + return { + ...verifier, + networkName, + networkLogo, + supportedChain, + explorer, + chainType, + } + }) + + const filteredVerifiers = verifiersWithNetworkInfo.filter( + (verifier) => + verifier.name.toLowerCase().includes(search.toLowerCase()) || + verifier.networkName.toLowerCase().includes(search.toLowerCase()) || + verifier.address.toLowerCase().includes(search.toLowerCase()) || + getVerifierTypeDisplay(verifier.type).toLowerCase().includes(search.toLowerCase()) + ) + + return ( + <> +
+
+ Verifiers ({verifiers.length}) +
+ +
+
+ + + + + + + + + + + {filteredVerifiers.map((verifier, index) => ( + + + + + + + ))} + +
VerifierNetworkVerifier addressVerifier type
+
+ + {`${verifier.name} { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackVerifierIconUrl + }} + /> + + {verifier.name} +
+
+
+ + {`${verifier.networkName} { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackVerifierIconUrl + }} + /> + + {verifier.networkName} +
+
+
+
{getVerifierTypeDisplay(verifier.type)}
+
{filteredVerifiers.length === 0 && <>No verifiers found}
+
+ + ) +} + +export default VerifiersTable diff --git a/src/components/CCIP/Token/Token.astro b/src/components/CCIP/Token/Token.astro index 58071e03c39..8718769da7f 100644 --- a/src/components/CCIP/Token/Token.astro +++ b/src/components/CCIP/Token/Token.astro @@ -5,6 +5,7 @@ import { getAllNetworks, getAllSupportedTokens, getAllTokenLanes, + getAllUniqueVerifiers, getChainsOfToken, getSearchLanes, getTokenData, @@ -76,6 +77,11 @@ const tokenLanes = getAllTokenLanes({ const searchLanes = getSearchLanes({ environment }) +const allVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) + // Generate dynamic metadata for this specific token const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" const tokenMetadata = { @@ -117,6 +123,7 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai tokens={allTokens} client:load lanes={searchLanes} + verifiers={allVerifiers} token={{ id: token, name: data[firstSupportedChain]?.name || "", @@ -150,8 +157,9 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai tokenSymbol: data[key]?.symbol ?? "", tokenDecimals: data[key]?.decimals ?? 0, tokenAddress: data[key]?.tokenAddress ?? "", - tokenPoolType: data[key]?.poolType, - tokenPoolAddress: data[key]?.poolAddress ?? "", + tokenPoolType: data[key]?.pool?.type, + tokenPoolAddress: data[key]?.pool?.address ?? "", + tokenPoolVersion: data[key]?.pool?.version ?? "", explorer: explorer, chainType: chainType, } @@ -171,9 +179,8 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai diff --git a/src/components/CCIP/TokenGrid/TokenGrid.tsx b/src/components/CCIP/TokenGrid/TokenGrid.tsx index 9c303e264a5..7938ef0406a 100644 --- a/src/components/CCIP/TokenGrid/TokenGrid.tsx +++ b/src/components/CCIP/TokenGrid/TokenGrid.tsx @@ -1,35 +1,47 @@ -import { useState } from "react" -import SeeMore from "../SeeMore/SeeMore.tsx" -import "./TokenGrid.css" -import TokenCard from "../Cards/TokenCard.tsx" +import { fallbackTokenIconUrl } from "~/features/utils/index.ts" +import Card from "../Cards/Card.tsx" +import Grid from "../Landing/Grid.tsx" interface TokenGridProps { tokens: { id: string logo: string + totalNetworks?: number }[] environment: string } -const BEFORE_SEE_MORE = 6 * 4 // Number of networks to show before the "See more" button, 6 rows x 4 items +const BEFORE_SEE_MORE = 2 * 4 // Number of tokens to show before the "See more" button, 2 rows x 4 items -function NetworkGrid({ tokens, environment }: TokenGridProps) { - const [seeMore, setSeeMore] = useState(tokens.length <= BEFORE_SEE_MORE) +function TokenGrid({ tokens, environment }: TokenGridProps) { return ( - <> -
- {tokens.slice(0, seeMore ? tokens.length : BEFORE_SEE_MORE).map((token) => ( - { + const subtitle = + token.totalNetworks !== undefined + ? `${token.totalNetworks} ${token.totalNetworks === 1 ? "network" : "networks"}` + : undefined + const logoElement = ( + + {`${token.id} + + ) + return ( + - ))} -
- {!seeMore && setSeeMore(!seeMore)} />} - + ) + }} + /> ) } -export default NetworkGrid +export default TokenGrid diff --git a/src/components/CCIP/Tooltip/RateTooltip.tsx b/src/components/CCIP/Tooltip/RateTooltip.tsx index 836644ab53d..78b6c948d9c 100644 --- a/src/components/CCIP/Tooltip/RateTooltip.tsx +++ b/src/components/CCIP/Tooltip/RateTooltip.tsx @@ -7,14 +7,33 @@ function RateTooltip({ symbol, decimals, position, + showUnavailableText = false, }: { destinationLane: SupportedTokenConfig inOutbound: LaneFilter symbol: string decimals: number position?: "top" | "bottom" | "left" | "right" + showUnavailableText?: boolean }) { if (!destinationLane.rateLimiterConfig?.[inOutbound === LaneFilter.Inbound ? "in" : "out"]?.isEnabled) { + if (showUnavailableText) { + return ( + + ) + } return N/A } const { rateSecond, maxThroughput } = displayRate( diff --git a/src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx b/src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx new file mode 100644 index 00000000000..7dd31d36e19 --- /dev/null +++ b/src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx @@ -0,0 +1,46 @@ +import { lazy, Suspense } from "react" +import type { Environment } from "~/config/data/ccip/types.ts" + +const VerifierGrid = lazy(() => import("./VerifierGrid.tsx")) + +interface LazyVerifierGridProps { + verifiers: Array<{ + id: string + name: string + logo: string + totalNetworks: number + }> + environment: Environment +} + +export default function LazyVerifierGrid({ verifiers, environment }: LazyVerifierGridProps) { + return ( + + {Array.from({ length: 8 }, (_, i) => ( +
+ ))} +
+ } + > + +
+ ) +} diff --git a/src/components/CCIP/VerifierGrid/VerifierGrid.tsx b/src/components/CCIP/VerifierGrid/VerifierGrid.tsx new file mode 100644 index 00000000000..133dbb95a97 --- /dev/null +++ b/src/components/CCIP/VerifierGrid/VerifierGrid.tsx @@ -0,0 +1,46 @@ +import { fallbackVerifierIconUrl } from "~/features/utils/index.ts" +import Card from "../Cards/Card.tsx" +import Grid from "../Landing/Grid.tsx" + +interface VerifierGridProps { + verifiers: { + id: string + name: string + logo: string + totalNetworks: number + }[] + environment: string +} + +const BEFORE_SEE_MORE = 2 * 4 // Number of verifiers to show before the "See more" button, 2 rows x 4 items + +function VerifierGrid({ verifiers, environment }: VerifierGridProps) { + return ( + { + const subtitle = `${verifier.totalNetworks} ${verifier.totalNetworks === 1 ? "network" : "networks"}` + const logoElement = ( + + {`${verifier.name} + + ) + return ( + + ) + }} + /> + ) +} + +export default VerifierGrid diff --git a/src/components/CCIP/Verifiers/Verifiers.astro b/src/components/CCIP/Verifiers/Verifiers.astro new file mode 100644 index 00000000000..dd3dc730de4 --- /dev/null +++ b/src/components/CCIP/Verifiers/Verifiers.astro @@ -0,0 +1,118 @@ +--- +import CcipDirectoryLayout from "~/layouts/CcipDirectoryLayout.astro" +import { getEntry, render } from "astro:content" +import { + getAllNetworks, + getAllVerifiers, + getSearchLanes, + Version, + Environment, + getAllSupportedTokens, + getChainsOfToken, +} from "~/config/data/ccip" +import Table from "~/components/CCIP/Tables/VerifiersTable" +import { getAllUniqueVerifiers } from "~/config/data/ccip/data.ts" +import { DOCS_BASE_URL } from "~/utils/structuredData" +import ChainHero from "~/components/CCIP/ChainHero/ChainHero" +import { getTokenIconUrl } from "~/features/utils" +import "./Verifiers.css" + +interface Props { + environment: Environment +} + +const { environment } = Astro.props as Props + +const entry = await getEntry("ccip", "index") +if (!entry) { + throw new Error('Could not find "ccip/index" doc. Check src/content/ccip/index.mdx!') +} + +const { headings } = await render(entry) + +const networks = getAllNetworks({ filter: environment }) + +const allVerifiers = getAllVerifiers({ + environment, + version: Version.V1_2_0, +}) + +const uniqueVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) + +const searchLanes = getSearchLanes({ environment }) + +const supportedTokens = getAllSupportedTokens({ + environment, + version: Version.V1_2_0, +}) +const tokens = Object.keys(supportedTokens).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base" })) +const allTokens = tokens.map((token) => { + const logo = getTokenIconUrl(token) || "" + return { + id: token, + logo, + totalNetworks: getChainsOfToken({ token, filter: environment }).length, + } +}) + +// Generate dynamic metadata for verifiers page +const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" +const verifiersMetadata = { + title: `CCIP Verifiers - ${environmentText} Networks`, + description: `View all CCIP verifiers across ${environmentText} networks. Explore ${allVerifiers.length} verifiers, their addresses, types, and supported networks for cross-chain verification.`, + image: "/assets/product-logos/ccip-logo.svg", + excerpt: `CCIP verifiers ${environmentText.toLowerCase()} networks addresses types committee api cross-chain verification blockchain interoperability`, +} + +// Generate structured data for verifiers page +const currentPath = new URL(Astro.request.url).pathname +const canonicalForJsonLd = `${DOCS_BASE_URL}${currentPath}` +--- + + + + +
+
+ + + + diff --git a/src/components/CCIP/Verifiers/Verifiers.css b/src/components/CCIP/Verifiers/Verifiers.css new file mode 100644 index 00000000000..eda464e886c --- /dev/null +++ b/src/components/CCIP/Verifiers/Verifiers.css @@ -0,0 +1,43 @@ +.layout { + margin: 0 auto; + padding: var(--space-6x); +} + +.layout h2 { + color: var(--gray-900); + font-size: 22px; + line-height: var(--space-10x); + padding-bottom: var(--space-4x); + border-bottom: 1px solid var(--gray-200); + margin-bottom: var(--space-6x); +} + +.layout h2 span { + color: var(--gray-400); + font-weight: 600; + letter-spacing: 0.5px; +} + +.networks__grid { + display: grid; + grid-template-columns: 1fr; + gap: var(--space-8x); +} + +.tokens__grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-8x); +} + +@media (min-width: 50em) { + .layout { + max-width: 1500px; + } +} + +@media (min-width: 992px) { + .layout { + padding: var(--space-10x) var(--space-8x); + } +} diff --git a/src/components/ChainSelector/ChainSelector.tsx b/src/components/ChainSelector/ChainSelector.tsx index 2af9c5d5337..44006774200 100644 --- a/src/components/ChainSelector/ChainSelector.tsx +++ b/src/components/ChainSelector/ChainSelector.tsx @@ -40,6 +40,7 @@ export function ChainSelector({ if (dataFeedType === "rates") return chain.tags?.includes("rates") ?? false if (dataFeedType === "usGovernmentMacroeconomicData") return chain.tags?.includes("usGovernmentMacroeconomicData") ?? false + if (dataFeedType === "tokenizedEquity") return chain.tags?.includes("tokenizedEquity") ?? false return chain.tags?.includes("default") ?? false })() diff --git a/src/components/ChainSelector/ChainTypeSelector.module.css b/src/components/ChainSelector/ChainTypeSelector.module.css deleted file mode 100644 index 1d250eccf3b..00000000000 --- a/src/components/ChainSelector/ChainTypeSelector.module.css +++ /dev/null @@ -1,146 +0,0 @@ -.selector { - display: flex; - align-items: center; - padding: var(--space-4x) 0; - background: var(--color-background-primary, #ffffff); - position: sticky; - top: 0; - z-index: 10; -} - -.dropdown { - position: relative; - width: auto; - min-width: 160px; -} - -.dropdownButton { - display: flex; - align-items: center; - gap: var(--space-2x); - width: 100%; - padding: var(--space-2x) var(--space-3x); - border: 1.5px solid var(--border-color, #e5e7eb); - border-radius: 6px; - background: var(--color-background-primary, #ffffff); - color: var(--color-text-primary); - font-size: 14px; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.dropdownButton:hover { - background: var(--color-background-secondary, #f9fafb); - border-color: var(--color-text-tertiary, #9ca3af); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); - transform: translateY(-1px); -} - -.dropdownButton:active { - transform: translateY(0); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.dropdownButton:focus-visible { - outline: 2px solid var(--color-blue-600, #2563eb); - outline-offset: 2px; - border-color: var(--color-blue-600, #2563eb); -} - -.arrow { - margin-left: auto; - color: var(--color-text-secondary, #6b7280); - transition: transform 0.2s ease; -} - -.arrowOpen { - transform: rotate(180deg); -} - -.dropdownMenu { - position: absolute; - top: calc(100% + 4px); - left: 0; - right: 0; - margin: 0; - padding: var(--space-2x) 0; - list-style: none; - background: var(--color-background-primary, #ffffff); - border: 1.5px solid var(--border-color, #e5e7eb); - border-radius: 6px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - z-index: 100; - max-height: 300px; - overflow-y: auto; -} - -.dropdownMenu li { - margin: 0; - padding: 0; -} - -.dropdownItem { - display: flex; - align-items: center; - gap: var(--space-2x); - width: 100%; - padding: var(--space-2x) var(--space-3x); - border: none; - background: transparent; - color: var(--color-text-primary); - font-size: 14px; - font-weight: 500; - text-align: left; - cursor: pointer; - transition: all 0.15s ease; -} - -.dropdownItem:hover { - background: var(--color-background-secondary, #f9fafb); - padding-left: calc(var(--space-3x) + 2px); -} - -.dropdownItem:focus-visible { - outline: 2px solid var(--chain-color); - outline-offset: -2px; - background: var(--color-background-secondary, #f9fafb); -} - -.dropdownItemActive { - color: var(--color-blue-600, #2563eb); - font-weight: 600; - background: var(--color-blue-50, #eff6ff); -} - -.icon { - width: 20px; - height: 20px; - flex-shrink: 0; - object-fit: contain; -} - -.name { - white-space: nowrap; - flex: 1; -} - -.checkmark { - margin-left: auto; - color: var(--color-blue-600, #2563eb); - flex-shrink: 0; -} - -@media (max-width: 640px) { - .dropdown { - width: 100%; - min-width: 0; - } -} - -@media (max-width: 480px) { - .dropdownMenu { - max-height: 240px; - } -} diff --git a/src/components/ChainSelector/ChainTypeSelector.tsx b/src/components/ChainSelector/ChainTypeSelector.tsx index 2ebf21e6cdd..e85b99e0996 100644 --- a/src/components/ChainSelector/ChainTypeSelector.tsx +++ b/src/components/ChainSelector/ChainTypeSelector.tsx @@ -1,12 +1,11 @@ /** @jsxImportSource react */ import { useStore } from "@nanostores/react" -import { useState, useRef, useEffect } from "react" import { selectedChainType, setChainType } from "~/stores/chainType.js" import { CHAIN_TYPE_CONFIGS, CCIP_SUPPORTED_CHAINS } from "~/config/chainTypes.js" import { CCIP_SIDEBAR_CONTENT } from "~/config/sidebar/ccip-dynamic.js" import { findEquivalentPageUrlWithFallback } from "~/utils/chainNavigation.js" import type { ChainType } from "~/config/types.js" -import styles from "./ChainTypeSelector.module.css" +import { SidebarDropdown, type DropdownItem } from "../SidebarDropdown/index.js" /** * Chain Type Dropdown Selector Component @@ -30,13 +29,9 @@ import styles from "./ChainTypeSelector.module.css" */ export function ChainTypeSelector() { const activeChain = useStore(selectedChainType) - const [isOpen, setIsOpen] = useState(false) - const dropdownRef = useRef(null) - const activeConfig = CHAIN_TYPE_CONFIGS[activeChain] - - const handleSelect = (chainType: ChainType) => { - setIsOpen(false) + const handleSelect = (chainId: string) => { + const chainType = chainId as ChainType setChainType(chainType) // Find target URL with intelligent fallback: exact match → parent → section root @@ -45,110 +40,25 @@ export function ChainTypeSelector() { window.location.href = `/${targetUrl}` } - const handleToggle = () => { - setIsOpen(!isOpen) - } - - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { - setIsOpen(false) - } + // Convert chain configs to dropdown items format + const chainItems: DropdownItem[] = CCIP_SUPPORTED_CHAINS.map((chainId) => { + const config = CHAIN_TYPE_CONFIGS[chainId] + return { + id: chainId, + label: config.displayName, + icon: config.icon, + description: config.description, } - - const handleEscape = (event: KeyboardEvent) => { - if (event.key === "Escape") { - setIsOpen(false) - } - } - - if (isOpen) { - document.addEventListener("mousedown", handleClickOutside) - document.addEventListener("keydown", handleEscape) - } - - return () => { - document.removeEventListener("mousedown", handleClickOutside) - document.removeEventListener("keydown", handleEscape) - } - }, [isOpen]) + }) return ( -
-
- - - {isOpen && ( -
    - {CCIP_SUPPORTED_CHAINS.map((chainId) => { - const config = CHAIN_TYPE_CONFIGS[chainId] - const isActive = activeChain === chainId - - return ( -
  • - -
  • - ) - })} -
- )} -
-
+ ) } diff --git a/src/components/CodeHighlightBlock/CodeHighlightBlock.astro b/src/components/CodeHighlightBlock/CodeHighlightBlock.astro index 03bacdf06c2..8eb7332ce8e 100644 --- a/src/components/CodeHighlightBlock/CodeHighlightBlock.astro +++ b/src/components/CodeHighlightBlock/CodeHighlightBlock.astro @@ -277,7 +277,7 @@ function getLanguageDisplayName(langCode: string): string { const languageDisplay = getLanguageDisplayName(lang) --- -
+
{ @@ -358,6 +358,13 @@ const languageDisplay = getLanguageDisplayName(lang) // Simple syntax highlighting function function highlightInIsolation(code, language) { + // First, HTML-escape the code to prevent code parts from being interpreted as tags + const escapeHtml = (text) => { + const div = document.createElement("div") + div.textContent = text + return div.innerHTML + } + const goKeywords = ["package", "import", "func", "type", "struct", "if", "else", "for", "return", "var", "const"] const goTypes = ["string", "int", "bool", "error", "interface{}"] @@ -382,7 +389,7 @@ const languageDisplay = getLanguageDisplayName(lang) ] const tsTypes = ["string", "number", "boolean", "void", "any", "unknown", "object", "Array"] - let highlighted = code + let highlighted = escapeHtml(code) if (language === "go") { // Highlight strings @@ -602,8 +609,8 @@ const languageDisplay = getLanguageDisplayName(lang) if (copyButton) { copyButton.addEventListener("click", async () => { try { - // Use the clean code stored specifically in THIS container's data attribute - const codeToCopy = container.dataset.cleanCode || "" + // Parse the JSON-encoded clean code from the data attribute + const codeToCopy = JSON.parse(container.dataset.cleanCode || '""') await navigator.clipboard.writeText(codeToCopy) copyButton.innerHTML = checkmarkIconSVG diff --git a/src/components/CodeHighlightBlockMulti/CodeHighlightBlockMulti.astro b/src/components/CodeHighlightBlockMulti/CodeHighlightBlockMulti.astro index 3d82e41e0cf..cbd3df0330f 100644 --- a/src/components/CodeHighlightBlockMulti/CodeHighlightBlockMulti.astro +++ b/src/components/CodeHighlightBlockMulti/CodeHighlightBlockMulti.astro @@ -789,6 +789,13 @@ const languageDisplay = getLanguageDisplayName(currentLang) // Simple syntax highlighting function function highlightInIsolation(code, language) { + // First, HTML-escape the code to prevent code parts from being interpreted as tags + const escapeHtml = (text) => { + const div = document.createElement("div") + div.textContent = text + return div.innerHTML + } + const goKeywords = ["package", "import", "func", "type", "struct", "if", "else", "for", "return", "var", "const"] const goTypes = ["string", "int", "bool", "error", "interface{}"] @@ -813,7 +820,7 @@ const languageDisplay = getLanguageDisplayName(currentLang) ] const tsTypes = ["string", "number", "boolean", "void", "any", "unknown", "object", "Array"] - let highlighted = code + let highlighted = escapeHtml(code) if (language === "go") { // Highlight strings diff --git a/src/components/CodeSample/CodeSample.astro b/src/components/CodeSample/CodeSample.astro index 8ffa36e46b8..a617179346e 100644 --- a/src/components/CodeSample/CodeSample.astro +++ b/src/components/CodeSample/CodeSample.astro @@ -1,21 +1,31 @@ --- -import { Prism } from "@astrojs/prism" +import { runHighlighterWithAstro } from "@astrojs/prism/dist/highlighter" import fs from "node:fs/promises" import path from "node:path" +import { getLanguageIconSrc, languageBadge } from "../../lib/codeSample/language.js" + export type Props = { src: string lang?: string + filename?: string showButtonOnly?: boolean optimize?: boolean runs?: number showButtons?: boolean } -const { src, lang, showButtonOnly, optimize, runs, showButtons = true } = Astro.props as Props +const { src, lang, filename, showButtonOnly, optimize, runs, showButtons = true } = Astro.props as Props const data = (await fs.readFile(path.join(process.cwd(), "public", src), "utf-8")).toString() +const prismLang = lang ?? "solidity" +const headerFilename = filename?.trim() || undefined +const { classLanguage, html } = runHighlighterWithAstro(prismLang, data) +const languageKey = prismLang.toLowerCase() +const languageIconSrc = getLanguageIconSrc(languageKey) +const preInnerHtml = `${html}` + const isSolidityFile = src.match(/\.sol/) const isSample = isSolidityFile && (src.indexOf("samples/") === 0 || src.indexOf("/samples/") === 0) @@ -30,9 +40,40 @@ const remixUrl = `https://remix.ethereum.org/#url=https://docs.chain.link/${clea }` --- -{!showButtonOnly && } { - isSample && showButtons && ( + !showButtonOnly && + (headerFilename ? ( +
+
+
+ + + {headerFilename} + +
+ +
+
+      
+ ) : ( +
+    ))
+}
+
+{
+  isSample && (
     
        | SHA-256 Checksum                                                                          |
-| ------------------------------------- | ----------------------------------------------------------------------------------------- |
-| `cre_windows_amd64.zip`               |  |
+1. Go to https://github.com/smartcontractkit/cre-cli/releases
+2. Find the release version you downloaded (e.g., v1.0.10)
+3. Under the **Assets** section, locate `cre_windows_amd64.zip`
+4. Compare the SHA-256 checksum shown next to the file with the `Hash` value from your PowerShell output
 
-If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance.
+**Example:** For `cre_windows_amd64.zip` in release v1.0.10, you'll see something like:
+
+```
+cre_windows_amd64.zip
+sha256:372d16566479ff6bbfe9eb1d5cebe0e1e2a3c67062c6f0439fc96c735ddeaa18
+```
+
+If the checksums match, the file is authentic and safe to install. If they don't match, do not proceed with installation and contact the Chainlink team for assistance.
 
 #### 2. Extract and install
 
 1. Navigate to the directory where you downloaded the archive.
 1. Right-click the `.zip` file and select **Extract All...**.
 1. Choose a permanent location for the extracted folder (e.g., `C:\Program Files\cre-cli`).
-1. Inside the extracted folder, rename the file `cre_v1.0.2_windows_amd64.exe` to `cre.exe`.
+1. Inside the extracted folder, rename the file `cre_v1.0.10_windows_amd64.exe` to `cre.exe`.
 
 #### 3. Add the CLI to your PATH
 
@@ -131,7 +139,7 @@ Open a new **PowerShell** or **Command Prompt** window and run:
 cre version
 ```
 
-You should see version information: `cre version v1.0.2`.
+You should see version information: `cre version v1.0.10`.
 
 ## Next steps
 
diff --git a/src/content/cre/getting-started/conclusion.mdx b/src/content/cre/getting-started/conclusion.mdx
deleted file mode 100644
index 63eeccd9441..00000000000
--- a/src/content/cre/getting-started/conclusion.mdx
+++ /dev/null
@@ -1,115 +0,0 @@
----
-section: cre
-title: "Conclusion & Next Steps"
-date: Last Modified
-metadata:
-  description: "Getting started conclusion: next steps after completing the tutorial - deploy to production, explore triggers, and build custom contracts."
-  datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
----
-
-import { Aside } from "@components"
-
-You've built a complete, end-to-end CRE workflow from scratch.
-
-You started with an empty project and progressively built a workflow that:
-
-- Fetches data from an offchain API with consensus
-- Reads values from a smart contract
-- Performs calculations combining onchain and offchain data
-- Writes results back to the blockchain
-
-**This is no small achievement.** You've mastered the core pattern that powers most CRE workflows: the trigger-and-callback model with capabilities for HTTP, EVM, and consensus.
-
-## What's next?
-
-Now that you have a working workflow, here's your natural progression from simulation to production and beyond.
-
-### 1. See a complete example
-
-Ready to see all these concepts in a more complex, real-world scenario?
-
-- **[Run the Custom Data Feed Demo](/cre/templates/running-demo-workflow)** - Explore an advanced template that combines multiple capabilities
-
-**Why this matters:** Templates show production-ready patterns.
-
-### 2. Deploy your Calculator workflow to Production
-
-You've simulated your workflow locally. **The logical next step is to deploy it to the CRE production environment** so it runs across a Decentralized Oracle Network (DON).
-
-{/* prettier-ignore */}
-
-
-**Follow this deployment sequence:**
-
-1. **[Link a Wallet Key](/cre/organization/linking-keys)** - Connect your wallet address to your organization (required before deployment)
-1. **[Deploy Your Workflow](/cre/guides/operations/deploying-workflows)** - Push your calculator workflow live
-1. **[Monitor Your Workflow](/cre/guides/operations/monitoring-workflows)** - Watch it execute in production and debug any issues
-
-**Why this matters:** Deploying moves your workflow from local simulation to production execution across a DON.
-
-### 3. Explore different triggers
-
-You used a **Cron trigger** (time-based). **Most production workflows react to real-world events.**
-
-**Try these next:**
-
-- **[HTTP Trigger](/cre/guides/workflow/using-triggers/http-trigger/overview)** - Let external systems trigger your workflow via API calls
-- **[EVM Log Trigger](/cre/guides/workflow/using-triggers/evm-log-trigger)** - React to onchain events (e.g., token transfers, contract events)
-
-**Why this matters:** Event-driven workflows are more powerful than scheduled ones. They respond instantly to real-world changes.
-
-### 4. Add secrets
-
-Your calculator used a public API. **Real workflows often need API keys and other sensitive data.**
-
-**Learn how to secure your secrets:**
-
-- **[Using Secrets in Simulation](/cre/guides/workflow/secrets/using-secrets-simulation)** - Store secrets in your local environment for development
-- **[Using Secrets with Deployed Workflows](/cre/guides/workflow/secrets/using-secrets-deployed)** - Store secrets in the Vault DON for production
-- **[Managing Secrets with 1Password](/cre/guides/workflow/secrets/managing-secrets-1password)** - Best practice: inject secrets at runtime
-
-**Why this matters:** Hardcoded credentials are a security risk. CRE's secrets management lets you safely use authenticated APIs and private keys.
-
-### 5. Build your own consumer contract
-
-You used a **pre-deployed consumer contract**. **For production workflows, you'll create custom contracts tailored to your use case.**
-
-**Learn the secure pattern:**
-
-- **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)** - Create contracts that safely receive CRE data
-
-**Why this matters:** Consumer contracts enforce business logic and validation onchain, enabling trustless and verifiable execution.
-
-## Reference: Deepen Your Understanding
-
-Want to dive deeper into specific concepts from the Getting Started guide? Use this section as a quick reference.
-
-**Workflow Structure & Triggers**
-
-- **[Core SDK Reference](/cre/reference/sdk/core/)** - Fundamental building blocks (`InitWorkflow`, `Handler`, `Runtime`)
-- **[Triggers Overview](/cre/guides/workflow/using-triggers/overview)** - Compare all available event sources
-
-**HTTP & Offchain Data**
-
-- **[API Interactions Guide](/cre/guides/workflow/using-http-client/)** - Complete patterns for HTTP requests
-- **[Consensus & Aggregation](/cre/reference/sdk/consensus)** - All aggregation methods (median, mode, custom)
-- **[Consensus Computing Concept](/cre/concepts/consensus-computing)** - How CRE's consensus-based execution works
-
-**EVM & Onchain Interactions**
-
-- **[EVM Client Overview](/cre/guides/workflow/using-evm-client/overview)** - Introduction to smart contract interactions
-- **[Onchain Read Guide](/cre/guides/workflow/using-evm-client/onchain-read)** - Reading from a smart contract
-- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)** - Complete write patterns and report generation
-
-**Configuration & Secrets**
-
-- **[Project Configuration](/cre/reference/project-configuration/)** - Complete guide to `project.yaml`, `workflow.yaml`, and targets
-- **[Secrets Guide](/cre/guides/workflow/secrets)** - All secrets management patterns
-
-**All Capabilities**
-
-- **[Capabilities Overview](/cre/capabilities/)** - See the full list of CRE capabilities and how they work together
diff --git a/src/content/cre/getting-started/part-1-project-setup-go.mdx b/src/content/cre/getting-started/part-1-project-setup-go.mdx
index f4bb0a924e6..9f8bb8b0794 100644
--- a/src/content/cre/getting-started/part-1-project-setup-go.mdx
+++ b/src/content/cre/getting-started/part-1-project-setup-go.mdx
@@ -7,14 +7,14 @@ pageId: "getting-started-part-1"
 metadata:
   description: "Getting started Part 1 (Go): set up your first CRE project, explore the structure, and run a successful workflow simulation."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2026-01-14"
 ---
 
 import { Aside, CopyText, CodeHighlightBlock } from "@components"
 import part1Code from "./snippets/part-1-main.go?raw"
 
 
 
diff --git a/src/content/cre/getting-started/part-1-project-setup-ts.mdx b/src/content/cre/getting-started/part-1-project-setup-ts.mdx
index d571e0f7895..7c96dc090d4 100644
--- a/src/content/cre/getting-started/part-1-project-setup-ts.mdx
+++ b/src/content/cre/getting-started/part-1-project-setup-ts.mdx
@@ -7,14 +7,14 @@ pageId: "getting-started-part-1"
 metadata:
   description: "Getting started Part 1 (TypeScript): set up your first CRE project, explore the structure, and run a successful workflow simulation."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2026-01-20"
 ---
 
 import { Aside, CopyText, CodeHighlightBlock } from "@components"
 import part1Code from "./snippets/part-1-main.ts?raw"
 
 
 
@@ -33,7 +33,7 @@ Before you begin, ensure you have the following:
 
 - **CRE CLI**: See the [Installation Guide](/cre/getting-started/cli-installation/macos-linux) for details.
 - **CRE account & authentication**: You must have a CRE account and be logged in with the CLI. See [Create your account](/cre/account/creating-account) and [Log in with the CLI](/cre/account/cli-login) for instructions.
-- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with . See [Install Bun](https://bun.sh/) for instructions.
+- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with . See [Install Bun](https://bun.com) for instructions.
 - **Funded Sepolia Account**: An account with Sepolia ETH to pay for transaction gas fees. Go to faucets.chain.link to get some Sepolia ETH.
 
 ## Step 1: Verify your authentication
@@ -160,6 +160,12 @@ Open `onchain-calculator/my-calculator-workflow/main.ts` to see its contents:
 - **`initWorkflow`**: Creates the workflow by registering handlers (trigger-callback pairs). This is where you define what events your workflow responds to.
 - **`main`**: The entry point that creates a `Runner`, passes your config type, and runs the workflow.
 
+
+
 ## Step 4: Configure your workflow
 
 Now that you've explored the generated files, let's configure your workflow for simulation. You'll need to adjust a few configuration files.
diff --git a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx
index 530d5a03092..145ef82f504 100644
--- a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx
+++ b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx
@@ -7,11 +7,11 @@ pageId: "getting-started-part-4"
 metadata:
   description: "Getting started Part 4 (Go): write verified workflow results onchain to smart contracts and complete your first end-to-end workflow."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2025-12-09"
 ---
 
 import { Aside } from "@components"
-import { CodeHighlightBlock } from "@components"
+import { CodeHighlightBlock, CodeSample } from "@components"
 import part4Code from "./snippets/part-4-main.go?raw"
 
 In the previous parts, you successfully fetched offchain data and read from a smart contract. Now, you'll complete the "Onchain Calculator" by writing your computed result back to the blockchain.
@@ -35,75 +35,9 @@ Here is the source code for the contract so you can see how it works:
   of how this works in a later guide.
 
 
-```solidity
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol";
-
-/**
- * @title CalculatorConsumer (Testing Version)
- * @notice This contract receives reports from a CRE workflow and stores the results of a calculation onchain.
- * @dev This version uses IReceiverTemplate without configuring any security checks, making it compatible
- * with the mock Forwarder used during simulation. All permission fields remain at their default zero
- * values (disabled).
- */
-contract CalculatorConsumer is IReceiverTemplate {
-  // Struct to hold the data sent in a report from the workflow
-  struct CalculatorResult {
-    uint256 offchainValue;
-    int256 onchainValue;
-    uint256 finalResult;
-  }
-
-  // --- State Variables ---
-  CalculatorResult public latestResult;
-  uint256 public resultCount;
-  mapping(uint256 => CalculatorResult) public results;
-
-  // --- Events ---
-  event ResultUpdated(uint256 indexed resultId, uint256 finalResult);
-
-  /**
-   * @dev The constructor doesn't set any security checks.
-   * The IReceiverTemplate parent constructor will initialize all permission fields to zero (disabled).
-   */
-  constructor() {}
-
-  /**
-   * @notice Implements the core business logic for processing reports.
-   * @dev This is called automatically by IReceiverTemplate's onReport function after security checks.
-   */
-  function _processReport(bytes calldata report) internal override {
-    // Decode the report bytes into our CalculatorResult struct
-    CalculatorResult memory calculatorResult = abi.decode(report, (CalculatorResult));
-
-    // --- Core Logic ---
-    // Update contract state with the new result
-    resultCount++;
-    results[resultCount] = calculatorResult;
-    latestResult = calculatorResult;
-
-    emit ResultUpdated(resultCount, calculatorResult.finalResult);
-  }
-
-  // This function is a "dry-run" utility. It allows an offchain system to check
-  // if a prospective result is an outlier before submitting it for a real onchain update.
-  // It is also used to guide the binding generator to create a method that accepts the CalculatorResult struct.
-  function isResultAnomalous(CalculatorResult memory _prospectiveResult) public view returns (bool) {
-    // A result is not considered anomalous if it's the first one.
-    if (resultCount == 0) {
-      return false;
-    }
-
-    // Business logic: Define an anomaly as a new result that is more than double the previous result.
-    // This is just one example of a validation rule you could implement.
-    return _prospectiveResult.finalResult > (latestResult.finalResult * 2);
-  }
-}
-```
+
 
-The contract is already deployed for you on Sepolia at the following address: `0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`. You will use this address in your configuration file.
+The contract is already deployed for you on Sepolia at the following address: `0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`. You will use this address in your configuration file.
 
 ## Step 2: Generate the consumer contract binding
 
@@ -119,7 +53,7 @@ You need to create a binding for the consumer contract so your workflow can inte
 
    {/* prettier-ignore */}
    ```json
-    [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"received","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidAuthor","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"bytes32","name":"received","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"InvalidWorkflowId","type":"error"},{"inputs":[{"internalType":"bytes10","name":"received","type":"bytes10"},{"internalType":"bytes10","name":"expected","type":"bytes10"}],"name":"InvalidWorkflowName","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalResult","type":"uint256"}],"name":"ResultUpdated","type":"event"},{"inputs":[],"name":"expectedAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWorkflowId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWorkflowName","outputs":[{"internalType":"bytes10","name":"","type":"bytes10"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"internalType":"struct CalculatorConsumer.CalculatorResult","name":"_prospectiveResult","type":"tuple"}],"name":"isResultAnomalous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestResult","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"report","type":"bytes"}],"name":"onReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"results","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_author","type":"address"}],"name":"setExpectedAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"setExpectedWorkflowId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes10","name":"_name","type":"bytes10"}],"name":"setExpectedWorkflowName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setForwarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
+    [{"inputs":[{"internalType":"address","name":"_forwarderAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"received","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidAuthor","type":"error"},{"inputs":[],"name":"InvalidForwarderAddress","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"bytes32","name":"received","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"InvalidWorkflowId","type":"error"},{"inputs":[{"internalType":"bytes10","name":"received","type":"bytes10"},{"internalType":"bytes10","name":"expected","type":"bytes10"}],"name":"InvalidWorkflowName","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"WorkflowNameRequiresAuthorValidation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAuthor","type":"address"},{"indexed":true,"internalType":"address","name":"newAuthor","type":"address"}],"name":"ExpectedAuthorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"previousId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newId","type":"bytes32"}],"name":"ExpectedWorkflowIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes10","name":"previousName","type":"bytes10"},{"indexed":true,"internalType":"bytes10","name":"newName","type":"bytes10"}],"name":"ExpectedWorkflowNameUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousForwarder","type":"address"},{"indexed":true,"internalType":"address","name":"newForwarder","type":"address"}],"name":"ForwarderAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalResult","type":"uint256"}],"name":"ResultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"SecurityWarning","type":"event"},{"inputs":[],"name":"getExpectedAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWorkflowId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWorkflowName","outputs":[{"internalType":"bytes10","name":"","type":"bytes10"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getForwarderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"internalType":"struct CalculatorConsumer.CalculatorResult","name":"_prospectiveResult","type":"tuple"}],"name":"isResultAnomalous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestResult","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"report","type":"bytes"}],"name":"onReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"results","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_author","type":"address"}],"name":"setExpectedAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"setExpectedWorkflowId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setExpectedWorkflowName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setForwarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
     ```
 
 1. **Generate the bindings**: Run the binding generator to create Go bindings for all ABI files in your project. From your project root (`onchain-calculator/`), run:
@@ -143,7 +77,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`:
   "evms": [
     {
       "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4",
-      "calculatorConsumerAddress": "0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54",
+      "calculatorConsumerAddress": "0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb",
       "chainName": "ethereum-testnet-sepolia",
       "gasLimit": 500000
     }
@@ -183,7 +117,7 @@ go mod tidy
 
 
-```solidity
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol";
-
-/**
- * @title CalculatorConsumer (Testing Version)
- * @notice This contract receives reports from a CRE workflow and stores the results of a calculation onchain.
- * @dev This version uses IReceiverTemplate without configuring any security checks, making it compatible
- * with the mock Forwarder used during simulation. All permission fields remain at their default zero
- * values (disabled).
- */
-contract CalculatorConsumer is IReceiverTemplate {
-  // Struct to hold the data sent in a report from the workflow
-  struct CalculatorResult {
-    uint256 offchainValue;
-    int256 onchainValue;
-    uint256 finalResult;
-  }
-
-  // --- State Variables ---
-  CalculatorResult public latestResult;
-  uint256 public resultCount;
-  mapping(uint256 => CalculatorResult) public results;
-
-  // --- Events ---
-  event ResultUpdated(uint256 indexed resultId, uint256 finalResult);
-
-  /**
-   * @dev The constructor doesn't set any security checks.
-   * The IReceiverTemplate parent constructor will initialize all permission fields to zero (disabled).
-   */
-  constructor() {}
-
-  /**
-   * @notice Implements the core business logic for processing reports.
-   * @dev This is called automatically by IReceiverTemplate's onReport function after security checks.
-   */
-  function _processReport(bytes calldata report) internal override {
-    // Decode the report bytes into our CalculatorResult struct
-    CalculatorResult memory calculatorResult = abi.decode(report, (CalculatorResult));
-
-    // --- Core Logic ---
-    // Update contract state with the new result
-    resultCount++;
-    results[resultCount] = calculatorResult;
-    latestResult = calculatorResult;
-
-    emit ResultUpdated(resultCount, calculatorResult.finalResult);
-  }
-
-  // This function is a "dry-run" utility. It allows an offchain system to check
-  // if a prospective result is an outlier before submitting it for a real onchain update.
-  // It is also used to guide the binding generator to create a method that accepts the CalculatorResult struct.
-  function isResultAnomalous(CalculatorResult memory _prospectiveResult) public view returns (bool) {
-    // A result is not considered anomalous if it's the first one.
-    if (resultCount == 0) {
-      return false;
-    }
+
 
-    // Business logic: Define an anomaly as a new result that is more than double the previous result.
-    // This is just one example of a validation rule you could implement.
-    return _prospectiveResult.finalResult > (latestResult.finalResult * 2);
-  }
-}
-```
-
-The contract is already deployed for you on Sepolia at the following address: `0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`. You will use this address in your configuration file.
+The contract is already deployed for you on Sepolia at the following address: `0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`. You will use this address in your configuration file.
 
 ## Step 2: Update your workflow configuration
 
@@ -116,7 +50,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`:
   "evms": [
     {
       "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4",
-      "calculatorConsumerAddress": "0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54",
+      "calculatorConsumerAddress": "0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb",
       "chainName": "ethereum-testnet-sepolia",
       "gasLimit": "500000"
     }
@@ -184,7 +118,7 @@ These helpers are great for production code, but we use the explicit approach he
 
- + - + @@ -719,7 +765,15 @@ export const StreamsNetworkAddressesTable = ({ {network.network} - + - + @@ -861,204 +923,297 @@ const streamsCategoryMap = { }, } -const StreamsTr = ({ metadata, isMainnet }) => ( - - - + - -) + + {metadata.docs.shutdownDate && ( +
+
+ + Deprecating: + +
+ {metadata.docs.shutdownDate} +
+ )} + + + + ) +} export const MainnetTable = ({ network, @@ -1068,6 +1223,8 @@ export const MainnetTable = ({ showOnlyDEXFeeds, rwaSchemaFilter, streamCategoryFilter, + show24x5Feeds, + tradingHoursFilter, dataFeedType, ecosystem, selectedFeedCategories, @@ -1077,6 +1234,7 @@ export const MainnetTable = ({ currentPage, paginate, searchValue, + tokenizedEquityProvider, }: { network: ChainNetwork showExtraDetails: boolean @@ -1085,6 +1243,8 @@ export const MainnetTable = ({ showOnlyDEXFeeds: boolean rwaSchemaFilter?: "all" | "v8" | "v11" streamCategoryFilter?: "all" | "datalink" | "equities" | "forex" + show24x5Feeds?: boolean + tradingHoursFilter?: "all" | "regular" | "extended" | "overnight" dataFeedType: string ecosystem: string selectedFeedCategories: string[] @@ -1094,6 +1254,7 @@ export const MainnetTable = ({ currentPage: number paginate searchValue: string + tokenizedEquityProvider?: string }) => { if (!network.metadata) return null @@ -1110,122 +1271,89 @@ export const MainnetTable = ({ const isDefault = !isStreams && !isSmartData && !isUSGovernmentMacroeconomicData const isDeprecating = ecosystem === "deprecating" - const filteredMetadata = network.metadata - .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) - .filter((metadata) => { - // --- - // Categorization logic: - // 1. Try to get the risk category for this feed from Supabase (batchedCategoryData). - // - Uses contractAddress and networkIdentifier as lookup keys. - // - If found, use the DB value; if not, fall back to the default from metadata. - // 2. If the risk category is 'hidden', exclude this feed from the docs. - // --- - const contractAddress = metadata.contractAddress || metadata.proxyAddress - const networkIdentifier = getNetworkIdentifier(network) - let batchCategory = metadata.feedCategory - - if (contractAddress && batchedCategoryData?.size) { - const categoryResult = getFeedCategoryFromBatch( - batchedCategoryData, - contractAddress, - networkIdentifier, - metadata.feedCategory - ) - const finalCategory = categoryResult?.final ?? null - - if (finalCategory) { - batchCategory = finalCategory - } - } - - if (batchCategory === "hidden") return false - if (showOnlySVR && !metadata.secondaryProxyAddress) { - return false - } - - if (isDeprecating) return !!metadata.docs.shutdownDate - - if (dataFeedType === "streamsCrypto") { - const isValidStreamsFeed = - metadata.contractType === "verifier" && - (metadata.docs.feedType === "Crypto" || metadata.docs.feedType === "Crypto-DEX") - - if (showOnlyDEXFeeds) { - return isValidStreamsFeed && metadata.docs.feedType === "Crypto-DEX" - } - - return isValidStreamsFeed - } - if (dataFeedType === "streamsRwa") { - const isRwaFeed = - metadata.contractType === "verifier" && - (metadata.docs.feedType === "Equities" || - metadata.docs.feedType === "Forex" || - metadata.docs.feedType === "Datalink") - - if (!isRwaFeed) return false - - // Apply feed type filter - if (streamCategoryFilter === "datalink") { - if (metadata.docs.feedType !== "Datalink") return false - } else if (streamCategoryFilter === "equities") { - if (metadata.docs.feedType !== "Equities") return false - } else if (streamCategoryFilter === "forex") { - if (metadata.docs.feedType !== "Forex") return false - } + // Enrich metadata with final category (combining RDD and Supabase data) + // Priority: deprecating status from RDD > Supabase risk tier > RDD category fallback + const enrichedMetadata = network.metadata.map((metadata) => { + // Check for deprecating status from RDD first (has shutdown date) + if (metadata.docs?.shutdownDate) { + return { ...metadata, finalCategory: "deprecating" } + } - // Apply schema filter - if (rwaSchemaFilter === "v8") { - return metadata.docs?.schema === "v8" || !metadata.docs?.schema - } - if (rwaSchemaFilter === "v11") { - return metadata.docs?.schema === "v11" - } + // Otherwise, get risk category from Supabase (or fall back to RDD) + const contractAddress = metadata.contractAddress || metadata.proxyAddress + const networkIdentifier = getNetworkIdentifier(network) + let finalCategory = metadata.feedCategory + + if (contractAddress && batchedCategoryData?.size) { + const categoryResult = getFeedCategoryFromBatch( + batchedCategoryData, + contractAddress, + networkIdentifier, + metadata.feedCategory + ) + const supabaseCategory = categoryResult?.final ?? null - return true + if (supabaseCategory) { + finalCategory = supabaseCategory } + } - if (dataFeedType === "streamsNav") { - return metadata.contractType === "verifier" && metadata.docs.feedType === "Net Asset Value" - } + return { ...metadata, finalCategory } + }) - if (dataFeedType === "streamsExRate") { - return metadata.contractType === "verifier" && metadata.docs?.productTypeCode === "ExRate" + const filteredMetadata = enrichedMetadata + .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) + .filter((metadata) => { + if (showOnlySVR && !metadata.secondaryProxyAddress) { + return false } - if (dataFeedType === "streamsBacked") { - return metadata.contractType === "verifier" && metadata.docs.feedType === "Tokenized Equities" + if (isDeprecating) { + // Only show feeds (not streams) with shutdown dates + return !!metadata.docs.shutdownDate && !(metadata.contractType === "verifier" && metadata.feedId) } - if (isSmartData) { - if (showOnlyMVRFeeds) { - return !metadata.docs?.hidden && metadata.docs?.isMVR === true && metadata.docs?.deliveryChannelCode !== "DS" + // Use shared visibility logic with filters + return isFeedVisible(metadata, dataFeedType as any, ecosystem, { + showOnlyDEXFeeds, + streamCategoryFilter, + rwaSchemaFilter, + showOnlyMVRFeeds, + tokenizedEquityProvider, + }) + }) + .filter((metadata) => { + // When 24/5 checkbox is checked, ONLY show 24/5 feeds + if (show24x5Feeds) { + const schemaVersion = getSchemaVersion(metadata) + const feedType = metadata.feedType || metadata.docs?.feedType + + // 24/5 feeds are Equities/Forex with v11 schema + const is24x5Feed = (feedType === "Equities" || feedType === "Forex") && schemaVersion === "v11" + + if (!is24x5Feed) return false + + // Apply trading hours sub-filter + if (tradingHoursFilter && tradingHoursFilter !== "all") { + const assetSubClass = (metadata.docs as any)?.assetSubClass + const clicProductName = (metadata.docs as any)?.clicProductName || "" + + // Check both assetSubClass and clicProductName for hours identification + const isRegularHours = + assetSubClass === "Regular Hours" || + (clicProductName.includes("RegularHours") && + !clicProductName.includes("ExtendedHours") && + !clicProductName.includes("OvernightHours")) + const isExtendedHours = assetSubClass === "Extended Hours" || clicProductName.includes("ExtendedHours") + const isOvernightHours = assetSubClass === "Overnight Hours" || clicProductName.includes("OvernightHours") + + if (tradingHoursFilter === "regular" && !isRegularHours) return false + if (tradingHoursFilter === "extended" && !isExtendedHours) return false + if (tradingHoursFilter === "overnight" && !isOvernightHours) return false } - - return ( - !metadata.docs?.hidden && - metadata.docs?.deliveryChannelCode !== "DS" && - (metadata.docs?.productType === "Proof of Reserve" || - metadata.docs?.productType === "NAVLink" || - metadata.docs?.productType === "SmartAUM" || - metadata.docs?.isMVR === true) - ) } - if (isUSGovernmentMacroeconomicData) { - const isMacro = metadata.docs?.productTypeCode === "RefMacro" - return isMacro - } - - // Exclude MVR feeds from default view - return ( - !metadata.docs.porType && - metadata.contractType !== "verifier" && - metadata.docs.productType !== "Proof of Reserve" && - metadata.docs.productType !== "NAVLink" && - metadata.docs.productType !== "SmartAUM" && - metadata.docs?.productTypeCode !== "RefMacro" - ) + return true }) .filter((metadata) => { if (isSmartData) { @@ -1241,9 +1369,12 @@ export const MainnetTable = ({ return included } + // Filter by final category (Supabase risk tier takes precedence over RDD) + // Normalize spaces for comparison (e.g., "very high" → "veryhigh") + const normalizedFinalCategory = metadata.finalCategory?.toLowerCase().replace(/\s+/g, "") return ( selectedFeedCategories.length === 0 || - selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.feedCategory?.toLowerCase()) + selectedFeedCategories.map((cat) => cat.toLowerCase().replace(/\s+/g, "")).includes(normalizedFinalCategory) ) }) .filter( @@ -1368,6 +1499,9 @@ export const TestnetTable = ({ showOnlyDEXFeeds, rwaSchemaFilter, streamCategoryFilter, + show24x5Feeds, + tradingHoursFilter, + tokenizedEquityProvider, }: { network: ChainNetwork showExtraDetails: boolean @@ -1383,6 +1517,9 @@ export const TestnetTable = ({ showOnlyDEXFeeds?: boolean rwaSchemaFilter?: "all" | "v8" | "v11" streamCategoryFilter?: "all" | "datalink" | "equities" | "forex" + show24x5Feeds?: boolean + tradingHoursFilter?: "all" | "regular" | "extended" | "overnight" + tokenizedEquityProvider?: string }) => { if (!network.metadata) return null @@ -1399,127 +1536,80 @@ export const TestnetTable = ({ const isUSGovernmentMacroeconomicData = dataFeedType === "usGovernmentMacroeconomicData" const isDefault = !isSmartData && !isRates && !isStreams && !isUSGovernmentMacroeconomicData - const filteredMetadata = network.metadata - .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) - .filter((metadata) => { - // --- - // Categorization logic: - // 1. Try to get the risk category for this feed from Supabase (batchedCategoryData). - // - Uses contractAddress and networkIdentifier as lookup keys. - // - If found, use the DB value; if not, fall back to the default from metadata. - // 2. If the risk category is 'hidden', exclude this feed from the docs. - // --- - const contractAddress = metadata.contractAddress || metadata.proxyAddress - const networkIdentifier = getNetworkIdentifier(network) - let batchCategory = metadata.feedCategory - - if (contractAddress && batchedCategoryData?.size) { - const categoryResult = getFeedCategoryFromBatch( - batchedCategoryData, - contractAddress, - networkIdentifier, - metadata.feedCategory - ) - const finalCategory = categoryResult?.final ?? null - - if (finalCategory) { - batchCategory = finalCategory - } - } - - if (batchCategory === "hidden") return false - if (isStreams) { - if (dataFeedType === "streamsCrypto") { - const isValidStreamsFeed = - metadata.contractType === "verifier" && - (metadata.feedType === "Crypto" || metadata.feedType === "Crypto-DEX") - - if (showOnlyDEXFeeds) { - return isValidStreamsFeed && metadata.feedType === "Crypto-DEX" - } - - return isValidStreamsFeed - } - - if (dataFeedType === "streamsRwa") { - const isRwaFeed = - metadata.contractType === "verifier" && - (metadata.docs.feedType === "Equities" || - metadata.docs.feedType === "Forex" || - metadata.docs.feedType === "Datalink") - - if (!isRwaFeed) return false - - // Apply feed type filter - if (streamCategoryFilter === "datalink") { - if (metadata.docs.feedType !== "Datalink") return false - } else if (streamCategoryFilter === "equities") { - if (metadata.docs.feedType !== "Equities") return false - } else if (streamCategoryFilter === "forex") { - if (metadata.docs.feedType !== "Forex") return false - } - - // Apply schema filter - if (rwaSchemaFilter === "v8") { - return metadata.docs?.schema === "v8" || !metadata.docs?.schema - } - if (rwaSchemaFilter === "v11") { - return metadata.docs?.schema === "v11" - } - - return true - } - - if (dataFeedType === "streamsExRate") { - return metadata.contractType === "verifier" && metadata.docs?.productTypeCode === "ExRate" - } - - if (dataFeedType === "streamsNav") { - return metadata.contractType === "verifier" && metadata.docs.feedType === "Net Asset Value" - } - - if (dataFeedType === "streamsBacked") { - return metadata.contractType === "verifier" && metadata.docs.feedType === "Tokenized Equities" - } - - // If we're in streams mode but didn't match any specific stream type, exclude this feed - return false - } + // Enrich metadata with final category (combining RDD and Supabase data) + // Priority: deprecating status from RDD > Supabase risk tier > RDD category fallback + const enrichedMetadata = network.metadata.map((metadata) => { + // Check for deprecating status from RDD first (has shutdown date) + if (metadata.docs?.shutdownDate) { + return { ...metadata, finalCategory: "deprecating" } + } - if (isSmartData) { - if (showOnlyMVRFeeds) { - return !metadata.docs?.hidden && metadata.docs?.isMVR === true && metadata.docs?.deliveryChannelCode !== "DS" - } + // Otherwise, get risk category from Supabase (or fall back to RDD) + const contractAddress = metadata.contractAddress || metadata.proxyAddress + const networkIdentifier = getNetworkIdentifier(network) + let finalCategory = metadata.feedCategory + + if (contractAddress && batchedCategoryData?.size) { + const categoryResult = getFeedCategoryFromBatch( + batchedCategoryData, + contractAddress, + networkIdentifier, + metadata.feedCategory + ) + const supabaseCategory = categoryResult?.final ?? null - // Otherwise, include all SmartData feeds (MVR, PoR, NAVLink, SmartAUM) - return ( - !metadata.docs?.hidden && - metadata.docs?.deliveryChannelCode !== "DS" && - (metadata.docs?.productType === "Proof of Reserve" || - metadata.docs?.productType === "NAVLink" || - metadata.docs?.productType === "SmartAUM" || - metadata.docs?.isMVR === true) - ) + if (supabaseCategory) { + finalCategory = supabaseCategory } + } - if (isRates) - return !!(metadata.docs.productType === "Rates" || metadata.docs.productSubType === "Realized Volatility") + return { ...metadata, finalCategory } + }) - if (isUSGovernmentMacroeconomicData) { - return metadata.docs?.productTypeCode === "RefMacro" + const filteredMetadata = enrichedMetadata + .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) + .filter((metadata) => { + // Use shared visibility logic with filters + return isFeedVisible(metadata, dataFeedType as any, undefined, { + showOnlyDEXFeeds, + streamCategoryFilter, + rwaSchemaFilter, + showOnlyMVRFeeds, + tokenizedEquityProvider, + }) + }) + .filter((metadata) => { + // When 24/5 checkbox is checked, ONLY show 24/5 feeds + if (show24x5Feeds) { + const schemaVersion = getSchemaVersion(metadata) + const feedType = metadata.feedType || metadata.docs?.feedType + + // 24/5 feeds are Equities/Forex with v11 schema + const is24x5Feed = (feedType === "Equities" || feedType === "Forex") && schemaVersion === "v11" + + if (!is24x5Feed) return false + + // Apply trading hours sub-filter + if (tradingHoursFilter && tradingHoursFilter !== "all") { + const assetSubClass = (metadata.docs as any)?.assetSubClass + const clicProductName = (metadata.docs as any)?.clicProductName || "" + + // Check both assetSubClass and clicProductName for hours identification + const isRegularHours = + assetSubClass === "Regular Hours" || + (clicProductName.includes("RegularHours") && + !clicProductName.includes("ExtendedHours") && + !clicProductName.includes("OvernightHours")) + const isExtendedHours = assetSubClass === "Extended Hours" || clicProductName.includes("ExtendedHours") + const isOvernightHours = assetSubClass === "Overnight Hours" || clicProductName.includes("OvernightHours") + + if (tradingHoursFilter === "regular" && !isRegularHours) return false + if (tradingHoursFilter === "extended" && !isExtendedHours) return false + if (tradingHoursFilter === "overnight" && !isOvernightHours) return false + } } - // Exclude MVR feeds from default view - return ( - !metadata.feedId && - !metadata.docs.porType && - metadata.docs.productType !== "Rates" && - metadata.docs.productSubType !== "Realized Volatility" && - metadata.docs.productType !== "Proof of Reserve" && - metadata.docs.productType !== "NAVLink" && - metadata.docs.productType !== "SmartAUM" && - metadata.docs?.productTypeCode !== "RefMacro" - ) + return true }) .filter((metadata) => { if (isSmartData) { @@ -1534,9 +1624,12 @@ export const TestnetTable = ({ return included } + // Filter by final category (Supabase risk tier takes precedence over RDD) + // Normalize spaces for comparison (e.g., "very high" → "veryhigh") + const normalizedFinalCategory = metadata.finalCategory?.toLowerCase().replace(/\s+/g, "") return ( selectedFeedCategories.length === 0 || - selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.feedCategory?.toLowerCase()) + selectedFeedCategories.map((cat) => cat.toLowerCase().replace(/\s+/g, "")).includes(normalizedFinalCategory) ) }) .filter( diff --git a/src/features/feeds/components/urlStateHelpers.ts b/src/features/feeds/components/urlStateHelpers.ts new file mode 100644 index 00000000000..4203e37b79b --- /dev/null +++ b/src/features/feeds/components/urlStateHelpers.ts @@ -0,0 +1,86 @@ +/** + * URL state management helpers for feed tables + * Clean up empty and default values from URLs + */ + +/** + * Update URL with only non-empty, non-default values + * Removes clutter like search=&page=1 + */ +export function updateUrlClean(updates: Record) { + if (typeof window === "undefined") return + + const params = new URLSearchParams(window.location.search) + + // Apply updates + Object.entries(updates).forEach(([key, value]) => { + // Remove param if undefined, empty string, or default value + if ( + value === undefined || + value === "" || + (key === "page" && value === 1) || + (key === "page" && value === "1") || + (key === "testnetPage" && value === 1) || + (key === "testnetPage" && value === "1") || + (key.includes("Schema") && value === "all") || + (key.includes("FeedType") && value === "all") || + value === false + ) { + params.delete(key) + } else { + params.set(key, String(value)) + } + }) + + // Build URL with params in logical order: network → networkType → filters → pagination + const orderedParams = new URLSearchParams() + const order = [ + "network", + "networkType", + "search", + "testnetSearch", + "categories", + "showSvr", + "showDetails", + "feedType", + "testnetFeedType", + "schema", + "testnetSchema", + "page", + "testnetPage", + ] + + order.forEach((key) => { + if (params.has(key)) { + const values = params.getAll(key) + values.forEach((v) => orderedParams.append(key, v)) + } + }) + + const queryString = orderedParams.toString() + const newUrl = window.location.pathname + (queryString ? "?" + queryString : "") + window.location.hash + window.history.replaceState({ path: newUrl }, "", newUrl) +} + +/** + * Clear all filter-related params, optionally keeping network selection + */ +export function clearFilters(keepNetwork = true) { + if (typeof window === "undefined") return + + const params = new URLSearchParams(window.location.search) + const network = params.get("network") + const networkType = params.get("networkType") + + // Start fresh + const newParams = new URLSearchParams() + + if (keepNetwork) { + if (network) newParams.set("network", network) + if (networkType && networkType !== "mainnet") newParams.set("networkType", networkType) + } + + const queryString = newParams.toString() + const newUrl = window.location.pathname + (queryString ? "?" + queryString : "") + window.location.hash + window.history.replaceState({ path: newUrl }, "", newUrl) +} diff --git a/src/features/feeds/components/useCleanUrlParams.ts b/src/features/feeds/components/useCleanUrlParams.ts new file mode 100644 index 00000000000..b85aa7200e0 --- /dev/null +++ b/src/features/feeds/components/useCleanUrlParams.ts @@ -0,0 +1,184 @@ +/** + * Clean URL parameter management for feed tables + * + * Philosophy: + * - Only add params when they differ from defaults + * - Keep URL minimal and human-readable + * - Order params logically: network → type → filters → pagination + * - Clear related params when context changes (e.g., switching networks) + */ + +import { useCallback } from "preact/hooks" + +export type FeedUrlParams = { + // Network selection + network?: string + networkType?: "mainnet" | "testnet" + + // Search filters + search?: string + testnetSearch?: string + + // Category filters + categories?: string[] + + // Feature flags + showSvr?: boolean + showDetails?: boolean + + // Pagination + page?: number + testnetPage?: number + + // Streams-specific filters + feedType?: string + testnetFeedType?: string + schema?: string + testnetSchema?: string +} + +const DEFAULT_VALUES: Required = { + network: "", + networkType: "mainnet", + search: "", + testnetSearch: "", + categories: [], + showSvr: false, + showDetails: false, + page: 1, + testnetPage: 1, + feedType: "all", + testnetFeedType: "all", + schema: "all", + testnetSchema: "all", +} + +/** + * Build a clean URL with only non-default parameters + */ +function buildCleanUrl(params: Partial, pathname: string, hash = ""): string { + const urlParams = new URLSearchParams() + + // Add params in logical order (network first, then filters, then pagination) + const orderedKeys: (keyof FeedUrlParams)[] = [ + "network", + "networkType", + "search", + "testnetSearch", + "categories", + "showSvr", + "showDetails", + "feedType", + "testnetFeedType", + "schema", + "testnetSchema", + "page", + "testnetPage", + ] + + orderedKeys.forEach((key) => { + const value = params[key] + const defaultValue = DEFAULT_VALUES[key] + + // Skip if value is undefined or matches default + if (value === undefined) return + + // Handle arrays + if (Array.isArray(value)) { + if (value.length === 0) return // Skip empty arrays + value.forEach((v) => urlParams.append(key, v)) + return + } + + // Handle booleans + if (typeof value === "boolean") { + if (!value) return // Only add true values + urlParams.set(key, "true") + return + } + + // Handle strings and numbers + const stringValue = String(value) + const defaultStringValue = String(defaultValue) + + if (stringValue !== defaultStringValue && stringValue !== "") { + urlParams.set(key, stringValue) + } + }) + + const queryString = urlParams.toString() + return pathname + (queryString ? "?" + queryString : "") + hash +} + +/** + * Parse current URL params into a typed object + */ +function parseUrlParams(initialNetwork?: string): FeedUrlParams { + if (typeof window === "undefined") { + return { network: initialNetwork } + } + + const urlParams = new URLSearchParams(window.location.search) + + return { + network: urlParams.get("network") || undefined, + networkType: (urlParams.get("networkType") as "mainnet" | "testnet") || undefined, + search: urlParams.get("search") || undefined, + testnetSearch: urlParams.get("testnetSearch") || undefined, + categories: urlParams.getAll("categories").filter(Boolean), + showSvr: urlParams.get("showSvr") === "true" || undefined, + showDetails: urlParams.get("showDetails") === "true" || undefined, + page: urlParams.get("page") ? parseInt(urlParams.get("page") || "1") : undefined, + testnetPage: urlParams.get("testnetPage") ? parseInt(urlParams.get("testnetPage") || "1") : undefined, + feedType: urlParams.get("feedType") || undefined, + testnetFeedType: urlParams.get("testnetFeedType") || undefined, + schema: urlParams.get("schema") || undefined, + testnetSchema: urlParams.get("testnetSchema") || undefined, + } +} + +export function useCleanUrlParams(initialNetwork: string) { + const updateUrl = useCallback( + (updates: Partial, clearRelated = false) => { + if (typeof window === "undefined") return + + const current = parseUrlParams(initialNetwork) + let newParams: Partial + + if (clearRelated) { + // When clearing related params, start fresh with only the updates + newParams = { ...updates } + } else { + // Merge with existing params + newParams = { ...current, ...updates } + } + + const newUrl = buildCleanUrl(newParams, window.location.pathname, window.location.hash) + window.history.replaceState({ path: newUrl }, "", newUrl) + }, + [initialNetwork] + ) + + const getCurrentParams = useCallback(() => { + return parseUrlParams(initialNetwork) + }, [initialNetwork]) + + const clearAllFilters = useCallback( + (keepNetwork = true) => { + const newParams: Partial = {} + if (keepNetwork) { + const current = parseUrlParams(initialNetwork) + if (current.network) newParams.network = current.network + if (current.networkType) newParams.networkType = current.networkType + } + updateUrl(newParams, true) + }, + [updateUrl, initialNetwork] + ) + + return { + updateUrl, + getCurrentParams, + clearAllFilters, + } +} diff --git a/src/features/feeds/data/StreamsNetworksData.ts b/src/features/feeds/data/StreamsNetworksData.ts index 37ed9544dfe..841810082b3 100644 --- a/src/features/feeds/data/StreamsNetworksData.ts +++ b/src/features/feeds/data/StreamsNetworksData.ts @@ -4,6 +4,7 @@ export type NetworkDetails = { accessController?: string explorerUrl: string label: string + note?: string } export type NetworkData = { @@ -283,12 +284,12 @@ export const StreamsNetworksData: NetworkData[] = [ mainnet: { label: "HyperEVM Mainnet", verifierProxy: "0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB", - explorerUrl: "https://hyperliquid.cloud.blockscout.com/address/%s", + explorerUrl: "https://hyperevmscan.io/address/address/%s", }, testnet: { label: "HyperEVM Testnet", verifierProxy: "0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB", - explorerUrl: "https://evm.hyperstats.xyz/address/%s", + explorerUrl: "https://testnet.purrsec.com/address/%s", }, }, { @@ -391,10 +392,15 @@ export const StreamsNetworksData: NetworkData[] = [ network: "MegaETH", logoUrl: "/assets/chains/megaeth.svg", networkStatus: "https://uptime.megaeth.com", + mainnet: { + label: "MegaETH Mainnet", + verifierProxy: "0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB", + explorerUrl: "https://megaeth.blockscout.com/address/%s", + }, testnet: { label: "MegaETH Testnet", - verifierProxy: "0xfBFff08fE4169853F7B1b5Ac67eC10dc8806801d", - explorerUrl: "https://www.megaexplorer.xyz/address/%s", + verifierProxy: "0xa33c1F0561eECe58ee7b7349D5BE018dd94EC9B6", + explorerUrl: "https://megaeth-testnet-v2.blockscout.com/address/%s", }, }, { @@ -454,6 +460,20 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://sepolia-optimism.etherscan.io/address/%s", }, }, + { + network: "Pharos", + logoUrl: "/assets/chains/pharos.svg", + mainnet: { + label: "Pharos Mainnet (Private)", + verifierProxy: "0xa094978891512268f4a4a4641B8da1A2a3E3BEB7", + explorerUrl: "https://pharos.socialscan.io/address/%s", + }, + testnet: { + label: "Pharos Atlantic Testnet", + verifierProxy: "0x72790f9eb82db492a7ddb6d2af22a270dcc3db64", + explorerUrl: "https://atlantic.pharosscan.xyz/address/%s", + }, + }, { network: "Polygon", logoUrl: "/assets/chains/polygon.svg", diff --git a/src/features/feeds/utils/feedVisibility.ts b/src/features/feeds/utils/feedVisibility.ts new file mode 100644 index 00000000000..2eaa09556b8 --- /dev/null +++ b/src/features/feeds/utils/feedVisibility.ts @@ -0,0 +1,183 @@ +import { DataFeedType } from "../components/FeedList.tsx" + +/** + * Helper function to extract schema version from feed metadata + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function getSchemaVersion(feed: any): string | undefined { + // First try to get from docs.schema + if (feed.docs?.schema) { + return feed.docs.schema + } + + // Fallback: parse from clicProductName + const clicProductName = feed.docs?.clicProductName + if (clicProductName) { + const match = clicProductName.match(/-0(\d{2})$/) + if (match) { + const version = match[1] + if (version === "04" || version === "08") return "v8" + if (version === "11") return "v11" + } + } + + return undefined +} + +/** + * Determines if a feed should be visible based on: + * - Hidden flags (feedCategory === "hidden" or docs.hidden) + * - Data feed type filtering (streams, smartdata, rates, etc.) + * - Ecosystem filtering (deprecating) + * + * This logic is shared between table filtering and network availability checks. + */ +export interface FeedVisibilityOptions { + showOnlyDEXFeeds?: boolean + streamCategoryFilter?: string + rwaSchemaFilter?: string + showOnlyMVRFeeds?: boolean + tokenizedEquityProvider?: string // Filter tokenized equity feeds by provider (e.g., "ondo") +} + +/** + * Determines if a feed should be visible based on: + * - Hidden flags (feedCategory === "hidden" or docs.hidden) + * - Data feed type filtering (streams, smartdata, rates, etc.) + * - Ecosystem filtering (deprecating) + * - Optional filters (DEX only, MVR only, schema version, etc.) + * + * This logic is shared between table filtering and network availability checks. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function isFeedVisible( + feed: any, + dataFeedType: DataFeedType, + ecosystem = "", + options: FeedVisibilityOptions = {} +): boolean { + // =========================================================================== + // 1. Universal Exclusions + // =========================================================================== + // Tokenized equity feeds are allowed to bypass the hidden flag since they are + // marked hidden in the general feed list but should show on their dedicated page + const isTokenizedEquity = dataFeedType === "tokenizedEquity" + if (feed.docs?.hidden && !isTokenizedEquity) return false + + const isDeprecating = ecosystem === "deprecating" + const isStreams = + dataFeedType === "streamsCrypto" || + dataFeedType === "streamsRwa" || + dataFeedType === "streamsNav" || + dataFeedType === "streamsExRate" || + dataFeedType === "streamsBacked" + const isSmartData = dataFeedType === "smartdata" + const isRates = dataFeedType === "rates" + const isUSGovernmentMacroeconomicData = dataFeedType === "usGovernmentMacroeconomicData" + + // =========================================================================== + // 2. Ecosystem-Specific Logic + // =========================================================================== + // If we are in the "deprecating" ecosystem view, ONLY show deprecating feeds. + if (isDeprecating && feed.feedCategory !== "deprecating") return false + + let isVisible = false + + // =========================================================================== + // 3. Data Feed Type Logic (Base Visibility) + // =========================================================================== + // Determine if the feed belongs to the requested category (Streams, SmartData, etc.) + + if (isStreams) { + // Streams feeds must be verified contracts + if (feed.contractType !== "verifier") return false + + if (dataFeedType === "streamsCrypto") { + isVisible = ["Crypto", "Crypto-DEX"].includes(feed.docs?.feedType) + } else if (dataFeedType === "streamsRwa") { + isVisible = ["Equities", "Forex", "Datalink"].includes(feed.docs?.feedType) + } else if (dataFeedType === "streamsNav") { + isVisible = feed.docs?.feedType === "Net Asset Value" + } else if (dataFeedType === "streamsExRate") { + isVisible = feed.docs?.productTypeCode === "ExRate" + } else if (dataFeedType === "streamsBacked") { + isVisible = feed.docs?.feedType === "Tokenized Equities" + } + } else if (isSmartData) { + // SmartData feeds (excluding DS delivery channel) + if (feed.docs?.deliveryChannelCode === "DS") isVisible = false + else + isVisible = + feed.docs?.isMVR === true || + feed.docs?.productType === "Proof of Reserve" || + feed.docs?.productType === "NAVLink" || + feed.docs?.productType === "SmartAUM" + } else if (isUSGovernmentMacroeconomicData) { + isVisible = feed.docs?.productTypeCode === "RefMacro" + } else if (isRates) { + isVisible = feed.docs?.productType === "Rates" || feed.docs?.productSubType === "Realized Volatility" + } else if (isTokenizedEquity) { + // Tokenized equity feeds (Ondo and other providers) + // Filter by assetClass "Equities" for Data Feeds (not Streams verifier contracts) + isVisible = feed.docs?.assetClass === "Equities" && feed.contractType !== "verifier" + } else { + // Default data feeds (Standard Price Feeds) + // Exclude all special types to leave only the standard feeds + isVisible = + !feed.docs?.porType && + feed.contractType !== "verifier" && + feed.docs?.productType !== "Proof of Reserve" && + feed.docs?.productType !== "NAVLink" && + feed.docs?.productType !== "SmartAUM" && + feed.docs?.productType !== "Rates" && + feed.docs?.productTypeCode !== "RefMacro" && + !feed.docs?.isMVR + } + + if (!isVisible) return false + + // =========================================================================== + // 4. Optional Filters (User Selection) + // =========================================================================== + // Apply additional filters selected by the user in the UI + + // Filter: Show only DEX feeds (Streams Crypto) + if (dataFeedType === "streamsCrypto" && options.showOnlyDEXFeeds) { + if (feed.docs?.feedType !== "Crypto-DEX") return false + } + + // Filter: RWA Category & Schema (Streams RWA) + if (dataFeedType === "streamsRwa") { + if (options.streamCategoryFilter === "datalink" && feed.docs.feedType !== "Datalink") return false + if (options.streamCategoryFilter === "equities" && feed.docs.feedType !== "Equities") return false + if (options.streamCategoryFilter === "forex" && feed.docs.feedType !== "Forex") return false + + const schemaVersion = getSchemaVersion(feed) + if (options.rwaSchemaFilter === "v8" && schemaVersion !== "v8") return false + if (options.rwaSchemaFilter === "v11" && schemaVersion !== "v11") return false + } + + // Filter: Show only MVR feeds (SmartData) + if (isSmartData && options.showOnlyMVRFeeds) { + if (feed.docs?.isMVR !== true) return false + } + + // Filter: Tokenized equity feeds by provider + if (isTokenizedEquity && options.tokenizedEquityProvider) { + const provider = options.tokenizedEquityProvider.toLowerCase() + + if (provider === "ondo") { + // Ondo tokenized equity feeds are identified by BOTH: + // 1. "Ondo" in assetName — distinguishes from other tokenized equity providers + // 2. productTypeCode "primaryTokenizedPrice" — distinguishes from ONDO token feeds + // Neither signal alone is sufficient: other providers may share the productTypeCode, + // and ONDO governance token feeds may contain "Ondo" in the asset name. + const assetName = (feed.assetName || "").toLowerCase() + const isOndoFeed = assetName.includes("ondo") && feed.docs?.productTypeCode === "primaryTokenizedPrice" + if (!isOndoFeed) return false + } + // Add more provider patterns here as needed + } + + return true +} diff --git a/src/features/landing/sections/ProductTabs.astro b/src/features/landing/sections/ProductTabs.astro new file mode 100644 index 00000000000..5e7a9b97b8d --- /dev/null +++ b/src/features/landing/sections/ProductTabs.astro @@ -0,0 +1,8 @@ +--- +import { Tabs } from "../components/Tabs" +import productTabs from "./ProductTabs.module.css" +--- + +
+ +
diff --git a/src/features/landing/sections/ProductTabs.module.css b/src/features/landing/sections/ProductTabs.module.css new file mode 100644 index 00000000000..8eed3c59bb1 --- /dev/null +++ b/src/features/landing/sections/ProductTabs.module.css @@ -0,0 +1,4 @@ +.container { + padding-top: var(--space-6x); + padding-bottom: 60px; +} diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index a059180af4f..d36c068fe2d 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -2569,6 +2569,51 @@ "source": "ccip/tools-resources/tools", "destination": "ccip/tools-resources/cli", "statusCode": 301 + }, + { + "source": "ccip/concepts/architecture/offchain/risk-management-network", + "destination": "ccip/concepts/architecture/offchain/overview", + "statusCode": 301 + }, + { + "source": "cre/guides/workflow/using-evm-client/supported-networks", + "destination": "cre/supported-networks", + "statusCode": 301 + }, + { + "source": "cre/guides/workflow/using-evm-client/supported-networks-go", + "destination": "cre/supported-networks-go", + "statusCode": 301 + }, + { + "source": "cre/guides/workflow/using-evm-client/supported-networks-ts", + "destination": "cre/supported-networks-ts", + "statusCode": 301 + }, + { + "source": "cre/concepts/time-in-cre", + "destination": "cre/guides/workflow/time-in-workflows", + "statusCode": 301 + }, + { + "source": "cre/concepts/time-in-cre-go", + "destination": "cre/guides/workflow/time-in-workflows-go", + "statusCode": 301 + }, + { + "source": "cre/concepts/time-in-cre-ts", + "destination": "cre/guides/workflow/time-in-workflows-ts", + "statusCode": 301 + }, + { + "source": "cre/getting-started/conclusion", + "destination": "cre/getting-started/before-you-build", + "statusCode": 301 + }, + { + "source": "cre/concepts/random-in-cre", + "destination": "cre/guides/workflow/using-randomness", + "statusCode": 301 } ] } diff --git a/src/features/streams/components/StreamsPage.astro b/src/features/streams/components/StreamsPage.astro new file mode 100644 index 00000000000..ad49e83bc6e --- /dev/null +++ b/src/features/streams/components/StreamsPage.astro @@ -0,0 +1,88 @@ +--- +import { FeedList, DataFeedType } from "@features/feeds/components/FeedList" +import { Aside } from "@components" +export type Props = { + initialNetwork?: string + ecosystem?: string + dataFeedType?: DataFeedType + allowNetworkTableExpansion?: boolean + defaultNetworkTableExpanded?: boolean +} +import { getServerSideChainMetadata } from "~/features/data/api/backend" +import { CHAINS, ALL_CHAINS } from "~/features/data/chains" + +const { initialNetwork, ecosystem, dataFeedType, allowNetworkTableExpansion, defaultNetworkTableExpanded } = Astro.props + +// Skip cache for deprecating page to always fetch fresh data +const isDeprecating = ecosystem === "deprecating" +const initialCache = await getServerSideChainMetadata([...CHAINS, ...ALL_CHAINS], isDeprecating) +--- + +{ + ecosystem === "deprecating" ? ( + <> +

+ Due to the rapid evolution of onchain ecosystems, Chainlink Data Streams feeds are regularly evaluated to ensure + that network usage, cost efficiency, and long-term sustainability remain aligned with the needs of the + ecosystem. +

+

+ As part of this ongoing evaluation, Data Streams feeds without publicly known active users may be scheduled for + deprecation. Doing so not only allows us to keep our Data Streams offering aligned with today's market + landscape, but it also helps to reduce unnecessary costs incurred by Chainlink node operators. This process is + part of a broader ecosystem initiative to maximize the adoption of the Chainlink network while optimizing for + cost-efficiency and long-term economic sustainability. +

+

+ For status updates regarding Data Streams and Data Feeds, users should join the official{" "} + Chainlink Discord and subscribe to the{" "} + data-feeds-user-notifications channel. +

+

+ A list of Data Streams feeds designated for deprecation, along with their corresponding shutdown date, can be + found below. +

+ + + ) : ( + <> +

+ To learn how to use Data Streams, see the{" "} + Fetch and decode reports tutorial. +

+

+ For LINK token and Faucet details, see the{" "} + LINK Token Contracts page. +

+ + + + ) +} + + diff --git a/src/features/tokenized-equity-feeds/common/TokenizedEquityFeeds.astro b/src/features/tokenized-equity-feeds/common/TokenizedEquityFeeds.astro new file mode 100644 index 00000000000..04a7d838aa5 --- /dev/null +++ b/src/features/tokenized-equity-feeds/common/TokenizedEquityFeeds.astro @@ -0,0 +1,10 @@ +--- +import TokenizedEquityNoteComponent from "./tokenizedEquityNote.mdx" + +export type Props = { + section?: "tokenizedEquityNote" +} +const { section } = Astro.props as Props +--- + +{section === "tokenizedEquityNote" && } diff --git a/src/features/tokenized-equity-feeds/common/tokenizedEquityNote.mdx b/src/features/tokenized-equity-feeds/common/tokenizedEquityNote.mdx new file mode 100644 index 00000000000..671554c158b --- /dev/null +++ b/src/features/tokenized-equity-feeds/common/tokenizedEquityNote.mdx @@ -0,0 +1,11 @@ +import { Aside } from "@components" + + diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 5b9732cd5a8..23e362a0c4e 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -9,8 +9,9 @@ import { ChainFamily, } from "@config/index.ts" import { CCIP_TOKEN_ICON_MAPPINGS } from "@config/data/ccip/tokenIconMappings.ts" +import { TOKEN_ICONS_PATH } from "@config/cdn.ts" import { toQuantity } from "ethers" -import referenceChains from "src/scripts/reference/chains.json" with { type: "json" } +import referenceChains from "~/scripts/reference/chains.json" with { type: "json" } interface AddEthereumChainParameter { chainId: string @@ -156,10 +157,11 @@ export const getTokenIconUrl = (token: string, size = 40) => { // Request appropriately sized images from CloudFront // For 40x40 display, request 80x80 for retina displays (2x) - return `https://d2f70xi62kby8n.cloudfront.net/tokens/${transformTokenName(iconIdentifier)}.webp?auto=compress%2Cformat&q=60&w=${size}&h=${size}&fit=cover` + return `${TOKEN_ICONS_PATH}/${transformTokenName(iconIdentifier)}.webp?auto=compress%2Cformat&q=60&w=${size}&h=${size}&fit=cover` } export const fallbackTokenIconUrl = "/assets/icons/generic-token.svg" +export const fallbackVerifierIconUrl = "/assets/icons/generic-verifier.svg" export const getChainId = (supportedChain: SupportedChain) => { const technology = chainToTechnology[supportedChain] @@ -276,6 +278,8 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "SONEIUM_MINATO" case "ethereum-testnet-holesky": return "ETHEREUM_HOLESKY" + case "ethereum-testnet-hoodi": + return "ETHEREUM_HOODI" case "polkadot-mainnet-astar": return "ASTAR_MAINNET" case "polkadot-testnet-astar-shibuya": @@ -302,8 +306,10 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "SHIBARIUM_PUPPYNET" case "sonic-mainnet": return "SONIC_MAINNET" + case "sonic-testnet": + return "SONIC_TESTNET" case "sonic-testnet-blaze": - return "SONIC_BLAZE" + return "SONIC_TESTNET_BLAZE" case "bitcoin-mainnet-bob-1": return "BOB_MAINNET" case "bitcoin-testnet-sepolia-bob-1": @@ -402,6 +408,8 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "0G_MAINNET" case "megaeth-testnet": return "MEGAETH_TESTNET" + case "megaeth-mainnet": + return "MEGAETH_MAINNET" case "mind-testnet": return "MIND_NETWORK_TESTNET" case "mind-mainnet": @@ -514,6 +522,23 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "NEXON_HENESYS_MAINNET" case "pharos-atlantic-testnet": return "PHAROS_ATLANTIC_TESTNET" + case "morph-mainnet": + return "MORPH_MAINNET" + case "ethereum-testnet-hoodi-morph": + return "MORPH_HOODI_TESTNET" + case "jovay-mainnet": + return "JOVAY_MAINNET" + case "jovay-testnet": + return "JOVAY_TESTNET" + case "stable-mainnet": + return "STABLE_MAINNET" + case "tempo-testnet": + return "TEMPO_TESTNET" + case "arc-testnet": + return "ARC_NETWORK_TESTNET" + case "doge-os-chikyu-testnet": + case "dogeos-testnet-chikyu": + return "DOGE_OS_CHIKYU_TESTNET" default: throw Error(`Chain not found ${chainInRdd}`) } @@ -595,6 +620,8 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "ethereum-testnet-sepolia-soneium-1" case "ETHEREUM_HOLESKY": return "ethereum-testnet-holesky" + case "ETHEREUM_HOODI": + return "ethereum-testnet-hoodi" case "ASTAR_MAINNET": return "polkadot-mainnet-astar" case "ASTAR_SHIBUYA": @@ -621,7 +648,9 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "shibarium-testnet-puppynet" case "SONIC_MAINNET": return "sonic-mainnet" - case "SONIC_BLAZE": + case "SONIC_TESTNET": + return "sonic-testnet" + case "SONIC_TESTNET_BLAZE": return "sonic-testnet-blaze" case "BOB_MAINNET": return "bitcoin-mainnet-bob-1" @@ -717,6 +746,8 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "0g-mainnet" case "MEGAETH_TESTNET": return "megaeth-testnet" + case "MEGAETH_MAINNET": + return "megaeth-mainnet" case "MIND_NETWORK_TESTNET": return "mind-testnet" case "MIND_NETWORK_MAINNET": @@ -827,6 +858,22 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "nexon-mainnet-henesys" case "PHAROS_ATLANTIC_TESTNET": return "pharos-atlantic-testnet" + case "MORPH_MAINNET": + return "morph-mainnet" + case "MORPH_HOODI_TESTNET": + return "ethereum-testnet-hoodi-morph" + case "JOVAY_MAINNET": + return "jovay-mainnet" + case "JOVAY_TESTNET": + return "jovay-testnet" + case "STABLE_MAINNET": + return "stable-mainnet" + case "TEMPO_TESTNET": + return "tempo-testnet" + case "ARC_NETWORK_TESTNET": + return "arc-testnet" + case "DOGE_OS_CHIKYU_TESTNET": + return "dogeos-testnet-chikyu" default: throw Error(`Chain not found ${supportedChain}`) } diff --git a/src/features/utils/networkIcons.ts b/src/features/utils/networkIcons.ts index a16711288ad..2ab3ec73b4b 100644 --- a/src/features/utils/networkIcons.ts +++ b/src/features/utils/networkIcons.ts @@ -39,5 +39,5 @@ export const normalizeTechnologyName = (technology: string): string => { } // Default: convert to lowercase and replace underscores with hyphens - return technology.toLowerCase().replace(/_/g, "-") + return technology.toLowerCase().replace(/[_ ]/g, "-") } diff --git a/src/features/vrf/v2/components/CostTable.tsx b/src/features/vrf/v2/components/CostTable.tsx index 44debc53d9d..72ffd702f08 100644 --- a/src/features/vrf/v2/components/CostTable.tsx +++ b/src/features/vrf/v2/components/CostTable.tsx @@ -4,7 +4,7 @@ import "./costTable.css" import { useCallback, useEffect, useReducer } from "preact/hooks" import { parseUnits, formatUnits, parseEther } from "ethers" import button from "@chainlink/design-system/button.module.css" -import { commify } from "~/utils/index.js" +import { commify } from "~/utils/number.ts" interface Props { method: "vrfSubscription" | "vrfDirectFunding" diff --git a/src/hooks/useLaneTokens.ts b/src/hooks/useLaneTokens.ts new file mode 100644 index 00000000000..12fcdc3e808 --- /dev/null +++ b/src/hooks/useLaneTokens.ts @@ -0,0 +1,64 @@ +import { useMemo } from "react" +import { Environment, LaneFilter, Version } from "~/config/data/ccip/types.ts" +import { getTokenData } from "~/config/data/ccip/data.ts" +import { getTokenIconUrl } from "~/features/utils/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +export interface ProcessedToken { + id: string + data: ReturnType + logo: string + rateLimits: { + standard: { capacity: string; rate: string; isEnabled: boolean } | null + ftf: { capacity: string; rate: string; isEnabled: boolean } | null + } + isPaused: boolean +} + +interface UseLaneTokensParams { + tokens: string[] | undefined + environment: Environment + rateLimitsData: Record + inOutbound: LaneFilter + searchQuery: string +} + +export function useLaneTokens({ tokens, environment, rateLimitsData, inOutbound, searchQuery }: UseLaneTokensParams) { + const processedTokens = useMemo(() => { + if (!tokens) return [] + + const direction = inOutbound === LaneFilter.Outbound ? "out" : "in" + + return tokens + .filter((token) => token.toLowerCase().includes(searchQuery.toLowerCase())) + .map((token) => { + const data = getTokenData({ + environment, + version: Version.V1_2_0, + tokenId: token || "", + }) + + // Skip tokens with no data + if (!Object.keys(data).length) return null + + const logo = getTokenIconUrl(token) + const tokenRateLimits = rateLimitsData[token] + const allLimits = realtimeDataService.getAllRateLimitsForDirection(tokenRateLimits, direction) + const isPaused = allLimits.standard?.capacity === "0" + + return { + id: token, + data, + logo, + rateLimits: allLimits, + isPaused, + } + }) + .filter((token): token is ProcessedToken => token !== null) + }, [tokens, environment, rateLimitsData, inOutbound, searchQuery]) + + return { + tokens: processedTokens, + count: tokens?.length ?? 0, + } +} diff --git a/src/hooks/useMultiLaneRateLimits.ts b/src/hooks/useMultiLaneRateLimits.ts new file mode 100644 index 00000000000..2f0274e810f --- /dev/null +++ b/src/hooks/useMultiLaneRateLimits.ts @@ -0,0 +1,78 @@ +import { useState, useEffect } from "react" +import type { TokenRateLimits, Environment } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface LaneConfig { + source: string + destination: string +} + +interface UseMultiLaneRateLimitsResult { + rateLimitsMap: Record> + isLoading: boolean + error: Error | null +} + +/** + * Custom hook to fetch rate limits for multiple lanes + * Useful for components that need to display rate limits across multiple lanes + * @param lanes - Array of lane configurations with source and destination + * @param environment - Network environment (mainnet/testnet) + * @returns Map of rate limits keyed by lane (source-destination), loading state, and error state + */ +export function useMultiLaneRateLimits(lanes: LaneConfig[], environment: Environment): UseMultiLaneRateLimitsResult { + const [rateLimitsMap, setRateLimitsMap] = useState>>({}) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let isMounted = true + + const fetchAllRateLimits = async () => { + setIsLoading(true) + setError(null) + + try { + const newRateLimits: Record> = {} + + // Fetch all lanes in parallel + const promises = lanes.map(async ({ source, destination }) => { + const laneKey = `${source}-${destination}` + const response = await realtimeDataService.getLaneSupportedTokens(source, destination, environment) + + if (response?.data) { + newRateLimits[laneKey] = response.data + } + }) + + await Promise.all(promises) + + if (isMounted) { + setRateLimitsMap(newRateLimits) + } + } catch (err) { + if (isMounted) { + console.error("Error fetching multi-lane rate limits:", err) + setError(err instanceof Error ? err : new Error("Failed to fetch rate limits")) + setRateLimitsMap({}) + } + } finally { + if (isMounted) { + setIsLoading(false) + } + } + } + + if (lanes.length > 0) { + fetchAllRateLimits() + } else { + setIsLoading(false) + } + + return () => { + isMounted = false + } + }, [lanes, environment]) + + return { rateLimitsMap, isLoading, error } +} diff --git a/src/hooks/useQueryString.ts b/src/hooks/useQueryString.ts index 9cdabeb9c7d..115229cbdd7 100644 --- a/src/hooks/useQueryString.ts +++ b/src/hooks/useQueryString.ts @@ -15,12 +15,13 @@ export const setQueryStringValue = (searchParamKey: string, value: SearchParamVa } // Preserve the hash fragment if it exists const hashFragment = window.location.hash + const queryString = currentSearchParams.toString() const newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + - `?${currentSearchParams.toString()}` + + (queryString ? `?${queryString}` : "") + hashFragment window.history.replaceState({ path: newurl }, "", newurl) diff --git a/src/hooks/useTokenFinality.ts b/src/hooks/useTokenFinality.ts new file mode 100644 index 00000000000..5036a3848f0 --- /dev/null +++ b/src/hooks/useTokenFinality.ts @@ -0,0 +1,66 @@ +import { useState, useEffect } from "react" +import type { TokenFinalityData, Environment, OutputKeyType } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface UseTokenFinalityResult { + finalityData: Record + isLoading: boolean + error: Error | null +} + +/** + * Custom hook to fetch token finality data across all chains + * @param tokenCanonicalSymbol - Token canonical symbol (e.g., "BETS", "LINK") + * @param environment - Network environment (mainnet/testnet) + * @param outputKey - Format to use for displaying chain keys (optional) + * @returns Finality data for all chains, loading state, and error state + */ +export function useTokenFinality( + tokenCanonicalSymbol: string, + environment: Environment, + outputKey?: OutputKeyType +): UseTokenFinalityResult { + const [finalityData, setFinalityData] = useState>({}) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let isMounted = true + + const fetchFinalityData = async () => { + setIsLoading(true) + setError(null) + + try { + const result = await realtimeDataService.getTokenFinality(tokenCanonicalSymbol, environment, outputKey) + + if (isMounted) { + if (result?.data) { + setFinalityData(result.data) + } else { + console.warn("[useTokenFinality] No data received") + setFinalityData({}) + } + } + } catch (err) { + if (isMounted) { + console.error("Failed to fetch token finality data:", err) + setError(err instanceof Error ? err : new Error("Failed to fetch token finality")) + setFinalityData({}) + } + } finally { + if (isMounted) { + setIsLoading(false) + } + } + } + + fetchFinalityData() + + return () => { + isMounted = false + } + }, [tokenCanonicalSymbol, environment, outputKey]) + + return { finalityData, isLoading, error } +} diff --git a/src/hooks/useTokenRateLimits.ts b/src/hooks/useTokenRateLimits.ts new file mode 100644 index 00000000000..cbfd8ce04df --- /dev/null +++ b/src/hooks/useTokenRateLimits.ts @@ -0,0 +1,65 @@ +import { useState, useEffect } from "react" +import type { TokenRateLimits, Environment } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface UseTokenRateLimitsResult { + rateLimits: Record + isLoading: boolean + error: Error | null +} + +/** + * Custom hook to fetch token rate limits for a specific lane + * @param source - Source chain internal ID + * @param destination - Destination chain internal ID + * @param environment - Network environment (mainnet/testnet) + * @returns Rate limits data, loading state, and error state + */ +export function useTokenRateLimits( + source: string, + destination: string, + environment: Environment +): UseTokenRateLimitsResult { + const [rateLimits, setRateLimits] = useState>({}) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let isMounted = true + + const fetchRateLimits = async () => { + setIsLoading(true) + setError(null) + + try { + const response = await realtimeDataService.getLaneSupportedTokens(source, destination, environment) + + if (isMounted) { + if (response?.data) { + setRateLimits(response.data) + } else { + setRateLimits({}) + } + } + } catch (err) { + if (isMounted) { + console.error("Error fetching rate limits:", err) + setError(err instanceof Error ? err : new Error("Failed to fetch rate limits")) + setRateLimits({}) + } + } finally { + if (isMounted) { + setIsLoading(false) + } + } + } + + fetchRateLimits() + + return () => { + isMounted = false + } + }, [source, destination, environment]) + + return { rateLimits, isLoading, error } +} diff --git a/src/layouts/DocsLayout.astro b/src/layouts/DocsLayout.astro index 199dca3fcde..b877a0763c9 100644 --- a/src/layouts/DocsLayout.astro +++ b/src/layouts/DocsLayout.astro @@ -95,12 +95,7 @@ const howToSteps = initialHeadings {whatsNext && } diff --git a/src/lib/api/cacheHeaders.ts b/src/lib/api/cacheHeaders.ts new file mode 100644 index 00000000000..92312d1448a --- /dev/null +++ b/src/lib/api/cacheHeaders.ts @@ -0,0 +1,47 @@ +/** + * Shared cache header configurations for API endpoints + * + * Cache Strategy: + * - 5-minute CDN cache (s-max-age=300) + * - Stale-while-revalidate for graceful degradation + * - CDN-specific headers for Vercel optimization + * - No browser cache (CDN-only caching) + */ + +/** + * Standard cache headers for all API endpoints + * - CDN cache: 5 minutes + * - Serves stale content while revalidating in background + * - Optimized for Vercel CDN + */ +export const standardCacheHeaders = { + "Cache-Control": "s-max-age=300, stale-while-revalidate", + "CDN-Cache-Control": "max-age=300", + "Vercel-CDN-Cache-Control": "max-age=300", +} + +/** + * Cache headers for text/plain responses + * Used by: /api/page-markdown + */ +export const textPlainHeaders = { + "Content-Type": "text/plain; charset=utf-8", + ...standardCacheHeaders, +} + +/** + * Cache headers for application/json responses + * Used by: /api/ccip/v1/* endpoints + */ +export const jsonHeaders = { + "Content-Type": "application/json", + ...standardCacheHeaders, +} + +/** + * Common headers without caching directives + * For endpoints that need custom cache control + */ +export const commonHeaders = { + "Content-Type": "application/json", +} diff --git a/src/pages/api/ccip/faucet/adapters/index.ts b/src/lib/ccip/faucet/adapters/index.ts similarity index 83% rename from src/pages/api/ccip/faucet/adapters/index.ts rename to src/lib/ccip/faucet/adapters/index.ts index 1a27125ced8..ae1962dad49 100644 --- a/src/pages/api/ccip/faucet/adapters/index.ts +++ b/src/lib/ccip/faucet/adapters/index.ts @@ -1,5 +1,5 @@ import { ChainFamily } from "@config/types.ts" -import { FamilyAdapter } from "@api/ccip/types/faucet.ts" +import { FamilyAdapter } from "~/lib/ccip/types/faucet.ts" import { SvmAdapter } from "./svm.ts" export const prerender = false @@ -20,6 +20,6 @@ export class FaucetAdapterFactory { } // Re-export types and adapters -export type { FamilyAdapter } from "@api/ccip/types/faucet.ts" +export type { FamilyAdapter } from "~/lib/ccip/types/faucet.ts" export { SvmAdapter } from "./svm.ts" export { SvmDripAdapter } from "./svm-drip.ts" diff --git a/src/pages/api/ccip/faucet/adapters/svm-drip.ts b/src/lib/ccip/faucet/adapters/svm-drip.ts similarity index 94% rename from src/pages/api/ccip/faucet/adapters/svm-drip.ts rename to src/lib/ccip/faucet/adapters/svm-drip.ts index 4fc62dba32a..190bd4f6c83 100644 --- a/src/pages/api/ccip/faucet/adapters/svm-drip.ts +++ b/src/lib/ccip/faucet/adapters/svm-drip.ts @@ -2,9 +2,9 @@ import { randomUUID } from "node:crypto" import { createSolanaLogger } from "@lib/logging/index.js" import type { Logger } from "@lib/logging/index.js" import { ensureSolAddress } from "@lib/solana/index.js" -import { ChainConfigurationService } from "@api/ccip/services/chain-config.ts" -import { DripOrchestrator, type DripParams, type DripResult } from "@api/ccip/services/faucet/drip-orchestrator.ts" -import type { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import { ChainConfigurationService } from "~/lib/ccip/services-api/chain-config.ts" +import { DripOrchestrator, type DripParams, type DripResult } from "~/lib/ccip/services-api/faucet/drip-orchestrator.ts" +import type { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" export const prerender = false diff --git a/src/pages/api/ccip/faucet/adapters/svm.ts b/src/lib/ccip/faucet/adapters/svm.ts similarity index 99% rename from src/pages/api/ccip/faucet/adapters/svm.ts rename to src/lib/ccip/faucet/adapters/svm.ts index cf156985bf9..4b0fecd4848 100644 --- a/src/pages/api/ccip/faucet/adapters/svm.ts +++ b/src/lib/ccip/faucet/adapters/svm.ts @@ -1,4 +1,4 @@ -import { FamilyAdapter, VerifySignatureArgs, FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import { FamilyAdapter, VerifySignatureArgs, FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" import { ensureSolAddress } from "@lib/solana/core/address/validator.ts" import { SolanaSignatureService } from "@lib/solana/domain/services/signature-verification.ts" import { logger } from "@lib/logging/index.js" diff --git a/src/pages/api/ccip/faucet/chain-resolver.ts b/src/lib/ccip/faucet/chain-resolver.ts similarity index 96% rename from src/pages/api/ccip/faucet/chain-resolver.ts rename to src/lib/ccip/faucet/chain-resolver.ts index 88a6f81c189..a8d5d0f7798 100644 --- a/src/pages/api/ccip/faucet/chain-resolver.ts +++ b/src/lib/ccip/faucet/chain-resolver.ts @@ -1,7 +1,7 @@ import { getSelectorEntry } from "@config/data/ccip/selectors.ts" -import { resolveChainOrThrow } from "@api/ccip/utils.ts" +import { resolveChainOrThrow } from "~/lib/ccip/utils.ts" import { getChainTypeAndFamily, getChainId, directoryToSupportedChain } from "@features/utils/index.ts" -import { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" import { getFaucetAddress, getSolanaDevnetConfig } from "@lib/core/config/index.ts" import { BNM_MINT_ADDRESSES } from "@lib/solana/core/constants/token-resolver.ts" diff --git a/src/pages/api/ccip/faucet/codec/index.ts b/src/lib/ccip/faucet/codec/index.ts similarity index 100% rename from src/pages/api/ccip/faucet/codec/index.ts rename to src/lib/ccip/faucet/codec/index.ts diff --git a/src/pages/api/ccip/faucet/config.ts b/src/lib/ccip/faucet/config.ts similarity index 100% rename from src/pages/api/ccip/faucet/config.ts rename to src/lib/ccip/faucet/config.ts diff --git a/src/pages/api/ccip/services/chain-config.ts b/src/lib/ccip/services-api/chain-config.ts similarity index 97% rename from src/pages/api/ccip/services/chain-config.ts rename to src/lib/ccip/services-api/chain-config.ts index 0123472a0ce..3c67528964d 100644 --- a/src/pages/api/ccip/services/chain-config.ts +++ b/src/lib/ccip/services-api/chain-config.ts @@ -7,7 +7,7 @@ import { getSolanaDevnetConfig } from "@lib/core/config/index.ts" import { createRpcContext } from "@lib/solana/infrastructure/rpc/solana-rpc.ts" import type { IRpcContext } from "@lib/solana/infrastructure/rpc/types.ts" -import type { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import type { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" export const prerender = false diff --git a/src/pages/api/ccip/services/faucet/drip-orchestrator.ts b/src/lib/ccip/services-api/faucet/drip-orchestrator.ts similarity index 99% rename from src/pages/api/ccip/services/faucet/drip-orchestrator.ts rename to src/lib/ccip/services-api/faucet/drip-orchestrator.ts index 95cd2c97af9..6eb6aa3ecb0 100644 --- a/src/pages/api/ccip/services/faucet/drip-orchestrator.ts +++ b/src/lib/ccip/services-api/faucet/drip-orchestrator.ts @@ -16,7 +16,7 @@ import { TransactionManager } from "@lib/solana/domain/transaction/services/mana import { detectTokenProgram, getBackendSigner } from "@lib/solana/core/services/index.ts" import { NetworkComputeBudgetService, TransactionComplexity } from "@lib/solana/core/services/network-compute-budget.ts" import type { IRpcContext } from "@lib/solana/infrastructure/rpc/types.ts" -import type { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import type { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" import type { Address } from "@solana/kit" import { directoryToSupportedChain } from "@features/utils/index.ts" diff --git a/src/pages/api/ccip/services/faucet/error-handler.ts b/src/lib/ccip/services-api/faucet/error-handler.ts similarity index 99% rename from src/pages/api/ccip/services/faucet/error-handler.ts rename to src/lib/ccip/services-api/faucet/error-handler.ts index e79b173580f..a34b6e00c1c 100644 --- a/src/pages/api/ccip/services/faucet/error-handler.ts +++ b/src/lib/ccip/services-api/faucet/error-handler.ts @@ -4,7 +4,7 @@ * to appropriate HTTP status codes following RESTful principles */ -import { APIErrorType, createErrorResponse } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse } from "~/lib/ccip/utils.ts" import { FaucetStateService } from "@lib/solana/domain/services/faucet-state.ts" import { address } from "@lib/solana/index.js" import { logger } from "@lib/logging/index.js" diff --git a/src/pages/api/services/chain-data.ts b/src/lib/ccip/services/chain-data.ts similarity index 99% rename from src/pages/api/services/chain-data.ts rename to src/lib/ccip/services/chain-data.ts index 4e0b6a6fd22..c268c3ea39b 100644 --- a/src/pages/api/services/chain-data.ts +++ b/src/lib/ccip/services/chain-data.ts @@ -1,7 +1,7 @@ -import { Environment, ChainDetails, FilterType, ChainConfigError, FeeTokenEnriched } from "../ccip/types/index.ts" +import { Environment, ChainDetails, FilterType, ChainConfigError, FeeTokenEnriched } from "~/lib/ccip/types/index.ts" import { ChainsConfig } from "@config/data/ccip/index.ts" import { getSelectorEntry } from "@config/data/ccip/selectors.ts" -import { resolveChainOrThrow } from "@api/ccip/utils.ts" +import { resolveChainOrThrow } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" import { getChainId, getNativeCurrency, getTitle, getChainTypeAndFamily } from "../../../features/utils/index.ts" import { SupportedChain, ChainType, ChainFamily } from "~/config/index.ts" diff --git a/src/pages/api/services/faucet-service.ts b/src/lib/ccip/services/faucet-service.ts similarity index 96% rename from src/pages/api/services/faucet-service.ts rename to src/lib/ccip/services/faucet-service.ts index 676a407008d..ef0ddab181d 100644 --- a/src/pages/api/services/faucet-service.ts +++ b/src/lib/ccip/services/faucet-service.ts @@ -1,7 +1,7 @@ import { logger } from "@lib/logging/index.js" -import { resolveFaucetChain } from "@api/ccip/faucet/chain-resolver.ts" -import { FaucetAdapterFactory } from "@api/ccip/faucet/adapters/index.ts" -import { ChallengeParams, ChallengeResponse, VerifyRequest, VerifyResponse } from "@api/ccip/types/faucet.ts" +import { resolveFaucetChain } from "~/lib/ccip/faucet/chain-resolver.ts" +import { FaucetAdapterFactory } from "~/lib/ccip/faucet/adapters/index.ts" +import { ChallengeParams, ChallengeResponse, VerifyRequest, VerifyResponse } from "~/lib/ccip/types/faucet.ts" export const prerender = false diff --git a/src/lib/ccip/services/lane-data.ts b/src/lib/ccip/services/lane-data.ts new file mode 100644 index 00000000000..fa3211c3646 --- /dev/null +++ b/src/lib/ccip/services/lane-data.ts @@ -0,0 +1,771 @@ +import { + Environment, + LaneDetails, + LaneFilterType, + LaneConfigError, + LaneServiceResponse, + LaneDetailServiceResponse, + LaneDetailWithRateLimits, + SupportedTokensServiceResponse, + ChainInfo, + ChainInfoInternal, + OutputKeyType, + ChainType, + ChainFamily, + LaneInputKeyType, + TokenRateLimits, + RateLimitsData, +} from "~/lib/ccip/types/index.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { LaneConfig, ChainConfig } from "@config/data/ccip/types.ts" +import { generateChainKey, normalizeVersion } from "~/lib/ccip/utils.ts" +import { logger } from "@lib/logging/index.js" +import { + getChainId, + getTitle, + getChainTypeAndFamily, + directoryToSupportedChain, +} from "../../../features/utils/index.ts" + +// Import rate limits mock data +import rateLimitsMainnet from "~/__mocks__/rate-limits-mainnet.json" with { type: "json" } +import rateLimitsTestnet from "~/__mocks__/rate-limits-testnet.json" with { type: "json" } + +export const prerender = false + +/** + * Service class for handling CCIP lane data operations + * Provides functionality to validate and filter lane configurations + */ +export class LaneDataService { + private errors: LaneConfigError[] = [] + private readonly requestId: string + private skippedLanesCount = 0 + + /** + * Creates a new instance of LaneDataService + */ + constructor() { + this.requestId = crypto.randomUUID() + + logger.debug({ + message: "LaneDataService initialized", + requestId: this.requestId, + }) + } + + /** + * Retrieves and filters lane data based on environment and filters + * + * @param environment - Network environment (mainnet/testnet) + * @param filters - Filter parameters for lanes + * @param outputKey - Format to use for displaying lane keys + * @returns Filtered lane data with metadata + */ + async getFilteredLanes( + environment: Environment, + filters: LaneFilterType, + outputKey: OutputKeyType + ): Promise { + logger.debug({ + message: "Processing lane data", + requestId: this.requestId, + environment, + filters, + outputKey, + }) + + try { + // Load reference data + const { lanesReferenceData, chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + const result: Record = {} + this.errors = [] + this.skippedLanesCount = 0 + + // Process all lanes + for (const [sourceChainKey, destinations] of Object.entries(lanesReferenceData)) { + for (const [destChainKey, laneConfig] of Object.entries(destinations)) { + try { + // Get chain information + const sourceChain = this.resolveChainInfo(sourceChainKey, chainsReferenceData) + const destChain = this.resolveChainInfo(destChainKey, chainsReferenceData) + + if (!sourceChain || !destChain) { + this.addError(sourceChainKey, destChainKey, "Failed to resolve chain information", [ + "sourceChain", + "destinationChain", + ]) + continue + } + + // Apply filters + if (!this.passesFilters(sourceChain, destChain, filters)) { + this.skippedLanesCount++ + continue + } + + // Generate lane key + const laneKey = this.generateLaneKey(sourceChain, destChain, outputKey) + + // Build lane details + const laneDetails = this.buildLaneDetails(sourceChain, destChain, laneConfig) + + // Check for version mismatch + if (laneDetails.onRamp.version !== laneDetails.offRamp.version) { + this.addError( + sourceChainKey, + destChainKey, + `Version mismatch: onRamp v${laneDetails.onRamp.version} != offRamp v${laneDetails.offRamp.version}`, + ["version"] + ) + continue + } + + // Apply version filter if provided + if (filters.version) { + // Both onRamp and offRamp must match the specified version + if (laneDetails.onRamp.version !== filters.version || laneDetails.offRamp.version !== filters.version) { + this.skippedLanesCount++ + continue + } + } + + result[laneKey] = laneDetails + + logger.debug({ + message: "Lane processed successfully", + requestId: this.requestId, + laneKey, + sourceChain: sourceChainKey, + destinationChain: destChainKey, + }) + } catch (error) { + this.addError( + sourceChainKey, + destChainKey, + `Lane processing failed: ${error instanceof Error ? error.message : "Unknown error"}`, + ["laneConfig"] + ) + } + } + } + + const validLaneCount = Object.keys(result).length + const ignoredLaneCount = this.errors.length + + logger.info({ + message: "Lane data processing completed", + requestId: this.requestId, + validLaneCount, + ignoredLaneCount, + skippedLanesCount: this.skippedLanesCount, + }) + + return { + data: result, + errors: this.errors, + metadata: { + validLaneCount, + ignoredLaneCount, + }, + } + } catch (error) { + logger.error({ + message: "Failed to process lane data", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + + throw error + } + } + + /** + * Resolves chain information from chain key + */ + private resolveChainInfo(chainKey: string, chainsReferenceData: Record): ChainInfoInternal | null { + try { + const chainConfig = chainsReferenceData[chainKey] + + if (!chainConfig) { + return null + } + + // Try to get supported chain for additional info, but don't fail if not found + let chainId: string | number = chainKey // fallback to chainKey + let displayName: string = chainKey // fallback to chainKey + let chainType: ChainType = "evm" // default to evm + let chainFamily: ChainFamily = "evm" // default to evm + + try { + const supportedChain = directoryToSupportedChain(chainKey) + const resolvedChainId = getChainId(supportedChain) + const resolvedDisplayName = getTitle(supportedChain) + const { chainType: resolvedChainType, chainFamily: resolvedChainFamily } = getChainTypeAndFamily(supportedChain) + + if (resolvedChainId) chainId = resolvedChainId + if (resolvedDisplayName) displayName = resolvedDisplayName + chainType = resolvedChainType + chainFamily = resolvedChainFamily + } catch { + // If directoryToSupportedChain fails, continue with fallback values + // This allows processing of chains not yet in the mapping + } + + // Get selector from chain configuration + const configData = chainConfig as ChainConfig + const selector = configData.chainSelector + + if (!selector) { + return null + } + + return { + chainId, + displayName, + selector, + internalId: chainKey, + chainType, + chainFamily, + } + } catch (error) { + logger.warn({ + message: "Failed to resolve chain info", + requestId: this.requestId, + chainKey, + error: error instanceof Error ? error.message : "Unknown error", + }) + return null + } + } + + /** + * Checks if a lane passes the given filters + */ + private passesFilters( + sourceChain: ChainInfoInternal, + destChain: ChainInfoInternal, + filters: LaneFilterType + ): boolean { + // Check source chain filters + if (filters.sourceChainId && !this.matchesChainFilter(sourceChain, filters.sourceChainId, "chain_id")) { + return false + } + if (filters.sourceSelector && !this.matchesChainFilter(sourceChain, filters.sourceSelector, "selector")) { + return false + } + if (filters.sourceInternalId && !this.matchesChainFilter(sourceChain, filters.sourceInternalId, "internal_id")) { + return false + } + + // Check destination chain filters + if (filters.destinationChainId && !this.matchesChainFilter(destChain, filters.destinationChainId, "chain_id")) { + return false + } + if (filters.destinationSelector && !this.matchesChainFilter(destChain, filters.destinationSelector, "selector")) { + return false + } + if ( + filters.destinationInternalId && + !this.matchesChainFilter(destChain, filters.destinationInternalId, "internal_id") + ) { + return false + } + + return true + } + + /** + * Checks if a chain matches a specific filter value + */ + private matchesChainFilter( + chain: ChainInfoInternal, + filterValue: string, + filterType: "chain_id" | "selector" | "internal_id" + ): boolean { + const filterValues = filterValue.split(",").map((v) => v.trim()) + // Map snake_case filter types to camelCase property names + const propertyMap: Record = { + chain_id: "chainId", + selector: "selector", + internal_id: "internalId", + } + const propertyName = propertyMap[filterType] + const chainValue = chain[propertyName].toString() + + // For chain_id, also check generated chain key format + if (filterType === "chain_id") { + const generatedKey = generateChainKey(chain.chainId, chain.chainType, "chain_id") + return filterValues.includes(chainValue) || filterValues.includes(generatedKey) + } + + return filterValues.includes(chainValue) + } + + /** + * Generates a lane key based on source and destination chains + */ + private generateLaneKey( + sourceChain: ChainInfoInternal, + destChain: ChainInfoInternal, + outputKey: OutputKeyType + ): string { + // Map snake_case output keys to camelCase property names + const propertyMap: Record = { + chain_id: "chainId", + selector: "selector", + internal_id: "internalId", + } + const propertyName = propertyMap[outputKey] + + const sourceKey = + outputKey === "chain_id" + ? generateChainKey(sourceChain.chainId, sourceChain.chainType, outputKey) + : sourceChain[propertyName].toString() + + const destKey = + outputKey === "chain_id" + ? generateChainKey(destChain.chainId, destChain.chainType, outputKey) + : destChain[propertyName].toString() + + return `${sourceKey}_to_${destKey}` + } + + /** + * Builds lane details from chain info and lane config + */ + private buildLaneDetails( + sourceChain: ChainInfoInternal, + destChain: ChainInfoInternal, + laneConfig: LaneConfig + ): LaneDetails { + // Convert internal chain info to public interface (remove chainType and chainFamily) + const publicSourceChain: ChainInfo = { + chainId: sourceChain.chainId, + displayName: sourceChain.displayName, + selector: sourceChain.selector, + internalId: sourceChain.internalId, + } + + const publicDestChain: ChainInfo = { + chainId: destChain.chainId, + displayName: destChain.displayName, + selector: destChain.selector, + internalId: destChain.internalId, + } + + return { + sourceChain: publicSourceChain, + destinationChain: publicDestChain, + onRamp: { + address: laneConfig.onRamp.address, + version: normalizeVersion(laneConfig.onRamp.version), + enforceOutOfOrder: laneConfig.onRamp.enforceOutOfOrder, + }, + offRamp: { + address: laneConfig.offRamp.address, + version: normalizeVersion(laneConfig.offRamp.version), + }, + supportedTokens: this.extractSupportedTokens(laneConfig), + } + } + + /** + * Extracts supported token keys from lane configuration + */ + private extractSupportedTokens(laneConfig: LaneConfig): string[] { + if (!laneConfig.supportedTokens || !Array.isArray(laneConfig.supportedTokens)) { + return [] + } + + // lanes.json structure: "supportedTokens": ["LINK", "CCIP-BnM", ...] + return laneConfig.supportedTokens + } + + /** + * Adds an error to the error collection + */ + private addError(sourceChain: string, destinationChain: string, reason: string, missingFields: string[]): void { + this.errors.push({ + sourceChain, + destinationChain, + reason, + missingFields, + }) + + logger.warn({ + message: "Lane validation error", + requestId: this.requestId, + sourceChain, + destinationChain, + reason, + missingFields, + }) + } + + /** + * Gets the request ID for this service instance + */ + getRequestId(): string { + return this.requestId + } + + /** + * Retrieves details for a specific lane by source and destination chain identifiers + * + * @param environment - Network environment (mainnet/testnet) + * @param sourceIdentifier - Source chain identifier (chainId, selector, or internalId) + * @param destinationIdentifier - Destination chain identifier + * @param inputKeyType - Type of identifier used (chainId, selector, internalId) + * @returns Lane details or null if not found + */ + async getLaneDetails( + environment: Environment, + sourceIdentifier: string, + destinationIdentifier: string, + inputKeyType: LaneInputKeyType + ): Promise { + logger.info({ + message: "Getting lane details", + requestId: this.requestId, + environment, + sourceIdentifier, + destinationIdentifier, + inputKeyType, + }) + + try { + // Load reference data + const { lanesReferenceData, chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve identifiers to internal IDs + const sourceInternalId = this.resolveToInternalId( + sourceIdentifier, + inputKeyType, + chainsReferenceData as Record + ) + const destinationInternalId = this.resolveToInternalId( + destinationIdentifier, + inputKeyType, + chainsReferenceData as Record + ) + + if (!sourceInternalId || !destinationInternalId) { + logger.warn({ + message: "Could not resolve chain identifiers", + requestId: this.requestId, + sourceIdentifier, + destinationIdentifier, + sourceInternalId, + destinationInternalId, + }) + return { data: null } + } + + // Get lane data + const sourceLanes = lanesReferenceData[sourceInternalId] as Record | undefined + if (!sourceLanes) { + return { data: null } + } + + const laneConfig = sourceLanes[destinationInternalId] + if (!laneConfig) { + return { data: null } + } + + // Resolve chain info + const sourceChain = this.resolveChainInfo(sourceInternalId, chainsReferenceData) + const destChain = this.resolveChainInfo(destinationInternalId, chainsReferenceData) + + if (!sourceChain || !destChain) { + return { data: null } + } + + // Build lane details with rate limits + const laneDetails = this.buildLaneDetailsWithRateLimits( + sourceChain, + destChain, + laneConfig, + sourceInternalId, + destinationInternalId, + environment + ) + + logger.info({ + message: "Lane details with rate limits retrieved", + requestId: this.requestId, + sourceInternalId, + destinationInternalId, + tokenCount: Object.keys(laneDetails.supportedTokens).length, + }) + + return { data: laneDetails } + } catch (error) { + logger.error({ + message: "Failed to get lane details", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + return { data: null } + } + } + + /** + * Resolves a chain identifier to its internal ID + * + * @param identifier - Chain identifier (chainId, selector, or internalId) + * @param inputKeyType - Type of identifier + * @param chainsReferenceData - Chain configuration data + * @returns Internal ID or null if not found + */ + resolveToInternalId( + identifier: string, + inputKeyType: LaneInputKeyType, + chainsReferenceData: Record + ): string | null { + // If already an internal_id, return it directly + if (inputKeyType === "internal_id") { + return chainsReferenceData[identifier] ? identifier : null + } + + // Search through chains to find matching chain_id or selector + for (const [internalId, chainConfig] of Object.entries(chainsReferenceData)) { + if (inputKeyType === "chain_id") { + // Try to match by numeric chain ID + try { + const supportedChain = directoryToSupportedChain(internalId) + const chainId = getChainId(supportedChain) + if (chainId && chainId.toString() === identifier) { + return internalId + } + } catch { + // Skip chains that can't be resolved + } + } else if (inputKeyType === "selector") { + // Match by selector + if (chainConfig.chainSelector === identifier) { + return internalId + } + } + } + + return null + } + + /** + * Loads rate limits data for the specified environment + */ + private loadRateLimitsData(environment: Environment): RateLimitsData { + return environment === "mainnet" + ? (rateLimitsMainnet as unknown as RateLimitsData) + : (rateLimitsTestnet as unknown as RateLimitsData) + } + + /** + * Builds lane details with rate limits included in supportedTokens + */ + private buildLaneDetailsWithRateLimits( + sourceChain: ChainInfoInternal, + destChain: ChainInfoInternal, + laneConfig: LaneConfig, + sourceInternalId: string, + destinationInternalId: string, + environment: Environment + ): LaneDetailWithRateLimits { + // Convert internal chain info to public interface + const publicSourceChain: ChainInfo = { + chainId: sourceChain.chainId, + displayName: sourceChain.displayName, + selector: sourceChain.selector, + internalId: sourceChain.internalId, + } + + const publicDestChain: ChainInfo = { + chainId: destChain.chainId, + displayName: destChain.displayName, + selector: destChain.selector, + internalId: destChain.internalId, + } + + // Extract supported token symbols + const tokenSymbols = this.extractSupportedTokens(laneConfig) + + // Load rate limits data + const rateLimitsData = this.loadRateLimitsData(environment) + + // Build supportedTokens with rate limits + const supportedTokensWithRateLimits: Record = {} + + for (const tokenSymbol of tokenSymbols) { + const tokenData = rateLimitsData[tokenSymbol] + if (tokenData) { + const sourceData = tokenData[sourceInternalId] + if (sourceData?.remote) { + const destData = sourceData.remote[destinationInternalId] + if (destData) { + supportedTokensWithRateLimits[tokenSymbol] = { + standard: destData.standard, + custom: destData.custom, + } + } else { + // Token exists but no rate limits for this lane - use null for unavailable + supportedTokensWithRateLimits[tokenSymbol] = { + standard: null, + custom: null, + } + } + } else { + // Token exists but no data for source chain + supportedTokensWithRateLimits[tokenSymbol] = { + standard: null, + custom: null, + } + } + } else { + // Token not found in rate limits data + supportedTokensWithRateLimits[tokenSymbol] = { + standard: null, + custom: null, + } + } + } + + return { + sourceChain: publicSourceChain, + destinationChain: publicDestChain, + onRamp: { + address: laneConfig.onRamp.address, + version: normalizeVersion(laneConfig.onRamp.version), + enforceOutOfOrder: laneConfig.onRamp.enforceOutOfOrder, + }, + offRamp: { + address: laneConfig.offRamp.address, + version: normalizeVersion(laneConfig.offRamp.version), + }, + supportedTokens: supportedTokensWithRateLimits, + } + } + + /** + * Retrieves only supported tokens with rate limits for a specific lane + * + * @param environment - Network environment (mainnet/testnet) + * @param sourceIdentifier - Source chain identifier (chainId, selector, or internalId) + * @param destinationIdentifier - Destination chain identifier + * @param inputKeyType - Type of identifier used (chainId, selector, internalId) + * @returns Supported tokens with rate limits or null if lane not found + */ + async getSupportedTokensWithRateLimits( + environment: Environment, + sourceIdentifier: string, + destinationIdentifier: string, + inputKeyType: LaneInputKeyType + ): Promise { + logger.info({ + message: "Getting supported tokens with rate limits", + requestId: this.requestId, + environment, + sourceIdentifier, + destinationIdentifier, + inputKeyType, + }) + + try { + // Load reference data + const { lanesReferenceData, chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve identifiers to internal IDs + const sourceInternalId = this.resolveToInternalId( + sourceIdentifier, + inputKeyType, + chainsReferenceData as Record + ) + const destinationInternalId = this.resolveToInternalId( + destinationIdentifier, + inputKeyType, + chainsReferenceData as Record + ) + + if (!sourceInternalId || !destinationInternalId) { + logger.warn({ + message: "Could not resolve chain identifiers", + requestId: this.requestId, + sourceIdentifier, + destinationIdentifier, + }) + return { data: null, tokenCount: 0 } + } + + // Get lane data + const sourceLanes = lanesReferenceData[sourceInternalId] as Record | undefined + if (!sourceLanes) { + return { data: null, tokenCount: 0 } + } + + const laneConfig = sourceLanes[destinationInternalId] + if (!laneConfig) { + return { data: null, tokenCount: 0 } + } + + // Extract supported token symbols + const tokenSymbols = this.extractSupportedTokens(laneConfig) + + // Load rate limits data + const rateLimitsData = this.loadRateLimitsData(environment) + + // Build supportedTokens with rate limits + const supportedTokensWithRateLimits: Record = {} + + for (const tokenSymbol of tokenSymbols) { + const tokenData = rateLimitsData[tokenSymbol] + if (tokenData) { + const sourceData = tokenData[sourceInternalId] + if (sourceData?.remote) { + const destData = sourceData.remote[destinationInternalId] + if (destData) { + supportedTokensWithRateLimits[tokenSymbol] = { + standard: destData.standard, + custom: destData.custom, + } + } else { + supportedTokensWithRateLimits[tokenSymbol] = { standard: null, custom: null } + } + } else { + supportedTokensWithRateLimits[tokenSymbol] = { standard: null, custom: null } + } + } else { + supportedTokensWithRateLimits[tokenSymbol] = { standard: null, custom: null } + } + } + + const tokenCount = Object.keys(supportedTokensWithRateLimits).length + + logger.info({ + message: "Supported tokens with rate limits retrieved", + requestId: this.requestId, + sourceInternalId, + destinationInternalId, + tokenCount, + }) + + return { data: supportedTokensWithRateLimits, tokenCount } + } catch (error) { + logger.error({ + message: "Failed to get supported tokens with rate limits", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + return { data: null, tokenCount: 0 } + } + } +} diff --git a/src/lib/ccip/services/rate-limits-data.ts b/src/lib/ccip/services/rate-limits-data.ts new file mode 100644 index 00000000000..cce168ac68e --- /dev/null +++ b/src/lib/ccip/services/rate-limits-data.ts @@ -0,0 +1,352 @@ +import { + Environment, + RateLimitsFilterType, + RateLimitsServiceResponse, + RateLimitsData, + TokenRateLimits, + RateLimiterConfig, + RateLimiterEntry, + RateLimiterDirections, + isRateLimiterUnavailable, + LaneRateLimitsFilterType, + LaneInputKeyType, +} from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "./lane-data.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.ts" +import { logger } from "@lib/logging/index.js" + +// Import the mock data files +import rateLimitsMainnet from "~/__mocks__/rate-limits-mainnet.json" with { type: "json" } +import rateLimitsTestnet from "~/__mocks__/rate-limits-testnet.json" with { type: "json" } + +export const prerender = false + +/** + * Service class for handling CCIP rate limits data operations + * Provides functionality to filter and retrieve rate limiter configurations + */ +export class RateLimitsDataService { + private readonly requestId: string + + /** + * Creates a new instance of RateLimitsDataService + */ + constructor() { + this.requestId = crypto.randomUUID() + + logger.debug({ + message: "RateLimitsDataService initialized", + requestId: this.requestId, + }) + } + + /** + * Retrieves rate limits data for a specific lane, optionally filtered by tokens, direction, and rate type + * + * @param environment - Network environment (mainnet/testnet) + * @param filters - Filter parameters including source/destination chains, tokens, direction, and rate type + * @returns Filtered rate limits data with metadata + */ + async getFilteredRateLimits( + environment: Environment, + filters: RateLimitsFilterType + ): Promise { + logger.debug({ + message: "Processing rate limits request", + requestId: this.requestId, + environment, + filters, + }) + + try { + // Load the appropriate rate limits data based on environment + const rateLimitsData = this.loadRateLimitsData(environment) + + // Extract rate limits for the specified lane + const result = this.extractLaneRateLimits(rateLimitsData, filters) + + const tokenCount = Object.keys(result).length + + logger.info({ + message: "Rate limits data retrieved successfully", + requestId: this.requestId, + tokenCount, + sourceChain: filters.sourceInternalId, + destinationChain: filters.destinationInternalId, + }) + + return { + data: result, + metadata: { + tokenCount, + }, + } + } catch (error) { + logger.error({ + message: "Failed to process rate limits data", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + + throw error + } + } + + /** + * Loads rate limits data for the specified environment + */ + private loadRateLimitsData(environment: Environment): RateLimitsData { + logger.debug({ + message: "Loading rate limits data", + requestId: this.requestId, + environment, + }) + + if (environment === Environment.Mainnet) { + return rateLimitsMainnet as RateLimitsData + } + return rateLimitsTestnet as RateLimitsData + } + + /** + * Extracts rate limits for a specific lane from the token-centric data structure + * + * @param rateLimitsData - Full rate limits data (token -> source -> { minBlockConfirmation?, remote: { dest -> ... } }) + * @param filters - Filter parameters + * @returns Token-centric rate limits for the specified lane + */ + private extractLaneRateLimits( + rateLimitsData: RateLimitsData, + filters: RateLimitsFilterType + ): Record { + const { sourceInternalId, destinationInternalId, tokens, direction, rateType } = filters + const result: Record = {} + + // Parse token filter if provided + const tokenFilter = tokens + ? tokens + .split(",") + .map((t) => t.trim()) + .filter((t) => t.length > 0) + : null + + // Iterate through all tokens in the data + for (const [tokenSymbol, sourceChains] of Object.entries(rateLimitsData)) { + // Skip if token filter is provided and this token is not in the filter + if (tokenFilter && !tokenFilter.includes(tokenSymbol)) { + continue + } + + // Check if this token has data for the requested source chain + const sourceChainData = sourceChains[sourceInternalId] + if (!sourceChainData) { + continue + } + + // Check if destination exists in remote + const laneRateLimits = sourceChainData.remote[destinationInternalId] + if (!laneRateLimits) { + continue + } + + // Apply filters for direction and rate type + const filteredLimits = this.applyFilters(laneRateLimits, direction, rateType) + + if (filteredLimits) { + result[tokenSymbol] = filteredLimits + } + } + + logger.debug({ + message: "Lane rate limits extracted", + requestId: this.requestId, + sourceChain: sourceInternalId, + destinationChain: destinationInternalId, + tokenCount: Object.keys(result).length, + filteredTokens: tokenFilter, + direction, + rateType, + }) + + return result + } + + /** + * Applies direction and rate type filters to rate limits + * + * @param rateLimits - Original rate limits with standard and custom entries + * @param direction - Optional direction filter ("in" or "out") + * @param rateType - Optional rate type filter ("standard" or "custom") + * @returns Filtered rate limits or null if no data matches + */ + private applyFilters( + rateLimits: TokenRateLimits, + direction?: "in" | "out", + rateType?: "standard" | "custom" + ): TokenRateLimits | null { + // Apply direction filter to both standard and custom entries + const filteredStandard = this.applyDirectionFilter(rateLimits.standard, direction) + const filteredCustom = this.applyDirectionFilter(rateLimits.custom, direction) + + // If rate type filter is specified, return only that type + if (rateType === "standard") { + if (!filteredStandard) { + return null + } + return { + standard: filteredStandard, + custom: null, // Indicate custom was filtered out + } + } + + if (rateType === "custom") { + if (!filteredCustom) { + return null + } + return { + standard: null, // Indicate standard was filtered out + custom: filteredCustom, + } + } + + // No rate type filter, return both (if either has data) + if (!filteredStandard && !filteredCustom) { + return null + } + + return { + standard: filteredStandard ?? null, + custom: filteredCustom ?? null, + } + } + + /** + * Applies direction filter to a rate limiter entry + * + * @param entry - Rate limiter entry (directions or unavailable) + * @param direction - Optional direction filter ("in" or "out") + * @returns Filtered entry or null if no data matches + */ + private applyDirectionFilter(entry: RateLimiterEntry, direction?: "in" | "out"): RateLimiterEntry | null { + // If entry is unavailable, return it as-is + if (isRateLimiterUnavailable(entry)) { + return entry + } + + // If no direction filter, return the full entry + if (!direction) { + return entry + } + + // Filter to specific direction + const directionsEntry = entry as RateLimiterDirections + const filteredConfig = directionsEntry[direction] + if (!filteredConfig) { + return null + } + + // Return only the requested direction + return { + [direction]: filteredConfig, + } as RateLimiterDirections + } + + /** + * Validates that a rate limiter config exists and has valid structure + */ + private isValidRateLimiterConfig(config: unknown): config is RateLimiterConfig { + if (!config || typeof config !== "object") { + return false + } + + const c = config as Record + return typeof c.capacity === "string" && typeof c.isEnabled === "boolean" && typeof c.rate === "string" + } + + /** + * Gets the request ID for this service instance + */ + getRequestId(): string { + return this.requestId + } + + /** + * Retrieves rate limits for a specific lane using path parameters + * + * @param environment - Network environment (mainnet/testnet) + * @param sourceIdentifier - Source chain identifier + * @param destinationIdentifier - Destination chain identifier + * @param inputKeyType - Type of chain identifier (chainId, selector, internalId) + * @param filters - Optional filters for tokens, direction, rate type + * @returns Rate limits data with metadata + */ + async getLaneRateLimits( + environment: Environment, + sourceIdentifier: string, + destinationIdentifier: string, + inputKeyType: LaneInputKeyType, + filters: LaneRateLimitsFilterType = {} + ): Promise { + logger.info({ + message: "Processing lane rate limits request", + requestId: this.requestId, + environment, + sourceIdentifier, + destinationIdentifier, + inputKeyType, + filters, + }) + + try { + // Resolve chain identifiers to internal IDs + const { chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + const laneDataService = new LaneDataService() + const sourceInternalId = laneDataService.resolveToInternalId( + sourceIdentifier, + inputKeyType, + chainsReferenceData as Record + ) + const destinationInternalId = laneDataService.resolveToInternalId( + destinationIdentifier, + inputKeyType, + chainsReferenceData as Record + ) + + if (!sourceInternalId || !destinationInternalId) { + logger.warn({ + message: "Could not resolve chain identifiers for rate limits", + requestId: this.requestId, + sourceIdentifier, + destinationIdentifier, + }) + return { + data: {}, + metadata: { tokenCount: 0 }, + } + } + + // Use existing filter-based method with resolved internal IDs + const fullFilters: RateLimitsFilterType = { + sourceInternalId, + destinationInternalId, + tokens: filters.tokens, + direction: filters.direction, + rateType: filters.rateType, + } + + return this.getFilteredRateLimits(environment, fullFilters) + } catch (error) { + logger.error({ + message: "Failed to get lane rate limits", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + throw error + } + } +} diff --git a/src/lib/ccip/services/realtime-data-instance.ts b/src/lib/ccip/services/realtime-data-instance.ts new file mode 100644 index 00000000000..b1ac8df61bd --- /dev/null +++ b/src/lib/ccip/services/realtime-data-instance.ts @@ -0,0 +1,7 @@ +import { RealtimeDataService } from "./realtime-data.ts" + +/** + * Singleton instance of RealtimeDataService + * Use this shared instance across all components to avoid creating multiple instances + */ +export const realtimeDataService = new RealtimeDataService() diff --git a/src/lib/ccip/services/realtime-data.ts b/src/lib/ccip/services/realtime-data.ts new file mode 100644 index 00000000000..a0b7a84b470 --- /dev/null +++ b/src/lib/ccip/services/realtime-data.ts @@ -0,0 +1,259 @@ +import { Environment } from "~/lib/ccip/types/index.ts" +import type { + TokenRateLimits, + RateLimiterEntry, + RateLimiterConfig, + TokenFinalityData, + OutputKeyType, +} from "~/lib/ccip/types/index.ts" + +export const prerender = false + +/** + * Base URL for CCIP realtime API + * For client-side calls, use relative URLs to hit the local API endpoints + */ +const getApiBaseUrl = () => { + // In browser context, use relative URLs + if (typeof window !== "undefined") { + return "" + } + // In server context, use environment variable or default + return process.env.CCIP_REALTIME_API_BASE_URL || "https://api.ccip.chainlink.com" +} + +/** + * Response structure for lane supported tokens endpoint + */ +export interface LaneSupportedTokensResponse { + metadata: { + environment: Environment + timestamp: string + requestId: string + sourceChain: string + destinationChain: string + tokenCount: number + } + data: Record +} + +/** + * Response structure for token finality endpoint + */ +export interface TokenFinalityResponse { + metadata: { + environment: Environment + timestamp: string + requestId: string + tokenSymbol: string + chainCount: number + } + data: Record +} + +/** + * Service class for handling CCIP realtime data operations + * Provides functionality to fetch live data from the CCIP API + */ +export class RealtimeDataService { + private readonly requestId: string + + /** + * Creates a new instance of RealtimeDataService + */ + constructor() { + // Generate UUID - handle both browser and server environments + if (typeof crypto !== "undefined" && crypto.randomUUID) { + this.requestId = crypto.randomUUID() + } else { + this.requestId = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}` + } + } + + /** + * Fetches supported tokens with rate limits for a specific lane + * + * @param sourceInternalId - Source chain internal ID + * @param destinationInternalId - Destination chain internal ID + * @param environment - Network environment (mainnet/testnet) + * @returns Supported tokens with rate limits + */ + async getLaneSupportedTokens( + sourceInternalId: string, + destinationInternalId: string, + environment: Environment + ): Promise { + try { + const baseUrl = getApiBaseUrl() + const url = `${baseUrl}/api/ccip/v1/lanes/by-internal-id/${sourceInternalId}/${destinationInternalId}/supported-tokens?environment=${environment}` + + const response = await fetch(url) + + if (!response.ok) { + return null + } + + const data = await response.json() + return data + } catch (error) { + console.error("Error fetching lane supported tokens:", error) + return null + } + } + + /** + * Fetches token finality details across all chains + * + * @param tokenCanonicalSymbol - Token canonical symbol (e.g., "BETS", "LINK") + * @param environment - Network environment (mainnet/testnet) + * @param outputKey - Format to use for displaying chain keys (optional) + * @returns Token finality data for all chains + */ + async getTokenFinality( + tokenCanonicalSymbol: string, + environment: Environment, + outputKey?: OutputKeyType + ): Promise { + try { + const baseUrl = getApiBaseUrl() + let url = `${baseUrl}/api/ccip/v1/tokens/${tokenCanonicalSymbol}/finality?environment=${environment}` + + if (outputKey) { + url += `&output_key=${outputKey}` + } + + const response = await fetch(url) + + if (!response.ok) { + console.error("Failed to fetch token finality:", response.status) + return null + } + + const data = await response.json() + return data + } catch (error) { + console.error("Error fetching token finality:", error) + return null + } + } + + /** + * Checks if rate limiter data is unavailable (null) + * + * @param entry - Rate limiter entry to check + * @returns True if unavailable (null) + */ + isRateLimiterUnavailable(entry: RateLimiterEntry): entry is null { + return entry === null + } + + /** + * Checks if rate limiter is enabled + * + * @param config - Rate limiter configuration + * @returns True if enabled + */ + isRateLimiterEnabled(config: RateLimiterConfig): boolean { + return config.isEnabled + } + + /** + * Gets the request ID for this service instance + */ + getRequestId(): string { + return this.requestId + } + + /** + * Extracts FTF (custom) rate limit data for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns FTF rate limiter config or null if unavailable + */ + getFTFRateLimit(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): RateLimiterConfig | null { + if (!tokenRateLimits.custom || this.isRateLimiterUnavailable(tokenRateLimits.custom)) { + return null + } + + const customEntry = tokenRateLimits.custom + return customEntry[direction] || null + } + + /** + * Gets FTF capacity for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns FTF capacity value or null if unavailable + */ + getFTFCapacity(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): string | null { + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + return ftfLimit?.capacity || null + } + + /** + * Gets FTF refill rate for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns FTF refill rate value or null if unavailable + */ + getFTFRefillRate(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): string | null { + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + return ftfLimit?.rate || null + } + + /** + * Checks if FTF rate limiting is enabled for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns True if FTF is enabled, false otherwise + */ + isFTFEnabled(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): boolean { + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + return ftfLimit?.isEnabled || false + } + + /** + * Gets both standard and FTF rate limits for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries (can be null/undefined) + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns Object containing both standard and FTF rate limits + */ + getAllRateLimitsForDirection( + tokenRateLimits: TokenRateLimits | null | undefined, + direction: "in" | "out" + ): { + standard: RateLimiterConfig | null + ftf: RateLimiterConfig | null + } { + if (!tokenRateLimits) { + return { standard: null, ftf: null } + } + + const standardLimit = + tokenRateLimits.standard && !this.isRateLimiterUnavailable(tokenRateLimits.standard) + ? tokenRateLimits.standard[direction] || null + : null + + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + + return { + standard: standardLimit, + ftf: ftfLimit, + } + } + + /** + * Checks if a token has FTF rate limiting available + * + * @param tokenRateLimits - Token rate limits to check + * @returns True if FTF data is available (not null/unavailable) + */ + hasFTFRateLimits(tokenRateLimits: TokenRateLimits): boolean { + return tokenRateLimits.custom !== null && !this.isRateLimiterUnavailable(tokenRateLimits.custom) + } +} diff --git a/src/pages/api/services/token-data.ts b/src/lib/ccip/services/token-data.ts similarity index 57% rename from src/pages/api/services/token-data.ts rename to src/lib/ccip/services/token-data.ts index d72dca0b9eb..23f850bb1db 100644 --- a/src/pages/api/services/token-data.ts +++ b/src/lib/ccip/services/token-data.ts @@ -6,15 +6,26 @@ import { TokenChainData, TokenDataResponse, TokenServiceResponse, -} from "../ccip/types/index.ts" + TokenDetailChainData, + TokenDetailDataResponse, + TokenDetailServiceResponse, + TokenFinalityData, + TokenFinalityDataResponse, + TokenFinalityServiceResponse, + RateLimitsData, +} from "~/lib/ccip/types/index.ts" import { Version } from "@config/data/ccip/types.ts" import { SupportedChain } from "@config/index.ts" import { getAllSupportedTokens, getAllTokenLanes, getTokenData } from "@config/data/ccip/data.ts" -import { resolveChainOrThrow, generateChainKey } from "@api/ccip/utils.ts" +import { resolveChainOrThrow, generateChainKey } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" import { getChainId, getChainTypeAndFamily, getTitle } from "../../../features/utils/index.ts" import { getSelectorEntry } from "@config/data/ccip/selectors.ts" +// Import rate limits mock data for custom finality info +import rateLimitsMainnet from "~/__mocks__/rate-limits-mainnet.json" with { type: "json" } +import rateLimitsTestnet from "~/__mocks__/rate-limits-testnet.json" with { type: "json" } + export const prerender = false /** @@ -99,11 +110,11 @@ export class TokenDataService { Object.entries(tokenData).forEach(([chainId, chainData]) => { try { - // Only process chains where poolAddress exists - if (!chainData.poolAddress) { + // Only process chains where pool.address exists + if (!chainData.pool?.address) { this.skippedTokensCount++ logger.warn({ - message: "Chain missing poolAddress - skipping only this chain", + message: "Chain missing pool.address - skipping only this chain", requestId: this.requestId, tokenCanonicalId, chainId, @@ -138,12 +149,12 @@ export class TokenDataService { if (!destNumericChainId) return destChainId - if (outputKey === "chainId") { + if (outputKey === "chain_id") { return generateChainKey(destNumericChainId, destChainType, outputKey) } else if (outputKey === "selector") { const selectorEntry = getSelectorEntry(destNumericChainId, destChainType) return selectorEntry?.selector || destChainId - } else if (outputKey === "internalId") { + } else if (outputKey === "internal_id") { const selectorEntry = getSelectorEntry(destNumericChainId, destChainType) return selectorEntry?.name || destChainId } @@ -153,14 +164,14 @@ export class TokenDataService { // Get the appropriate key based on outputKey parameter let chainKey = chainId - if (outputKey === "chainId") { + if (outputKey === "chain_id") { chainKey = generateChainKey(numericChainId, chainType, outputKey) } else if (outputKey === "selector") { const selectorEntry = getSelectorEntry(numericChainId, chainType) if (selectorEntry) { chainKey = selectorEntry.selector } - } else if (outputKey === "internalId") { + } else if (outputKey === "internal_id") { const selectorEntry = getSelectorEntry(numericChainId, chainType) if (selectorEntry) { chainKey = selectorEntry.name @@ -176,8 +187,12 @@ export class TokenDataService { decimals: chainData.decimals, destinations, name: chainData.name || "", - poolAddress: chainData.poolAddress, - poolType: chainData.poolType, + pool: { + address: chainData.pool.address || "", + rawType: chainData.pool.rawType, + type: chainData.pool.type, + version: chainData.pool.version, + }, symbol: chainData.symbol, tokenAddress: chainData.tokenAddress, }, @@ -261,7 +276,7 @@ export class TokenDataService { public async getFilteredTokens( environment: Environment, filters: TokenFilterType, - outputKey: OutputKeyType = "chainId" + outputKey: OutputKeyType = "chain_id" ): Promise { logger.info({ message: "Starting token filtering process", @@ -361,4 +376,224 @@ export class TokenDataService { metadata, } } + + /** + * Retrieves detailed token information for a specific token, including custom finality data + * + * @param environment - Network environment (mainnet/testnet) + * @param tokenCanonicalSymbol - Canonical symbol for the token + * @param outputKey - Format to use for displaying chain information + * @returns Token details with custom finality information for each chain + */ + public async getTokenWithFinality( + environment: Environment, + tokenCanonicalSymbol: string, + outputKey: OutputKeyType = "chain_id" + ): Promise { + logger.info({ + message: "Getting token with finality data", + requestId: this.requestId, + environment, + tokenCanonicalSymbol, + outputKey, + }) + + // Get base token data using existing method + const tokenData = await this.processTokenData(environment, tokenCanonicalSymbol, outputKey) + + if (!tokenData) { + logger.warn({ + message: "Token not found", + requestId: this.requestId, + tokenCanonicalSymbol, + }) + return null + } + + // Load rate limits data for finality info + const rateLimitsData = this.loadRateLimitsData(environment) + + // Get token's rate limits by internal ID + const tokenRateLimits = rateLimitsData[tokenCanonicalSymbol] + + // Merge token data with custom finality information + const result: TokenDetailDataResponse = {} + + for (const [chainKey, chainData] of Object.entries(tokenData)) { + // Look up minBlockConfirmation using internal ID + // We need to map the chainKey back to internal ID for rate limits lookup + const internalId = this.getInternalIdFromChainKey(chainData.chainId, chainData.chainName, outputKey) + + let minBlockConfirmation: number | null = null + let hasCustomFinality: boolean | null = null + + if (tokenRateLimits && internalId && tokenRateLimits[internalId]) { + minBlockConfirmation = tokenRateLimits[internalId].minBlockConfirmation + + // Derive hasCustomFinality from minBlockConfirmation + if (minBlockConfirmation === null) { + hasCustomFinality = null // Unavailable + } else if (minBlockConfirmation > 0) { + hasCustomFinality = true + } else { + hasCustomFinality = false + } + } + + const detailChainData: TokenDetailChainData = { + ...chainData, + hasCustomFinality, + minBlockConfirmation, + } + + result[chainKey] = detailChainData + } + + logger.info({ + message: "Token with finality data retrieved", + requestId: this.requestId, + tokenCanonicalSymbol, + chainCount: Object.keys(result).length, + }) + + return { + data: result, + metadata: { + chainCount: Object.keys(result).length, + }, + } + } + + /** + * Loads rate limits data for the specified environment + */ + private loadRateLimitsData(environment: Environment): RateLimitsData { + if (environment === Environment.Mainnet) { + return rateLimitsMainnet as RateLimitsData + } + return rateLimitsTestnet as RateLimitsData + } + + /** + * Gets the internal ID for a chain based on chainId/chainName + * This is needed to look up rate limits data which uses internal IDs as keys + */ + private getInternalIdFromChainKey( + chainId: number | string, + chainName: string, + outputKey: OutputKeyType + ): string | null { + try { + // If outputKey is internalId, the chainName might already be the internal ID + // We need to look up the selector entry by chainId + const numericChainId = typeof chainId === "string" ? parseInt(chainId, 10) : chainId + + if (isNaN(numericChainId)) { + // chainId is not numeric, might be a non-EVM chain identifier + // Try to find by name pattern + return null + } + + // Get selector entry which has the internal name + const selectorEntry = getSelectorEntry(numericChainId, "evm") + if (selectorEntry) { + return selectorEntry.name + } + + return null + } catch { + logger.debug({ + message: "Could not resolve internal ID for chain", + requestId: this.requestId, + chainId, + chainName, + }) + return null + } + } + + /** + * Retrieves only finality data for a specific token (lightweight endpoint) + * + * @param environment - Network environment (mainnet/testnet) + * @param tokenCanonicalSymbol - Canonical symbol for the token + * @param outputKey - Format to use for displaying chain information + * @returns Finality information (hasCustomFinality, minBlockConfirmation) for each chain + */ + public async getTokenFinality( + environment: Environment, + tokenCanonicalSymbol: string, + outputKey: OutputKeyType = "chain_id" + ): Promise { + logger.info({ + message: "Getting token finality data", + requestId: this.requestId, + environment, + tokenCanonicalSymbol, + outputKey, + }) + + // Get base token data to know which chains the token exists on + const tokenData = await this.processTokenData(environment, tokenCanonicalSymbol, outputKey) + + if (!tokenData) { + logger.warn({ + message: "Token not found", + requestId: this.requestId, + tokenCanonicalSymbol, + }) + return null + } + + // Load rate limits data for finality info + const rateLimitsData = this.loadRateLimitsData(environment) + + // Get token's rate limits by internal ID + const tokenRateLimits = rateLimitsData[tokenCanonicalSymbol] + + // Extract only finality data for each chain + const result: TokenFinalityDataResponse = {} + + for (const [chainKey, chainData] of Object.entries(tokenData)) { + // Look up minBlockConfirmation using internal ID + const internalId = this.getInternalIdFromChainKey(chainData.chainId, chainData.chainName, outputKey) + + let minBlockConfirmation: number | null = null + let hasCustomFinality: boolean | null = null + + if (tokenRateLimits && internalId && tokenRateLimits[internalId]) { + minBlockConfirmation = tokenRateLimits[internalId].minBlockConfirmation + + // Derive hasCustomFinality from minBlockConfirmation + if (minBlockConfirmation === null) { + hasCustomFinality = null // Unavailable + } else if (minBlockConfirmation > 0) { + hasCustomFinality = true + } else { + hasCustomFinality = false + } + } + + const finalityData: TokenFinalityData = { + hasCustomFinality, + minBlockConfirmation, + } + + result[chainKey] = finalityData + } + + logger.info({ + message: "Token finality data retrieved", + requestId: this.requestId, + tokenCanonicalSymbol, + chainCount: Object.keys(result).length, + }) + + return { + data: result, + metadata: { + chainCount: Object.keys(result).length, + }, + } + } } diff --git a/src/pages/api/ccip/types/faucet.ts b/src/lib/ccip/types/faucet.ts similarity index 100% rename from src/pages/api/ccip/types/faucet.ts rename to src/lib/ccip/types/faucet.ts diff --git a/src/lib/ccip/types/index.ts b/src/lib/ccip/types/index.ts new file mode 100644 index 00000000000..30232fed61d --- /dev/null +++ b/src/lib/ccip/types/index.ts @@ -0,0 +1,518 @@ +// Chain Data API Types + +import { Environment } from "@config/data/ccip/types.ts" + +export { Environment } + +// Chain type and family declarations +export type ChainType = "evm" | "solana" | "aptos" | "sui" +export type ChainFamily = "evm" | "mvm" | "svm" + +export const prerender = false + +/** + * Enriched fee token information with address and metadata + * Used when enrichFeeTokens=true query parameter is set + */ +export type FeeTokenEnriched = { + symbol: string + name: string + address: string + decimals: number +} + +export type ChainConfigError = { + chainId: number + networkId: string + reason: string + missingFields: string[] +} + +export type ChainMetadata = { + environment: Environment + timestamp: string + requestId: string + ignoredChainCount: number +} + +export interface ChainDetails { + chainId: number | string + displayName: string + selector: string + internalId: string + feeTokens: string[] | FeeTokenEnriched[] + router: string + rmn: string + chainType: ChainType + chainFamily: ChainFamily + registryModule?: string + tokenAdminRegistry?: string + tokenPoolFactory?: string + feeQuoter?: string + mcms?: string +} + +export type ChainApiResponse = { + metadata: ChainMetadata + data: Record> + ignored: { + chainId: number + networkId: string + reason: string + missingFields: string[] + chain_id?: string + }[] +} + +export type OutputKeyType = "chain_id" | "selector" | "internal_id" + +export type ChainApiError = { + error: string + message: string +} + +export interface FilterType { + chainId?: string + selector?: string + internalId?: string +} + +export type SelectorEntry = { + selector: string + name: string +} + +export type SelectorsConfig = { + selectors: Record +} + +// Token Data API Types + +export type TokenConfigError = { + symbol: string + reason: string + missingFields: string[] +} + +export type TokenMetadata = { + environment: Environment + timestamp: string + requestId: string + ignoredTokenCount: number + validTokenCount: number +} + +export type TokenPool = { + address: string + rawType: string + type: string + version: string +} + +export type TokenChainData = { + chainId: number | string + chainName: string + decimals: number + destinations: string[] + name: string + pool: TokenPool + symbol: string + tokenAddress: string +} + +export type TokenDataResponse = { + [key: string]: { + [chainKey: string]: TokenChainData + } +} + +export type TokenServiceResponse = { + tokens: TokenDataResponse + errors: TokenConfigError[] + metadata: { + validTokenCount: number + ignoredTokenCount: number + } +} + +export type TokenApiResponse = { + metadata: TokenMetadata + data: TokenDataResponse + ignored: TokenConfigError[] +} + +export interface TokenFilterType { + token_id?: string + chain_id?: string +} + +// Token Detail API Types (for /tokens/{tokenCanonicalSymbol} endpoint) + +/** + * Extended token chain data with custom finality information + */ +export interface TokenDetailChainData extends TokenChainData { + /** Whether custom finality is enabled (derived from minBlockConfirmation > 0) */ + hasCustomFinality: boolean | null + /** Minimum block confirmations required, null if unavailable */ + minBlockConfirmation: number | null +} + +/** + * Token detail response data structure + */ +export type TokenDetailDataResponse = { + [chainKey: string]: TokenDetailChainData +} + +/** + * Metadata for token detail API responses + */ +export interface TokenDetailMetadata { + environment: Environment + timestamp: string + requestId: string + tokenSymbol: string + chainCount: number +} + +/** + * Token detail API response format + */ +export interface TokenDetailApiResponse { + metadata: TokenDetailMetadata + data: TokenDetailDataResponse +} + +/** + * Token detail service response (internal) + */ +export interface TokenDetailServiceResponse { + data: TokenDetailDataResponse + metadata: { + chainCount: number + } +} + +// Token Finality API Types (for /tokens/{tokenCanonicalSymbol}/finality endpoint) + +/** + * Finality data for a token on a specific chain + */ +export interface TokenFinalityData { + /** Whether custom finality is enabled (derived from minBlockConfirmation > 0) */ + hasCustomFinality: boolean | null + /** Minimum block confirmations required, null if unavailable */ + minBlockConfirmation: number | null +} + +/** + * Token finality response data structure + */ +export type TokenFinalityDataResponse = { + [chainKey: string]: TokenFinalityData +} + +/** + * Token finality API response format + */ +export interface TokenFinalityApiResponse { + metadata: TokenDetailMetadata + data: TokenFinalityDataResponse +} + +/** + * Token finality service response (internal) + */ +export interface TokenFinalityServiceResponse { + data: TokenFinalityDataResponse + metadata: { + chainCount: number + } +} + +// Lane Data API Types + +export type LaneConfigError = { + sourceChain: string + destinationChain: string + reason: string + missingFields: string[] +} + +export type LaneMetadata = { + environment: Environment + timestamp: string + requestId: string + ignoredLaneCount: number + validLaneCount: number +} + +// Internal interface with chainType and chainFamily for processing +export interface ChainInfoInternal { + chainId: number | string + displayName: string + selector: string + internalId: string + chainType: ChainType + chainFamily: ChainFamily +} + +// Public interface for API responses without chainType and chainFamily +export interface ChainInfo { + chainId: number | string + displayName: string + selector: string + internalId: string +} + +export interface LaneDetails { + sourceChain: ChainInfo + destinationChain: ChainInfo + onRamp: { + address: string + version: string + enforceOutOfOrder?: boolean + } + offRamp: { + address: string + version: string + } + supportedTokens: string[] +} + +export type LaneDataResponse = Record + +export type LaneServiceResponse = { + data: LaneDataResponse + errors: LaneConfigError[] + metadata: { + validLaneCount: number + ignoredLaneCount: number + } +} + +export type LaneApiResponse = { + metadata: LaneMetadata + data: LaneDataResponse + ignored: LaneConfigError[] +} + +export interface LaneFilterType { + sourceChainId?: string + destinationChainId?: string + sourceSelector?: string + destinationSelector?: string + sourceInternalId?: string + destinationInternalId?: string + version?: string +} + +// Lane Detail API Types (for /lanes/by-{type}/{source}/{destination} endpoints) + +/** + * Input key type for lane path parameters + */ +export type LaneInputKeyType = "chain_id" | "selector" | "internal_id" + +/** + * Metadata for single lane detail API responses + */ +export interface LaneDetailMetadata { + environment: Environment + timestamp: string + requestId: string + sourceChain: string + destinationChain: string +} + +// Rate Limits API Types + +/** + * Rate limiter configuration for a single direction (in or out) + */ +export interface RateLimiterConfig { + capacity: string + isEnabled: boolean + rate: string +} + +/** + * Rate limiter directions (in and/or out) + */ +export interface RateLimiterDirections { + in?: RateLimiterConfig + out?: RateLimiterConfig +} + +/** + * Rate limiter entry can be directions data or null (unavailable) + */ +export type RateLimiterEntry = RateLimiterDirections | null + +/** + * Rate limits for a single token on a lane with both standard and custom (FTF) limits + */ +export interface TokenRateLimits { + standard: RateLimiterEntry + custom: RateLimiterEntry +} + +/** + * Lane details with rate limits included in supportedTokens + * Used for single lane detail endpoints that merge rate limits + */ +export interface LaneDetailWithRateLimits { + sourceChain: ChainInfo + destinationChain: ChainInfo + onRamp: { + address: string + version: string + enforceOutOfOrder?: boolean + } + offRamp: { + address: string + version: string + } + supportedTokens: Record +} + +/** + * Single lane detail API response format (with rate limits) + */ +export interface LaneDetailApiResponse { + metadata: LaneDetailMetadata + data: LaneDetailWithRateLimits +} + +/** + * Lane detail service response (internal) + */ +export interface LaneDetailServiceResponse { + data: LaneDetailWithRateLimits | null +} + +// Supported Tokens API Types (for /lanes/by-{type}/{source}/{destination}/supported-tokens endpoints) + +/** + * Metadata for supported tokens API responses + */ +export interface SupportedTokensMetadata { + environment: Environment + timestamp: string + requestId: string + sourceChain: string + destinationChain: string + tokenCount: number +} + +/** + * Supported tokens API response format + */ +export interface SupportedTokensApiResponse { + metadata: SupportedTokensMetadata + data: Record +} + +/** + * Supported tokens service response (internal) + */ +export interface SupportedTokensServiceResponse { + data: Record | null + tokenCount: number +} + +/** + * Type guard to check if a RateLimiterEntry is unavailable (null) + */ +export function isRateLimiterUnavailable(entry: RateLimiterEntry): entry is null { + return entry === null +} + +/** + * Metadata for rate limits API responses + */ +export interface RateLimitsMetadata { + environment: Environment + timestamp: string + requestId: string + sourceChain: string + destinationChain: string + tokenCount: number +} + +/** + * Filter parameters for rate limits queries (query-based - deprecated) + */ +export interface RateLimitsFilterType { + sourceInternalId: string + destinationInternalId: string + tokens?: string + direction?: "in" | "out" + rateType?: "standard" | "custom" +} + +/** + * Filter parameters for lane rate limits queries (path-based) + * Source and destination come from URL path parameters + */ +export interface LaneRateLimitsFilterType { + tokens?: string + direction?: "in" | "out" + rateType?: "standard" | "custom" +} + +/** + * Direction type for rate limits + */ +export type RateLimitsDirection = "in" | "out" + +/** + * Rate type for rate limits (standard or custom/FTF) + */ +export type RateLimitsType = "standard" | "custom" + +/** + * Source chain rate limits data with minBlockConfirmation and remote destinations + */ +export interface SourceChainRateLimitsData { + minBlockConfirmation: number | null + remote: Record +} + +/** + * Rate limits data structure in the mock JSON files + * Token -> SourceChain -> { minBlockConfirmation?, remote: { DestChain -> { standard, custom } } } + */ +export type RateLimitsData = Record> + +/** + * Rate limits API response format + */ +export interface RateLimitsApiResponse { + metadata: RateLimitsMetadata + data: Record +} + +/** + * Rate limits service response (internal) + */ +export interface RateLimitsServiceResponse { + data: Record + metadata: { + tokenCount: number + } +} + +// Faucet API Types +export type { + FaucetChainConfig, + ChallengeParams, + ChallengeResponse, + VerifyRequest, + VerifyResponse, + VerifySignatureArgs, + FamilyAdapter, + FaucetApiResponse, + FaucetError, +} from "./faucet.ts" diff --git a/src/pages/api/ccip/utils.ts b/src/lib/ccip/utils.ts similarity index 77% rename from src/pages/api/ccip/utils.ts rename to src/lib/ccip/utils.ts index c10232bc66c..de1326f5ed0 100644 --- a/src/pages/api/ccip/utils.ts +++ b/src/lib/ccip/utils.ts @@ -4,7 +4,16 @@ import { ChainsConfig, Environment, loadReferenceData, Version } from "@config/d import { SupportedChain } from "@config/index.ts" import { directoryToSupportedChain } from "@features/utils/index.ts" import { v4 as uuidv4 } from "uuid" -import type { TokenMetadata, ChainType, OutputKeyType } from "./types/index.ts" +import type { + TokenMetadata, + ChainType, + OutputKeyType, + RateLimitsMetadata, + RateLimitsFilterType, + RateLimitsDirection, + RateLimitsType, +} from "./types/index.ts" +import { commonHeaders } from "@lib/api/cacheHeaders.ts" export const prerender = false @@ -13,23 +22,6 @@ export type { ChainsConfig, Version } export { Environment } export type { SelectorsConfig } from "@config/data/ccip/selectors.ts" -/** - * Common HTTP headers used across all API responses - */ -export const commonHeaders = { - "Content-Type": "application/json", -} - -/** - * Extended headers for successful responses with caching directives - */ -export const successHeaders = { - ...commonHeaders, - "Cache-Control": "s-max-age=300, stale-while-revalidate", - "CDN-Cache-Control": "max-age=300", - "Vercel-CDN-Cache-Control": "max-age=300", -} - /** * Custom error class for CCIP-specific errors */ @@ -224,6 +216,90 @@ export const createTokenMetadata = (environment: Environment): TokenMetadata => } } +/** + * Creates rate-limits-specific metadata object + * @param environment - Current network environment + * @param sourceChain - Source chain internal ID + * @param destinationChain - Destination chain internal ID + * @param tokenCount - Number of tokens in the response + * @returns Metadata object for rate limits API response + */ +export const createRateLimitsMetadata = ( + environment: Environment, + sourceChain: string, + destinationChain: string, + tokenCount: number +): RateLimitsMetadata => { + return { + environment, + timestamp: new Date().toISOString(), + requestId: crypto.randomUUID(), + sourceChain, + destinationChain, + tokenCount, + } +} + +/** + * Validates rate limits filter parameters + * @param filters - Filter parameters to validate + * @throws CCIPError if required parameters are missing or invalid + */ +export const validateRateLimitsFilters = (filters: { + sourceInternalId?: string + destinationInternalId?: string + tokens?: string + direction?: string + rateType?: string +}): RateLimitsFilterType => { + // Validate required parameters + if (!filters.sourceInternalId) { + throw new CCIPError(400, "source_internal_id parameter is required") + } + if (!filters.destinationInternalId) { + throw new CCIPError(400, "destination_internal_id parameter is required") + } + + // Validate direction if provided + let direction: RateLimitsDirection | undefined + if (filters.direction) { + const normalizedDirection = filters.direction.toLowerCase() + if (!["in", "out"].includes(normalizedDirection)) { + throw new CCIPError(400, 'direction parameter must be "in" or "out"') + } + direction = normalizedDirection as RateLimitsDirection + } + + // Validate rate_type if provided + let rateType: RateLimitsType | undefined + if (filters.rateType) { + const normalizedRateType = filters.rateType.toLowerCase() + if (!["standard", "custom"].includes(normalizedRateType)) { + throw new CCIPError(400, 'rate_type parameter must be "standard" or "custom"') + } + rateType = normalizedRateType as RateLimitsType + } + + // Validate tokens if provided (must not be empty after parsing) + if (filters.tokens !== undefined && filters.tokens !== null) { + const tokenList = filters.tokens + .split(",") + .map((t) => t.trim()) + .filter((t) => t.length > 0) + if (filters.tokens.length > 0 && tokenList.length === 0) { + throw new CCIPError(400, "tokens parameter cannot be empty when provided") + } + } + + return { + sourceInternalId: filters.sourceInternalId, + destinationInternalId: filters.destinationInternalId, + tokens: filters.tokens, + direction, + rateType, + } +} + /** * Validates the environment parameter * @param environment - Environment string to validate @@ -251,30 +327,30 @@ export const validateFilters = (filters: FilterType): void => { } /** - * Validates and normalizes the outputKey parameter + * Validates and normalizes the output_key parameter * @param outputKey - Output key to validate * @returns Validated output key * @throws CCIPError if output key is invalid */ -export const validateOutputKey = (outputKey?: string): "chainId" | "selector" | "internalId" => { - if (!outputKey) return "chainId" - if (!["chainId", "selector", "internalId"].includes(outputKey)) { - throw new CCIPError(400, "outputKey must be one of: chainId, selector, or internalId") +export const validateOutputKey = (outputKey?: string): "chain_id" | "selector" | "internal_id" => { + if (!outputKey) return "chain_id" + if (!["chain_id", "selector", "internal_id"].includes(outputKey)) { + throw new CCIPError(400, "output_key must be one of: chain_id, selector, or internal_id") } - return outputKey as "chainId" | "selector" | "internalId" + return outputKey as "chain_id" | "selector" | "internal_id" } /** - * Validates the enrichFeeTokens parameter + * Validates the enrich_fee_tokens parameter * @param enrichFeeTokens - String value to validate * @returns Boolean indicating whether to enrich fee tokens with addresses and metadata - * @throws CCIPError if enrichFeeTokens value is invalid + * @throws CCIPError if enrich_fee_tokens value is invalid */ export const validateEnrichFeeTokens = (enrichFeeTokens?: string): boolean => { if (!enrichFeeTokens) return false const normalizedValue = enrichFeeTokens.toLowerCase() if (!["true", "false"].includes(normalizedValue)) { - throw new CCIPError(400, 'enrichFeeTokens must be "true" or "false"') + throw new CCIPError(400, 'enrich_fee_tokens must be "true" or "false"') } return normalizedValue === "true" } @@ -282,7 +358,7 @@ export const validateEnrichFeeTokens = (enrichFeeTokens?: string): boolean => { export const generateChainKey = (chainId: number | string, chainType: ChainType, outputKey: OutputKeyType): string => { const chainIdStr = chainId.toString() - if (outputKey === "chainId" && chainType !== "evm" && chainType !== "solana") { + if (outputKey === "chain_id" && chainType !== "evm" && chainType !== "solana") { return `${chainType}-${chainIdStr}` } diff --git a/src/lib/ccip/utils/rate-limit-formatter.ts b/src/lib/ccip/utils/rate-limit-formatter.ts new file mode 100644 index 00000000000..d7431f39f31 --- /dev/null +++ b/src/lib/ccip/utils/rate-limit-formatter.ts @@ -0,0 +1,72 @@ +import type { RateLimiterConfig } from "~/lib/ccip/types/index.ts" + +/** + * Formats a rate limit value from wei to tokens + * @param value - Rate limit value in wei (as string) + * @returns Formatted string with proper number formatting + */ +export function formatRateLimit(value: string | null | undefined): string { + if (!value || value === "0") return "0" + + try { + // Convert from wei to tokens (divide by 1e18) + const numValue = BigInt(value) + const formatted = Number(numValue) / 1e18 + return formatted.toLocaleString(undefined, { maximumFractionDigits: 2 }) + } catch (error) { + console.error("Error formatting rate limit:", error) + return "0" + } +} + +/** + * Checks if a token is paused based on rate limit configuration + * A token is considered paused if the capacity is "0" + * @param rateLimit - Rate limiter configuration + * @returns True if token is paused + */ +export function isTokenPaused(rateLimit: RateLimiterConfig | null | undefined): boolean { + return rateLimit?.capacity === "0" +} + +/** + * Gets display value for a rate limit + * @param rateLimit - Rate limiter configuration + * @param isLoading - Whether data is still loading + * @returns Display string for the rate limit + */ +export function getRateLimitDisplay(rateLimit: RateLimiterConfig | null | undefined, isLoading: boolean): string { + if (isLoading) return "Loading..." + if (!rateLimit) return "N/A" + if (!rateLimit.isEnabled) return "Disabled" + return formatRateLimit(rateLimit.capacity) +} + +/** + * Gets display value for a rate limit capacity + * @param rateLimit - Rate limiter configuration + * @param isLoading - Whether data is still loading + * @returns Display string for capacity + */ +export function getRateLimitCapacityDisplay( + rateLimit: RateLimiterConfig | null | undefined, + isLoading: boolean +): string { + if (isLoading) return "Loading..." + if (!rateLimit) return "Unavailable" + if (!rateLimit.isEnabled) return "Disabled" + return formatRateLimit(rateLimit.capacity) +} + +/** + * Gets display value for a rate limit refill rate + * @param rateLimit - Rate limiter configuration + * @param isLoading - Whether data is still loading + * @returns Display string for refill rate + */ +export function getRateLimitRateDisplay(rateLimit: RateLimiterConfig | null | undefined, isLoading: boolean): string { + if (isLoading) return "Loading..." + if (!rateLimit) return "N/A" + if (!rateLimit.isEnabled) return "Disabled" + return formatRateLimit(rateLimit.rate) +} diff --git a/src/lib/codeSample/language.ts b/src/lib/codeSample/language.ts new file mode 100644 index 00000000000..24e4c3b3313 --- /dev/null +++ b/src/lib/codeSample/language.ts @@ -0,0 +1,25 @@ +export function languageBadge(language: string): string { + const l = language.toLowerCase() + if (l === "solidity" || l === "sol") return "SOL" + if (["javascript", "js", "mjs", "cjs"].includes(l)) return "JS" + if (["typescript", "ts", "mts", "cts"].includes(l)) return "TS" + if (["bash", "sh", "shell"].includes(l)) return "SH" + if (l === "go" || l === "golang") return "GO" + if (l === "json" || l === "jsonc") return "JSON" + if (l === "yaml" || l === "yml") return "YAML" + return l.slice(0, 4).toUpperCase() +} + +export function getLanguageIconSrc(language: string): string | undefined { + const l = language.toLowerCase() + // Map language names/aliases to icons in `public/images/language-icons/`. + if (l === "solidity" || l === "sol") return "/images/language-icons/solidity.svg" + if (["typescript", "ts", "mts", "cts"].includes(l)) return "/images/language-icons/typescript.svg" + if (["go", "golang"].includes(l)) return "/images/language-icons/go.svg" + if (["json", "jsonc"].includes(l)) return "/images/language-icons/json.svg" + if (l === "toml") return "/images/language-icons/toml.svg" + if (["python", "py"].includes(l)) return "/images/language-icons/python.svg" + if (["rust", "rs"].includes(l)) return "/images/language-icons/rust.svg" + if (["bash", "sh", "shell", "zsh", "terminal"].includes(l)) return "/images/language-icons/terminal.svg" + return undefined +} diff --git a/src/lib/index.ts b/src/lib/index.ts index 849fff2d239..03aced06021 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1 +1,2 @@ export * from "./clsx/clsx.ts" +export * from "./markdown/index.js" diff --git a/src/lib/languageStore.ts b/src/lib/languageStore.ts index 56ca8b34e26..0fc11a0d972 100644 --- a/src/lib/languageStore.ts +++ b/src/lib/languageStore.ts @@ -5,5 +5,5 @@ export type SupportedLanguage = "go" | "ts" // Store with localStorage persistence export const selectedLanguage = persistentAtom( "docs-language-preference", - "go" // default value + "ts" // default value ) diff --git a/src/lib/markdown/__tests__/formatters.test.ts b/src/lib/markdown/__tests__/formatters.test.ts new file mode 100644 index 00000000000..71299614d33 --- /dev/null +++ b/src/lib/markdown/__tests__/formatters.test.ts @@ -0,0 +1,359 @@ +/** + * Tests for shared markdown formatting utilities + * These are pure functions used by both build-time (generate-llms.ts) + * and runtime (CopyPageLink) markdown generation + */ + +import { describe, it, expect } from "@jest/globals" +import { + formatHeading, + formatLink, + formatBold, + formatItalic, + formatInlineCode, + formatCodeBlock, + formatBlockquote, + formatTable, + formatImage, + formatHorizontalRule, + formatUnorderedList, + formatOrderedList, + formatFrontmatter, + cleanText, + normalizeMarkdown, + unescapeMarkdown, + stripHighlightComments, + resolveUrl, +} from "../formatters.js" + +describe("Heading Formatters", () => { + it("should format h1 correctly", () => { + expect(formatHeading(1, "Title")).toBe("# Title\n\n") + }) + + it("should format h2 correctly", () => { + expect(formatHeading(2, "Subtitle")).toBe("## Subtitle\n\n") + }) + + it("should format h3-h6 correctly", () => { + expect(formatHeading(3, "Section")).toBe("### Section\n\n") + expect(formatHeading(4, "Subsection")).toBe("#### Subsection\n\n") + expect(formatHeading(5, "Minor")).toBe("##### Minor\n\n") + expect(formatHeading(6, "Smallest")).toBe("###### Smallest\n\n") + }) + + it("should handle empty headings", () => { + expect(formatHeading(1, "")).toBe("# \n\n") + }) +}) + +describe("Inline Formatters", () => { + it("should format links", () => { + expect(formatLink("Click here", "https://example.com")).toBe("[Click here](https://example.com)") + }) + + it("should format bold text", () => { + expect(formatBold("important")).toBe("**important**") + }) + + it("should format italic text", () => { + expect(formatItalic("emphasis")).toBe("*emphasis*") + }) + + it("should format inline code", () => { + expect(formatInlineCode("const x = 1")).toBe("`const x = 1`") + }) +}) + +describe("Code Block Formatter", () => { + it("should format code block with language", () => { + const code = "function test() {\n return true\n}" + const result = formatCodeBlock(code, "javascript") + expect(result).toBe("```javascript\nfunction test() {\n return true\n}\n```\n\n") + }) + + it("should format code block without language", () => { + const code = "plain text" + const result = formatCodeBlock(code) + expect(result).toBe("```\nplain text\n```\n\n") + }) + + it("should handle empty code blocks", () => { + expect(formatCodeBlock("")).toBe("```\n\n```\n\n") + }) +}) + +describe("Table Formatter", () => { + it("should format table with header", () => { + const rows = [ + ["Name", "Age"], + ["Alice", "30"], + ["Bob", "25"], + ] + const result = formatTable(rows) + + expect(result).toContain("| Name | Age |") + expect(result).toContain("| --- | --- |") + expect(result).toContain("| Alice | 30 |") + expect(result).toContain("| Bob | 25 |") + expect(result.endsWith("\n")).toBe(true) + }) + + it("should format table without header", () => { + const rows = [ + ["A", "B"], + ["C", "D"], + ] + const result = formatTable(rows, false) + + expect(result).toContain("| A | B |") + expect(result).toContain("| C | D |") + expect(result).not.toContain("| --- | --- |") + }) + + it("should handle single row table", () => { + const rows = [["Single", "Row"]] + const result = formatTable(rows) + + expect(result).toContain("| Single | Row |") + expect(result).toContain("| --- | --- |") + }) + + it("should handle empty table", () => { + expect(formatTable([])).toBe("") + }) +}) + +describe("List Formatters", () => { + it("should format unordered list", () => { + const items = ["First item", "Second item", "Third item"] + const result = formatUnorderedList(items) + + expect(result).toBe("- First item\n- Second item\n- Third item\n\n") + }) + + it("should format ordered list", () => { + const items = ["First", "Second", "Third"] + const result = formatOrderedList(items) + + expect(result).toBe("1. First\n2. Second\n3. Third\n\n") + }) + + it("should handle empty lists", () => { + expect(formatUnorderedList([])).toBe("\n\n") + expect(formatOrderedList([])).toBe("\n\n") + }) +}) + +describe("Other Formatters", () => { + it("should format blockquote", () => { + const result = formatBlockquote("Important note\nSecond line") + expect(result).toBe("> Important note\n> Second line\n\n") + }) + + it("should format horizontal rule", () => { + expect(formatHorizontalRule()).toBe("---\n\n") + }) + + it("should format image", () => { + expect(formatImage("Alt text", "/path/to/image.png")).toBe("![Alt text](/path/to/image.png)") + }) + + it("should format image with title", () => { + expect(formatImage("Alt", "/img.png", "Title")).toBe('![Alt](/img.png "Title")') + }) +}) + +describe("Frontmatter Formatter", () => { + it("should format frontmatter with simple values", () => { + const data = { + title: "Test Page", + url: "https://example.com", + extracted: "2024-01-01T00:00:00.000Z", + } + const result = formatFrontmatter(data) + + expect(result).toContain("---") + expect(result).toContain("title: Test Page") + // URLs with colons get quoted (correct YAML behavior) + expect(result).toContain('url: "https://example.com"') + expect(result).toContain('extracted: "2024-01-01T00:00:00.000Z"') + expect(result.endsWith("\n\n")).toBe(true) + }) + + it("should quote strings with special YAML characters", () => { + const data = { + title: "Title: With Colon", + description: "Has # hash", + } + const result = formatFrontmatter(data) + + expect(result).toContain('title: "Title: With Colon"') + expect(result).toContain('description: "Has # hash"') + }) + + it("should handle boolean and number values", () => { + const data = { + published: true, + count: 42, + } + const result = formatFrontmatter(data) + + expect(result).toContain("published: true") + expect(result).toContain("count: 42") + }) +}) + +describe("Text Utilities", () => { + it("should clean text with encoding issues", () => { + expect(cleanText("’")).toBe("'") + expect(cleanText("“test â€")).toBe('"test "') + }) + + it("should normalize whitespace", () => { + expect(cleanText(" hello world ")).toBe("hello world") + expect(cleanText("test\n\n\nmore")).toBe("test more") + }) + + it("should remove zero-width characters", () => { + expect(cleanText("test\u200B\u200C\u200Dtext")).toBe("testtext") + // BOM character gets normalized to space by whitespace normalization + expect(cleanText("hello\uFEFFworld")).toBe("hello world") + }) + + it("should handle smart quotes", () => { + // Left/right single quotes → straight apostrophes + expect(cleanText("\u2018test\u2019")).toBe("'test'") + // Left/right double quotes → straight quotes + expect(cleanText("\u201Ctest\u201D")).toBe('"test"') + }) +}) + +describe("Markdown Normalization", () => { + it("should normalize line endings", () => { + const markdown = "Line 1\r\nLine 2\r\nLine 3" + expect(normalizeMarkdown(markdown)).toBe("Line 1\nLine 2\nLine 3") + }) + + it("should normalize multiple blank lines", () => { + const markdown = "Paragraph 1\n\n\n\nParagraph 2" + expect(normalizeMarkdown(markdown)).toBe("Paragraph 1\n\nParagraph 2") + }) + + it("should normalize list markers", () => { + const markdown = "* Item 1\n+ Item 2\n- Item 3" + expect(normalizeMarkdown(markdown)).toBe("- Item 1\n- Item 2\n- Item 3") + }) + + it("should trim trailing whitespace", () => { + const markdown = "Line with spaces \nAnother line " + const result = normalizeMarkdown(markdown) + expect(result).toBe("Line with spaces\nAnother line") + }) +}) + +describe("Unescape Markdown", () => { + it("should unescape markdown characters outside code blocks", () => { + const text = "Test \\_underscore\\_ and \\[brackets\\]" + expect(unescapeMarkdown(text)).toBe("Test _underscore_ and [brackets]") + }) + + it("should preserve escaping inside code blocks", () => { + const text = "```\n\\_code\\_\n```" + expect(unescapeMarkdown(text)).toBe("```\n\\_code\\_\n```") + }) + + it("should remove prettier-ignore comments", () => { + const text = "Line 1\n{/* prettier-ignore */}\nLine 2" + expect(unescapeMarkdown(text)).toBe("Line 1\nLine 2") + }) + + it("should handle multiple code blocks", () => { + const text = "Before\n```\ncode1\n```\nMiddle\n```\ncode2\n```\nAfter" + const result = unescapeMarkdown(text) + expect(result).toContain("code1") + expect(result).toContain("code2") + }) +}) + +describe("Strip Highlight Comments", () => { + it("should remove highlight-line comments", () => { + const code = "const x = 1 // highlight-line\nconst y = 2" + expect(stripHighlightComments(code)).toBe("const x = 1\nconst y = 2") + }) + + it("should remove highlight-start and highlight-end", () => { + const code = "line1 // highlight-start\nline2\nline3 // highlight-end" + expect(stripHighlightComments(code)).toBe("line1\nline2\nline3") + }) + + it("should handle mixed whitespace", () => { + const code = "test // highlight-line \nnext" + // Removes comment but preserves leading whitespace on the line + expect(stripHighlightComments(code)).toBe("test \nnext") + }) + + it("should preserve non-highlight comments", () => { + const code = "const x = 1 // regular comment\nconst y = 2 // highlight-line\nconst z = 3 // another comment" + const result = stripHighlightComments(code) + expect(result).toContain("// regular comment") + expect(result).toContain("// another comment") + expect(result).not.toContain("highlight-line") + }) +}) + +describe("URL Resolution", () => { + it("should preserve absolute URLs", () => { + expect(resolveUrl("https://example.com/path", "https://base.com")).toBe("https://example.com/path") + expect(resolveUrl("http://example.com", "https://base.com")).toBe("http://example.com") + }) + + it("should resolve relative URLs with base", () => { + expect(resolveUrl("/path/to/page", "https://example.com")).toBe("https://example.com/path/to/page") + }) + + it("should handle URLs without base (server-side)", () => { + // When window is not defined (Node.js), base defaults to empty string + const result = resolveUrl("https://example.com") + expect(result).toBe("https://example.com") + }) + + it("should handle invalid URLs gracefully", () => { + // If URL constructor fails, return original + const result = resolveUrl("not-a-valid-url", "") + expect(result).toBe("not-a-valid-url") + }) +}) + +describe("Integration Tests", () => { + it("should format a complete markdown document", () => { + const title = formatHeading(1, "Documentation") + const intro = "This is an introduction.\n\n" + const code = formatCodeBlock('console.log("Hello")', "javascript") + const list = formatUnorderedList(["Feature 1", "Feature 2"]) + + const result = title + intro + code + list + + expect(result).toContain("# Documentation") + expect(result).toContain("introduction") + expect(result).toContain("```javascript") + expect(result).toContain("- Feature 1") + }) + + it("should produce consistent output for same input", () => { + const data = { title: "Test", url: "https://test.com" } + + const result1 = formatFrontmatter(data) + const result2 = formatFrontmatter(data) + + expect(result1).toBe(result2) + }) + + it("should handle text cleaning pipeline", () => { + const dirtyText = " ’test “quotes†with spaces " + const cleaned = cleanText(dirtyText) + const normalized = normalizeMarkdown(cleaned) + + expect(normalized).toBe('\'test "quotes" with spaces') + }) +}) diff --git a/src/lib/markdown/__tests__/transformMarkdown.test.ts b/src/lib/markdown/__tests__/transformMarkdown.test.ts new file mode 100644 index 00000000000..b564bc74200 --- /dev/null +++ b/src/lib/markdown/__tests__/transformMarkdown.test.ts @@ -0,0 +1,112 @@ +/** + * Tests for markdown transformation + */ + +import { describe, it, expect } from "@jest/globals" +import { transformMarkdown } from "@lib/markdown/transformMarkdown.js" +import { extractFrontmatter, titleCase, getPageLanguage } from "@lib/markdown/utils.js" + +describe("transformMarkdown", () => { + it("should transform basic markdown", async () => { + const markdown = `# Hello World + +This is a test. + +\`\`\`javascript +console.log("test") +\`\`\` +` + + const result = await transformMarkdown(markdown, "/fake/path.mdx") + expect(result).toContain("# Hello World") + expect(result).toContain("This is a test") + expect(result).toContain("```javascript") + }) + + it("should handle code blocks", async () => { + const markdown = `\`\`\`solidity +contract Test { + // comment +} +\`\`\` +` + + const result = await transformMarkdown(markdown, "/fake/path.mdx") + expect(result).toContain("```solidity") + expect(result).toContain("contract Test") + }) + + it("should preserve links", async () => { + const markdown = `[Link text](/some/path)` + + const result = await transformMarkdown(markdown, "/fake/path.mdx") + expect(result).toContain("[Link text](/some/path)") + }) + + it("should handle tables", async () => { + const markdown = `| Col1 | Col2 | +|------|------| +| A | B |` + + const result = await transformMarkdown(markdown, "/fake/path.mdx") + expect(result).toContain("Col1") + expect(result).toContain("Col2") + }) +}) + +describe("extractFrontmatter", () => { + it("should extract title from frontmatter", () => { + const raw = `--- +title: "Test Page" +--- + +Content here` + + const result = extractFrontmatter(raw) + expect(result.fmTitle).toBe("Test Page") + expect(result.body).toContain("Content here") + }) + + it("should handle missing frontmatter", () => { + const raw = `Content without frontmatter` + + const result = extractFrontmatter(raw) + expect(result.fmTitle).toBeUndefined() + expect(result.body).toBe(raw) + }) + + it("should extract sdkLang from frontmatter", () => { + const raw = `--- +title: "Test" +sdkLang: "go" +--- + +Content` + + const result = extractFrontmatter(raw) + expect(result.sdkLang).toBe("go") + }) +}) + +describe("titleCase", () => { + it("should convert to title case", () => { + expect(titleCase("hello-world")).toBe("Hello World") + expect(titleCase("test_file")).toBe("Test File") + expect(titleCase("already Title")).toBe("Already Title") + }) +}) + +describe("getPageLanguage", () => { + it("should detect language from filename", () => { + expect(getPageLanguage("/path/to/file-go.mdx")).toBe("go") + expect(getPageLanguage("/path/to/file-ts.mdx")).toBe("ts") + }) + + it("should return frontmatter language if present", () => { + expect(getPageLanguage("/path/to/file.mdx", "typescript")).toBe("typescript") + }) + + it("should return null for common files", () => { + expect(getPageLanguage("/path/to/file.mdx")).toBeNull() + }) +}) diff --git a/src/lib/markdown/componentHandlers.ts b/src/lib/markdown/componentHandlers.ts new file mode 100644 index 00000000000..47cd21c125f --- /dev/null +++ b/src/lib/markdown/componentHandlers.ts @@ -0,0 +1,526 @@ +/** + * Handlers for custom MDX components + */ + +import fs from "fs" +import path from "path" +import type { Parent, Literal, Node } from "unist" +import type { MdxJsxNode, ComponentContext } from "./types.js" +import { + calculateNetworkFeesForTokenMechanismDirect, + calculateMessagingNetworkFeesDirect, + TokenMechanism, +} from "../../config/data/ccip/index.js" + +/** + * Load CcipCommon callout mapping dynamically from CcipCommon.astro + * @returns Mapping of callout names to file paths + */ +export function loadCcipCommonMapping(): Record { + try { + const astroFilePath = path.resolve("src/features/ccip/CcipCommon.astro") + const astroContent = fs.readFileSync(astroFilePath, "utf-8") + + // First, build a map of Component names to file paths from imports + const importRegex = /import\s+(\w+)\s+from\s+["'](.+?)["']/g + const componentToFile: Record = {} + + for (const match of astroContent.matchAll(importRegex)) { + const [, componentName, filePath] = match + const cleanPath = filePath.replace(/^\.\//, "") + componentToFile[componentName] = cleanPath + } + + // Then, parse the conditional statements to map callout names to component names + const conditionalRegex = /callout\s+===\s+["'](\w+)["']\s+&&\s+<(\w+)/g + const mapping: Record = {} + + for (const match of astroContent.matchAll(conditionalRegex)) { + const [, calloutName, componentName] = match + const filePath = componentToFile[componentName] + if (filePath) { + mapping[calloutName] = filePath + } + } + + return mapping + } catch (e) { + console.warn("Failed to load CcipCommon mapping:", e) + return {} + } +} + +/** + * Handle CcipCommon component - inline the referenced markdown content + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleCcipCommon( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + const calloutAttr = node.attributes?.find((a) => a.name === "callout") + const calloutValue = typeof calloutAttr?.value === "string" ? calloutAttr.value : undefined + + if (calloutValue) { + // Load mapping dynamically from CcipCommon.astro + const calloutFileMap = loadCcipCommonMapping() + const fileName = calloutFileMap[calloutValue] + + if (fileName) { + const calloutPath = path.resolve("src/features/ccip", fileName) + + if (fs.existsSync(calloutPath)) { + let calloutContent = fs.readFileSync(calloutPath, "utf-8") + + // Strip frontmatter if present + if (calloutContent.trim().startsWith("---")) { + calloutContent = calloutContent.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, "") + } + + // Strip import statements + calloutContent = calloutContent.replace(/^import\s+.+$/gm, "").trim() + + // Parse the callout markdown and insert it + const calloutTree = context.processor.parse(calloutContent) + if (calloutTree && calloutTree.children) { + parent.children.splice(index, 1, ...calloutTree.children) + return index + calloutTree.children.length + } + } + } + } + } catch (e) { + console.warn(`Failed to process CcipCommon in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle CodeHighlightBlock component - inline imported code + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleCodeHighlightBlock( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + const codeVarAttr = node.attributes?.find((a) => a.name === "code") + const codeVarName = (codeVarAttr?.value as { data?: { estree?: { body?: { expression?: { name?: string } }[] } } }) + ?.data?.estree?.body?.[0]?.expression?.name + + if (codeVarName) { + const importRegex = new RegExp(`import\\s+${codeVarName}\\s+from\\s+['"](.+?)['"]`) + const match = context.markdown.match(importRegex) + + if (match) { + const importPath = match[1].split("?")[0] // Strip "?raw" and other query params + const codeAbsPath = path.resolve(path.dirname(context.mdxAbsPath), importPath) + let codeContent = fs.readFileSync(codeAbsPath, "utf-8") + + // Strip highlighter comments + codeContent = codeContent + .split("\n") + .map((line) => line.replace(/\s*\/\/\s*highlight-(line|start|end)/, "")) + .join("\n") + + const langAttr = node.attributes?.find((a) => a.name === "lang") + const titleAttr = node.attributes?.find((a) => a.name === "title") + + const newNodes: Node[] = [] + + if (titleAttr) { + const title = `Code snippet for ${titleAttr.value}:` + newNodes.push({ type: "paragraph", children: [{ type: "text", value: title } as Literal] } as Parent) + } + + newNodes.push({ + type: "code", + lang: langAttr?.value || "", + value: codeContent.trim(), + } as Literal) + + parent.children.splice(index, 1, ...newNodes) + return index + newNodes.length + } + } + } catch (e) { + console.warn(`Failed to process CodeHighlightBlock in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle CodeHighlightBlockMulti component - inline language-specific code + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleCodeHighlightBlockMulti( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + const languagesAttr = node.attributes?.find((a) => a.name === "languages") + + if (languagesAttr && context.targetLanguage) { + // Extract the code variable name for the target language + // The structure is: languages={{ go: { code: goVar }, ts: { code: tsVar } }} + const attrValue = languagesAttr.value + const estreeBody = + typeof attrValue === "object" && attrValue && "data" in attrValue + ? attrValue.data?.estree?.body?.[0] + : undefined + const languagesObj = + estreeBody && typeof estreeBody === "object" && "expression" in estreeBody + ? (estreeBody.expression as { properties?: unknown })?.properties + : undefined + + if (languagesObj) { + for (const langProp of languagesObj as Record[]) { + const langKey = + (langProp.key as { name?: string; value?: string })?.name || + (langProp.key as { name?: string; value?: string })?.value + + if (langKey === context.targetLanguage) { + const codeProperty = (langProp.value as { properties?: Record[] })?.properties?.find( + (p) => (p.key as { name?: string })?.name === "code" + ) + const codeVarName = (codeProperty?.value as { name?: string })?.name + + if (codeVarName) { + // Find the import statement for this variable + const importRegex = new RegExp(`import\\s+${codeVarName}\\s+from\\s+['"](.+?)['"]`) + const match = context.markdown.match(importRegex) + + if (match) { + const importPath = match[1].split("?")[0] // Strip "?raw" + const codeAbsPath = path.resolve(path.dirname(context.mdxAbsPath), importPath) + let codeContent = fs.readFileSync(codeAbsPath, "utf-8") + + // Strip highlighter comments + codeContent = codeContent + .split("\n") + .map((line) => line.replace(/\s*\/\/\s*highlight-(line|start|end)/, "")) + .join("\n") + + // Infer language from file extension + const fileExt = path.extname(codeAbsPath).slice(1) + const lang = fileExt || context.targetLanguage + + // Create a code block for this language + const newNodes: Node[] = [] + newNodes.push({ + type: "code", + lang, + value: codeContent.trim(), + } as Literal) + + parent.children.splice(index, 1, ...newNodes) + return index + newNodes.length + } + } + break + } + } + } + } + } catch (e) { + console.warn(`Failed to process CodeHighlightBlockMulti in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle CopyText component - extract text attribute + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleCopyText(node: MdxJsxNode, parent: Parent, index: number): number | void { + const textAttr = node.attributes?.find((a) => a.name === "text") + + if (textAttr?.value) { + const attrValue = textAttr.value + const textValue = + typeof attrValue === "string" + ? attrValue + : typeof attrValue === "object" && attrValue && "value" in attrValue + ? attrValue.value + : "" + + parent.children[index] = { type: "text", value: textValue } as Literal + } +} + +/** + * Handle generic MDX div elements - extract children + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleDiv(node: MdxJsxNode, parent: Parent, index: number): number | void { + // Replace the
element with just its children + if ((node as Parent).children) { + parent.children.splice(index, 1, ...(node as Parent).children) + return index + } +} + +/** + * Handle Aside component - convert to markdown blockquote + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleAside(node: MdxJsxNode, parent: Parent, index: number, context: ComponentContext): number | void { + try { + const typeAttr = node.attributes?.find((a) => a.name === "type") + const titleAttr = node.attributes?.find((a) => a.name === "title") + + const type = typeof typeAttr?.value === "string" ? typeAttr.value.toUpperCase() : "NOTE" + const title = typeof titleAttr?.value === "string" ? titleAttr.value : "" + + // Get children content + const children = (node as Parent).children || [] + + if (children.length === 0) { + return + } + + // Create blockquote header + const header = title ? `**${type}: ${title}**` : `**${type}**` + + // Create new nodes for blockquote + const newNodes: Node[] = [] + + // Add blockquote paragraph with header + newNodes.push({ + type: "blockquote", + children: [ + { + type: "paragraph", + children: [{ type: "text", value: header } as Literal], + } as Parent, + { + type: "paragraph", + children: [{ type: "text", value: "" } as Literal], + } as Parent, + ...children, + ], + } as Parent) + + parent.children.splice(index, 1, ...newNodes) + return index + newNodes.length + } catch (e) { + console.warn(`Failed to process Aside in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle ClickToZoom component - convert to markdown image + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleClickToZoom( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + const srcAttr = node.attributes?.find((a) => a.name === "src") + const altAttr = node.attributes?.find((a) => a.name === "alt") + + const src = typeof srcAttr?.value === "string" ? srcAttr.value : "" + const alt = typeof altAttr?.value === "string" ? altAttr.value : "Image" + + if (!src) return + + // Create markdown image node + parent.children[index] = { + type: "image", + url: src, + alt, + } as Literal & { url: string; alt: string } + } catch (e) { + console.warn(`Failed to process ClickToZoom in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle CodeSample component - generate Remix link or inline code + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleCodeSample( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + const srcAttr = node.attributes?.find((a) => a.name === "src") + const showButtonOnlyAttr = node.attributes?.find((a) => a.name === "showButtonOnly") + + const src = typeof srcAttr?.value === "string" ? srcAttr.value : "" + + // showButtonOnly is a boolean attribute - check for its presence or explicit value + let showButtonOnly = false + if (showButtonOnlyAttr) { + if ( + typeof showButtonOnlyAttr.value === "object" && + showButtonOnlyAttr.value && + "value" in showButtonOnlyAttr.value + ) { + showButtonOnly = Boolean(showButtonOnlyAttr.value.value) + } else if (showButtonOnlyAttr.value === undefined || showButtonOnlyAttr.value === null) { + // Attribute present without value means true + showButtonOnly = true + } + } + + if (!src) return + + if (showButtonOnly) { + // Generate Remix link + const fileName = path.basename(src) + const remixUrl = `https://remix.ethereum.org/#url=https://docs.chain.link/${src}` + + parent.children[index] = { + type: "paragraph", + children: [ + { + type: "link", + url: remixUrl, + children: [{ type: "text", value: `Open ${fileName} in Remix` } as Literal], + } as Parent & { url: string }, + ], + } as Parent + } else { + // Try to inline the code + const publicPath = path.join(process.cwd(), "public", src) + const possiblePaths = [publicPath, path.resolve(src), path.join(process.cwd(), "src", src)] + + let codeContent: string | null = null + for (const p of possiblePaths) { + if (fs.existsSync(p)) { + codeContent = fs.readFileSync(p, "utf-8") + break + } + } + + if (codeContent) { + // Detect language from file extension + const ext = path.extname(src).slice(1) + const lang = ext || "text" + + parent.children[index] = { + type: "code", + lang, + value: codeContent.trim(), + } as Literal & { lang: string } + } else { + // Fallback to link if file not found + const fileName = path.basename(src) + parent.children[index] = { + type: "paragraph", + children: [ + { + type: "text", + value: `Code sample: ${fileName} (file not found at build time)`, + } as Literal, + ], + } as Parent + } + } + } catch (e) { + console.warn(`Failed to process CodeSample in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle Billing component - generate markdown table with CCIP network fees + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleBilling( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + // Calculate fees using the same logic as Billing.astro + const lockAndUnlockAllLanes = calculateNetworkFeesForTokenMechanismDirect(TokenMechanism.LockAndUnlock, "allLanes") + const restFromEthereum = calculateNetworkFeesForTokenMechanismDirect(TokenMechanism.BurnAndMint, "fromEthereum") + const restToEthereum = calculateNetworkFeesForTokenMechanismDirect(TokenMechanism.BurnAndMint, "toEthereum") + const restMechanismNonEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "nonEthereum" + ) + const messagingFeesFromToEthereum = calculateMessagingNetworkFeesDirect("fromToEthereum") + const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("nonEthereum") + + // Generate markdown table + const tableRows = [ + "| Use case | Token Pool Mechanism | Lanes | LINK | Others |", + "|----------|----------------------|-------|------|--------|", + `| Token Transfers / Programmable Token Transfers | Lock and Unlock | All Lanes | ${lockAndUnlockAllLanes.linkFee} | ${lockAndUnlockAllLanes.gasTokenFee} |`, + `| Token Transfers / Programmable Token Transfers | Lock and Mint / Burn and Mint / Burn and Unlock | Non-Ethereum | ${restMechanismNonEthereum.linkFee} | ${restMechanismNonEthereum.gasTokenFee} |`, + `| Token Transfers / Programmable Token Transfers | Lock and Mint / Burn and Mint / Burn and Unlock | From: Ethereum | ${restFromEthereum.linkFee} | ${restFromEthereum.gasTokenFee} |`, + `| Token Transfers / Programmable Token Transfers | Lock and Mint / Burn and Mint / Burn and Unlock | To: Ethereum | ${restToEthereum.linkFee} | ${restToEthereum.gasTokenFee} |`, + `| Messaging | N/A | Non-Ethereum | ${messagingFeesNonEthereum.linkFee} | ${messagingFeesNonEthereum.gasTokenFee} |`, + `| Messaging | N/A | From/To: Ethereum | ${messagingFeesFromToEthereum.linkFee} | ${messagingFeesFromToEthereum.gasTokenFee} |`, + ] + + const markdownTable = tableRows.join("\n") + + // Parse the table markdown and insert it + const tableTree = context.processor.parse(markdownTable) + if (tableTree && tableTree.children) { + parent.children.splice(index, 1, ...tableTree.children) + return index + tableTree.children.length + } + } catch (e) { + console.warn(`Failed to process Billing in ${context.mdxAbsPath}:`, e) + // Fallback: replace with a note about the table + parent.children[index] = { + type: "paragraph", + children: [ + { + type: "text", + value: "(Network fee table - see https://docs.chain.link/ccip/billing for details)", + } as Literal, + ], + } as Parent + } +} diff --git a/src/lib/markdown/formatters.ts b/src/lib/markdown/formatters.ts new file mode 100644 index 00000000000..73161aa8a4b --- /dev/null +++ b/src/lib/markdown/formatters.ts @@ -0,0 +1,240 @@ +/** + * Shared markdown formatting utilities + * Used by both build-time (generate-llms.ts) and runtime (CopyPageLink) markdown generation + */ + +/** + * Format a heading at the specified level + */ +export function formatHeading(level: 1 | 2 | 3 | 4 | 5 | 6, text: string): string { + const hashes = "#".repeat(level) + return `${hashes} ${text}\n\n` +} + +/** + * Format a link + */ +export function formatLink(text: string, url: string): string { + return `[${text}](${url})` +} + +/** + * Format bold text + */ +export function formatBold(text: string): string { + return `**${text}**` +} + +/** + * Format italic text + */ +export function formatItalic(text: string): string { + return `*${text}*` +} + +/** + * Format inline code + */ +export function formatInlineCode(text: string): string { + return `\`${text}\`` +} + +/** + * Format a code block with optional language + */ +export function formatCodeBlock(code: string, language = ""): string { + return `\`\`\`${language}\n${code}\n\`\`\`\n\n` +} + +/** + * Format a blockquote + */ +export function formatBlockquote(text: string): string { + const lines = text.split("\n").filter((line) => line.trim()) + return lines.map((line) => `> ${line}`).join("\n") + "\n\n" +} + +/** + * Format a horizontal rule + */ +export function formatHorizontalRule(): string { + return "---\n\n" +} + +/** + * Format an unordered list + */ +export function formatUnorderedList(items: string[]): string { + return items.map((item) => `- ${item}`).join("\n") + "\n\n" +} + +/** + * Format an ordered list + */ +export function formatOrderedList(items: string[]): string { + return items.map((item, index) => `${index + 1}. ${item}`).join("\n") + "\n\n" +} + +/** + * Format a markdown table + * @param rows - Array of rows, where each row is an array of cell values + * @param hasHeader - Whether the first row should be treated as a header (default: true) + */ +export function formatTable(rows: string[][], hasHeader = true): string { + if (rows.length === 0) return "" + + let markdown = "" + const firstRow = rows[0] + + // Header row + markdown += `| ${firstRow.join(" | ")} |\n` + + // Separator row + if (hasHeader) { + markdown += `| ${firstRow.map(() => "---").join(" | ")} |\n` + } + + // Data rows (skip first if it's a header) + const dataRows = hasHeader ? rows.slice(1) : rows + dataRows.forEach((row) => { + // Pad rows to match header length + const paddedRow = [...row] + while (paddedRow.length < firstRow.length) { + paddedRow.push("") + } + markdown += `| ${paddedRow.join(" | ")} |\n` + }) + + return `${markdown}\n` +} + +/** + * Format an image + */ +export function formatImage(alt: string, src: string, title?: string): string { + const titlePart = title ? ` "${title}"` : "" + return `![${alt}](${src}${titlePart})` +} + +/** + * Format YAML frontmatter + */ +export function formatFrontmatter(data: Record): string { + const lines = ["---"] + + for (const [key, value] of Object.entries(data)) { + if (typeof value === "string" && (value.includes(":") || value.includes("#"))) { + // Quote strings that contain special YAML characters + lines.push(`${key}: "${value}"`) + } else if (typeof value === "string") { + lines.push(`${key}: ${value}`) + } else { + lines.push(`${key}: ${value}`) + } + } + + lines.push("---", "", "") + return lines.join("\n") +} + +/** + * Clean and normalize text content + * Fixes common encoding issues and normalizes whitespace + */ +export function cleanText(text: string): string { + return ( + text + // Fix common encoding issues + .replace(/’/g, "'") + .replace(/“/g, '"') + .replace(/â€/g, '"') + .replace(/…/g, "...") + .replace(/â€"/g, "—") + .replace(/â€"/g, "–") + // Also handle actual smart quotes (using Unicode escapes for clarity) + .replace(/[\u2018\u2019]/g, "'") // ' and ' + .replace(/[\u201C\u201D]/g, '"') // " and " + // Normalize whitespace + .replace(/\s+/g, " ") + .replace(/\n\s+\n/g, "\n\n") + // Remove zero-width characters + .replace(/[\u200B-\u200D\uFEFF]/g, "") + .trim() + ) +} + +/** + * Normalize markdown for comparison/consistency + * Useful for testing that different markdown generators produce similar output + */ +export function normalizeMarkdown(markdown: string): string { + return ( + markdown + // Normalize line endings + .replace(/\r\n/g, "\n") + // Normalize multiple blank lines to single blank line + .replace(/\n{3,}/g, "\n\n") + // Normalize whitespace at end of lines + .replace(/[ \t]+$/gm, "") + // Normalize list markers + .replace(/^[*+-]\s+/gm, "- ") + .trim() + ) +} + +/** + * Unescape markdown characters for plain text + * Useful when generating markdown that will be read as plain text + */ +export function unescapeMarkdown(text: string): string { + let inFence = false + return text + .split("\n") + .map((line) => { + const trimmed = line.trim() + if (trimmed.startsWith("```") || trimmed.startsWith("~~~")) { + inFence = !inFence + return line + } + if (inFence) return line + return line + .replace(/\\_/g, "_") + .replace(/\\\[/g, "[") + .replace(/\\\]/g, "]") + .replace(/\\\(/g, "(") + .replace(/\\\)/g, ")") + }) + .filter((line) => line.trim() !== "{/* prettier-ignore */}") + .join("\n") +} + +/** + * Strip highlighter comments from code + * Removes // highlight-line, // highlight-start, // highlight-end + */ +export function stripHighlightComments(code: string): string { + return code + .split("\n") + .map((line) => line.replace(/ *\/\/\s*highlight-(line|start|end)/, "")) + .join("\n") +} + +/** + * Resolve relative URL to absolute URL + */ +export function resolveUrl(url: string, baseUrl = typeof window !== "undefined" ? window.location.origin : ""): string { + if (url.startsWith("http://") || url.startsWith("https://")) { + return url + } + + if (url.startsWith("/")) { + return `${baseUrl}${url}` + } + + // For relative URLs, try to resolve them + try { + return new URL(url, baseUrl).href + } catch { + return url + } +} diff --git a/src/lib/markdown/index.ts b/src/lib/markdown/index.ts new file mode 100644 index 00000000000..f3342c8a4fa --- /dev/null +++ b/src/lib/markdown/index.ts @@ -0,0 +1,6 @@ +/** + * Markdown utilities for Chainlink documentation + * Shared between build-time and runtime markdown generation + */ + +export * from "./formatters.js" diff --git a/src/lib/markdown/rehypeCodeSampleFences.ts b/src/lib/markdown/rehypeCodeSampleFences.ts new file mode 100644 index 00000000000..4d2cc70fa69 --- /dev/null +++ b/src/lib/markdown/rehypeCodeSampleFences.ts @@ -0,0 +1,141 @@ +import { visit } from "unist-util-visit" + +import { getLanguageIconSrc, languageBadge } from "../codeSample/language.js" + +function toCamelCaseDataAttr(attr: string): string { + // "data-filename" -> "dataFilename" + return attr.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase()) +} + +function getProp(node: any, attr: string): unknown { + if (!node?.properties) return undefined + return node.properties[attr] ?? node.properties[toCamelCaseDataAttr(attr)] +} + +function deleteProp(node: any, attr: string): void { + if (!node?.properties) return + delete node.properties[attr] + delete node.properties[toCamelCaseDataAttr(attr)] +} + +function normalizeClassName(className: unknown): string[] { + if (!className) return [] + if (Array.isArray(className)) return className.map(String) + return String(className) + .split(/\s+/) + .map((c) => c.trim()) + .filter(Boolean) +} + +/** + * Convert `.code-sample[data-filename]` wrappers (created in remark) into full + * CodeSample-style blocks by inserting the header markup and adjusting the + * contained `
` for shared styling + copy-button behavior.
+ */
+export default function rehypeCodeSampleFences() {
+  return (tree: unknown) => {
+    visit(tree as any, "element", (node: any, index: number | undefined, parent: any) => {
+      if (!node || node.tagName !== "div") return
+
+      const classes = normalizeClassName(node.properties?.className)
+      if (!classes.includes("code-sample")) return
+
+      const filenameRaw = getProp(node, "data-filename")
+      const filename = typeof filenameRaw === "string" ? filenameRaw.trim() : ""
+      if (!filename) return
+
+      // Avoid double-inserting if this already has a header.
+      const hasHeader =
+        Array.isArray(node.children) &&
+        node.children.some(
+          (c: any) =>
+            c?.type === "element" &&
+            c?.tagName === "div" &&
+            normalizeClassName(c?.properties?.className).includes("code-sample__header")
+        )
+      if (hasHeader) return
+
+      const preEl =
+        Array.isArray(node.children) && node.children.find((c: any) => c?.type === "element" && c?.tagName === "pre")
+      if (!preEl) return
+
+      const languageRaw = getProp(node, "data-language") ?? getProp(preEl, "data-language")
+      const language = typeof languageRaw === "string" && languageRaw.trim() ? languageRaw.trim() : "text"
+      const languageKey = language.toLowerCase()
+      const iconSrc = getLanguageIconSrc(languageKey)
+
+      // Update the 
 node to match CodeSample behavior
+      const existing = normalizeClassName(preEl.properties?.className)
+      preEl.properties = preEl.properties || {}
+      preEl.properties.className = Array.from(
+        new Set([...existing, "code-sample__pre", "code-sample__pre--with-header"])
+      )
+      preEl.properties["data-no-copy-button"] = ""
+
+      const langSpan: any = {
+        type: "element",
+        tagName: "span",
+        properties: {
+          className: ["code-sample__lang", ...(iconSrc ? ["code-sample__lang--icon"] : [])],
+          "aria-hidden": "true",
+        },
+        children: iconSrc
+          ? [
+              {
+                type: "element",
+                tagName: "img",
+                properties: { className: ["code-sample__lang-icon"], src: iconSrc, alt: "" },
+                children: [],
+              },
+            ]
+          : [{ type: "text", value: languageBadge(languageKey) }],
+      }
+
+      const filenameSpan: any = {
+        type: "element",
+        tagName: "span",
+        properties: { className: ["code-sample__filename"], title: filename },
+        children: [{ type: "text", value: filename }],
+      }
+
+      const headerLeft: any = {
+        type: "element",
+        tagName: "div",
+        properties: { className: ["code-sample__header-left"] },
+        children: [langSpan, filenameSpan],
+      }
+
+      const copyButton: any = {
+        type: "element",
+        tagName: "button",
+        properties: { type: "button", className: ["code-sample__copy-button"], "aria-label": "Copy code" },
+        children: [
+          {
+            type: "element",
+            tagName: "img",
+            properties: { src: "/assets/icons/copyIcon.svg", alt: "Copy code", width: "16", height: "16" },
+            children: [],
+          },
+        ],
+      }
+
+      const header: any = {
+        type: "element",
+        tagName: "div",
+        properties: { className: ["code-sample__header"] },
+        children: [headerLeft, copyButton],
+      }
+
+      const wrapper: any = {
+        type: "element",
+        tagName: "div",
+        properties: { className: ["code-sample"], "data-language": languageKey },
+        children: [header, preEl],
+      }
+
+      // Replace this placeholder wrapper with the full wrapper (keeping only the pre).
+      // (We intentionally don't preserve `data-filename` in output markup.)
+      if (parent && typeof index === "number") parent.children[index] = wrapper
+    })
+  }
+}
diff --git a/src/lib/markdown/remarkCodeFenceFilename.ts b/src/lib/markdown/remarkCodeFenceFilename.ts
new file mode 100644
index 00000000000..e1a26b40e93
--- /dev/null
+++ b/src/lib/markdown/remarkCodeFenceFilename.ts
@@ -0,0 +1,117 @@
+import { visit } from "unist-util-visit"
+
+import { getLanguageIconSrc, languageBadge } from "../codeSample/language.js"
+
+const FILENAME_RE = /(?:^|\s)filename\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s]+))/i
+
+/**
+ * Wrap fenced code blocks that include `filename="..."` meta in a lightweight
+ * `.code-sample` container so we can add a CodeSample-like header in rehype
+ * (after syntax highlighting), while keeping the filename metadata intact.
+ */
+export default function remarkCodeFenceFilename() {
+  return (tree: unknown) => {
+    visit(tree as any, "code", (node: any, index: number | undefined, parent: any) => {
+      if (!parent || typeof index !== "number") return
+
+      const meta = typeof node?.meta === "string" ? node.meta : ""
+      if (!meta) return
+
+      const match = meta.match(FILENAME_RE)
+      if (!match) return
+
+      const filename = String(match[1] || match[2] || match[3] || "").trim()
+      if (!filename) return
+
+      const language = typeof node.lang === "string" && node.lang.trim() ? node.lang.trim().toLowerCase() : "text"
+
+      const iconSrc = getLanguageIconSrc(language)
+      const badge = languageBadge(language)
+
+      const langChildren = iconSrc
+        ? [
+            {
+              type: "mdxJsxFlowElement",
+              name: "img",
+              attributes: [
+                { type: "mdxJsxAttribute", name: "class", value: "code-sample__lang-icon" },
+                { type: "mdxJsxAttribute", name: "src", value: iconSrc },
+                { type: "mdxJsxAttribute", name: "alt", value: "" },
+              ],
+              children: [],
+            },
+          ]
+        : [{ type: "text", value: badge }]
+
+      const header = {
+        type: "mdxJsxFlowElement",
+        name: "div",
+        attributes: [{ type: "mdxJsxAttribute", name: "class", value: "code-sample__header" }],
+        children: [
+          {
+            type: "mdxJsxFlowElement",
+            name: "div",
+            attributes: [{ type: "mdxJsxAttribute", name: "class", value: "code-sample__header-left" }],
+            children: [
+              {
+                type: "mdxJsxFlowElement",
+                name: "span",
+                attributes: [
+                  {
+                    type: "mdxJsxAttribute",
+                    name: "class",
+                    value: `code-sample__lang${iconSrc ? " code-sample__lang--icon" : ""}`,
+                  },
+                  { type: "mdxJsxAttribute", name: "aria-hidden", value: "true" },
+                ],
+                children: langChildren,
+              },
+              {
+                type: "mdxJsxFlowElement",
+                name: "span",
+                attributes: [
+                  { type: "mdxJsxAttribute", name: "class", value: "code-sample__filename" },
+                  { type: "mdxJsxAttribute", name: "title", value: filename },
+                ],
+                children: [{ type: "text", value: filename }],
+              },
+            ],
+          },
+          {
+            type: "mdxJsxFlowElement",
+            name: "button",
+            attributes: [
+              { type: "mdxJsxAttribute", name: "type", value: "button" },
+              { type: "mdxJsxAttribute", name: "class", value: "code-sample__copy-button" },
+              { type: "mdxJsxAttribute", name: "aria-label", value: "Copy code" },
+            ],
+            children: [
+              {
+                type: "mdxJsxFlowElement",
+                name: "img",
+                attributes: [
+                  { type: "mdxJsxAttribute", name: "src", value: "/assets/icons/copyIcon.svg" },
+                  { type: "mdxJsxAttribute", name: "alt", value: "Copy code" },
+                  { type: "mdxJsxAttribute", name: "width", value: "16" },
+                  { type: "mdxJsxAttribute", name: "height", value: "16" },
+                ],
+                children: [],
+              },
+            ],
+          },
+        ],
+      }
+
+      parent.children[index] = {
+        type: "mdxJsxFlowElement",
+        name: "div",
+        attributes: [
+          { type: "mdxJsxAttribute", name: "class", value: "code-sample" },
+          { type: "mdxJsxAttribute", name: "data-language", value: language },
+          { type: "mdxJsxAttribute", name: "data-filename", value: filename },
+        ],
+        children: [header, node],
+      }
+    })
+  }
+}
diff --git a/src/lib/markdown/transformMarkdown.ts b/src/lib/markdown/transformMarkdown.ts
new file mode 100644
index 00000000000..58c20f5da64
--- /dev/null
+++ b/src/lib/markdown/transformMarkdown.ts
@@ -0,0 +1,285 @@
+/**
+ * Core markdown transformation using unified/remark pipeline
+ */
+
+import { unified } from "unified"
+import remarkParse from "remark-parse"
+import remarkMdx from "remark-mdx"
+import remarkGfm from "remark-gfm"
+import remarkStringify from "remark-stringify"
+import { visit } from "unist-util-visit"
+import type { Node, Parent, Literal } from "unist"
+import type { TransformConfig, MdxJsxNode, ComponentContext } from "./types.js"
+import {
+  handleCcipCommon,
+  handleCodeHighlightBlock,
+  handleCodeHighlightBlockMulti,
+  handleCopyText,
+  handleDiv,
+  handleAside,
+  handleClickToZoom,
+  handleCodeSample,
+  handleBilling,
+  loadCcipCommonMapping,
+} from "./componentHandlers.js"
+import fs from "fs"
+import path from "path"
+
+/**
+ * Convert Aside components to markdown blockquotes
+ * Handles multi-line Aside tags by converting them to blockquote format
+ * Preserves Asides with nested JSX components (they'll be handled by AST or remain as-is)
+ * @param content - Markdown content that may contain Aside components
+ * @returns Content with simple Aside tags converted to blockquotes
+ */
+function convertAsidesToBlockquotes(content: string): string {
+  // Match multi-line Aside components
+  const asideRegex = /([\s\S]*?)<\/Aside>/g
+
+  return content.replace(asideRegex, (fullMatch, type, title, children) => {
+    // Check if the Aside contains other JSX components (like Tabs, CopyText, etc.)
+    const hasJSXComponents = /<[A-Z]\w+/.test(children)
+
+    if (hasJSXComponents) {
+      // Keep as-is - these complex nested structures need manual handling
+      // or will be dropped by the AST handlers
+      return fullMatch
+    }
+
+    // Create a blockquote directly in markdown format
+    // This avoids JSX parsing issues entirely
+    const cleanChildren = children.trim()
+    const asideType = type.toUpperCase()
+    const header = title ? `**${asideType}: ${title}**` : `**${asideType}**`
+
+    // Return as markdown blockquote
+    return `\n\n> ${header}\n>\n> ${cleanChildren}\n\n`
+  })
+}
+
+/**
+ * Convert ClickToZoom components to markdown images
+ * Handles self-closing ClickToZoom tags by converting to standard markdown image syntax
+ * @param content - Markdown content that may contain ClickToZoom components
+ * @returns Content with ClickToZoom tags converted to markdown images
+ */
+function convertClickToZoomToImages(content: string): string {
+  // Match self-closing ClickToZoom tags with any attributes
+  // Captures src and alt, ignores other attributes like style
+  const clickToZoomRegex = /]*src="([^"]+)"[^>]*(?:alt="([^"]*)")?[^>]*\/>/g
+
+  return content.replace(clickToZoomRegex, (_, src, alt) => {
+    const altText = alt || "Image"
+    return `![${altText}](${src})`
+  })
+}
+
+/**
+ * Preprocess CcipCommon components by inlining their content
+ * This is essential because remarkMdx doesn't always parse self-closing JSX tags properly
+ * @param markdown - Raw markdown content
+ * @returns Markdown with CcipCommon components replaced by their content
+ */
+function preprocessCcipCommon(markdown: string): string {
+  const ccipCommonRegex = //g
+  let preprocessedMarkdown = markdown
+
+  for (const match of markdown.matchAll(ccipCommonRegex)) {
+    const [fullMatch, calloutName] = match
+    const calloutFileMap = loadCcipCommonMapping()
+    const fileName = calloutFileMap[calloutName]
+
+    if (fileName) {
+      const calloutPath = path.resolve("src/features/ccip", fileName)
+      if (fs.existsSync(calloutPath)) {
+        let calloutContent = fs.readFileSync(calloutPath, "utf-8")
+
+        // Strip frontmatter if present
+        if (calloutContent.trim().startsWith("---")) {
+          calloutContent = calloutContent.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, "")
+        }
+
+        // Strip import statements
+        calloutContent = calloutContent.replace(/^import\s+.+$/gm, "").trim()
+
+        // Convert Aside components to blockquotes
+        calloutContent = convertAsidesToBlockquotes(calloutContent)
+
+        // Replace the CcipCommon tag with the processed content
+        preprocessedMarkdown = preprocessedMarkdown.replace(fullMatch, "\n\n" + calloutContent + "\n\n")
+      }
+    }
+  }
+
+  return preprocessedMarkdown
+}
+
+/**
+ * Transform markdown content using unified/remark pipeline
+ * @param markdown - Raw markdown content
+ * @param mdxAbsPath - Absolute path to the MDX file
+ * @param config - Transformation configuration
+ * @returns Transformed markdown string
+ */
+export async function transformMarkdown(
+  markdown: string,
+  mdxAbsPath: string,
+  config: Partial = {}
+): Promise {
+  const { targetLanguage } = config
+
+  // Preprocessing pipeline - apply transformations before AST parsing
+  // This handles components that remarkMdx struggles to parse (multi-line JSX)
+
+  // Step 1: Preprocess CcipCommon components (inline callout content)
+  let preprocessedMarkdown = preprocessCcipCommon(markdown)
+
+  // Step 2: Convert Aside components to markdown blockquotes
+  // Applies to both main content and inlined CcipCommon content
+  preprocessedMarkdown = convertAsidesToBlockquotes(preprocessedMarkdown)
+
+  // Step 3: Convert ClickToZoom to markdown images
+  preprocessedMarkdown = convertClickToZoomToImages(preprocessedMarkdown)
+
+  // Create unified processor with remark plugins
+  const processor = unified()
+    .use(remarkParse)
+    .use(remarkMdx)
+    .use(remarkGfm)
+    .use(() => (tree: Node) => {
+      // Create context for component handlers
+      const context: ComponentContext = {
+        mdxAbsPath,
+        markdown,
+        targetLanguage,
+        processor,
+      }
+
+      visit(tree, (node: Node, index: number | undefined, parent: Parent | undefined) => {
+        if (!parent || typeof index !== "number") return
+
+        // Handle CodeHighlightBlockMulti
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "CodeHighlightBlockMulti") {
+          return handleCodeHighlightBlockMulti(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle CodeHighlightBlock
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "CodeHighlightBlock") {
+          return handleCodeHighlightBlock(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle CcipCommon
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "CcipCommon") {
+          return handleCcipCommon(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle Aside
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "Aside") {
+          return handleAside(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle ClickToZoom
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "ClickToZoom") {
+          return handleClickToZoom(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle CodeSample
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "CodeSample") {
+          return handleCodeSample(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle Billing
+        if (node.type === "mdxJsxFlowElement" && (node as MdxJsxNode).name === "Billing") {
+          return handleBilling(node as MdxJsxNode, parent, index, context)
+        }
+
+        // Handle MDX JSX text elements
+        if (node.type === "mdxJsxTextElement") {
+          const nodeName = (node as MdxJsxNode).name
+
+          // Handle CopyText
+          if (nodeName === "CopyText") {
+            return handleCopyText(node as MdxJsxNode, parent, index)
+          }
+
+          // Handle 
tags (often used for styling in tables) + if (nodeName === "div" && (node as Parent).children) { + return handleDiv(node as MdxJsxNode, parent, index) + } + } + + // Drop MDX/import/export nodes (except handled components) + if ( + (node.type === "mdxJsxFlowElement" && + (node as MdxJsxNode).name !== "Aside" && + (node as MdxJsxNode).name !== "CcipCommon" && + (node as MdxJsxNode).name !== "ClickToZoom" && + (node as MdxJsxNode).name !== "CodeSample" && + (node as MdxJsxNode).name !== "Billing") || + node.type === "mdxjsEsm" || + node.type === "import" || + node.type === "export" + ) { + parent.children.splice(index, 1) + return + } + + // Handle HTML nodes - drop them + if (node.type === "html") { + parent.children.splice(index, 1) + return + } + + // Handle JSX comments - drop them + if ( + (node.type === "mdxFlowExpression" || node.type === "mdxTextExpression") && + typeof (node as { value?: string }).value === "string" && + (node as { value?: string }).value?.trim().match(/^\/\*[\s\S]*?\*\/$/) + ) { + parent.children.splice(index, 1) + return + } + + // Replace images with their alt text + if (node.type === "image") { + const alt = (node as { alt?: string }).alt ? String((node as { alt?: string }).alt) : "Image" + parent.children[index] = { type: "text", value: `(Image: ${alt})` } as Literal + } + + // Note: We preserve link nodes as-is so they're rendered as markdown links [text](url) + }) + }) + .use(remarkStringify, { + fences: true, + bullet: "-", + }) + + const file = await processor.process(preprocessedMarkdown) + let result = String(file) + + // Remove any JSX comments that might have slipped through as text + result = result + .split("\n") + .filter((line) => !line.trim().match(/^{\/\*.*?\*\/}$/)) + .join("\n") + + return result +} + +/** + * Transform a single page to markdown with metadata + * @param mdxContent - Raw MDX content + * @param mdxAbsPath - Absolute path to MDX file + * @param config - Transformation configuration + * @returns Transformed markdown with frontmatter + */ +export async function transformPageToMarkdown( + mdxContent: string, + mdxAbsPath: string, + config: Partial = {} +): Promise { + // Transform the markdown + const transformed = await transformMarkdown(mdxContent, mdxAbsPath, config) + + return transformed +} diff --git a/src/lib/markdown/types.ts b/src/lib/markdown/types.ts new file mode 100644 index 00000000000..5362f96a33f --- /dev/null +++ b/src/lib/markdown/types.ts @@ -0,0 +1,112 @@ +/** + * Type definitions for markdown transformation library + */ + +import type { Node, Parent } from "unist" + +/** + * Metadata about a documentation page + */ +export interface PageMetadata { + /** Page title */ + title: string + /** Canonical URL */ + sourceUrl: string + /** Last modified date (ISO string) */ + lastModified?: string + /** Section (e.g., 'ccip', 'vrf') */ + section?: string + /** SDK language (for language-specific pages) */ + sdkLang?: string +} + +/** + * Frontmatter extracted from MDX files + */ +export interface Frontmatter { + /** Raw body content (without frontmatter) */ + body: string + /** Page title from frontmatter */ + fmTitle?: string + /** Last modified date from metadata */ + fmLastModified?: string + /** SDK language */ + sdkLang?: string +} + +/** + * MDX JSX attribute + */ +export interface MdxJsxAttribute { + name: string + value?: string | { value: string } | { data?: { estree?: { body?: unknown[] } } } +} + +/** + * MDX JSX node in the AST + */ +export interface MdxJsxNode extends Node { + name?: string + attributes?: MdxJsxAttribute[] +} + +/** + * Context passed to component handlers + */ +export interface ComponentContext { + /** Absolute path to the MDX file being processed */ + mdxAbsPath: string + /** Original markdown content */ + markdown: string + /** Target language (if any) */ + targetLanguage?: string + /** Unified processor instance */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + processor: any +} + +/** + * Handler function for custom components + */ +export type ComponentHandler = ( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +) => number | void + +/** + * Configuration for markdown transformation + */ +export interface TransformConfig { + /** Base URL for the documentation site */ + siteBase: string + /** Target language for language-specific content */ + targetLanguage?: string + /** Whether to include frontmatter in output */ + includeFrontmatter?: boolean + /** Custom component handlers */ + componentHandlers?: Record +} + +/** + * Result of markdown transformation + */ +export interface TransformResult { + /** The transformed markdown content */ + markdown: string + /** Metadata extracted from the page */ + metadata: PageMetadata +} + +/** + * Code block with metadata + */ +export interface CodeBlock { + /** Programming language */ + lang: string + /** Code content */ + value: string + /** Optional title */ + title?: string +} diff --git a/src/lib/markdown/utils.ts b/src/lib/markdown/utils.ts new file mode 100644 index 00000000000..1fad5aaa9d5 --- /dev/null +++ b/src/lib/markdown/utils.ts @@ -0,0 +1,154 @@ +/** + * Utility functions for markdown transformation + */ + +import path from "path" +import type { Frontmatter } from "./types.js" + +/** + * Extract frontmatter from raw MDX content + * @param raw - Raw MDX file content + * @returns Frontmatter data and body content + */ +export function extractFrontmatter(raw: string): Frontmatter { + // Lightweight frontmatter extractor to avoid extra deps + // Supports triple-dash YAML frontmatter at the start of the file + if (raw.startsWith("---")) { + const end = raw.indexOf("\n---", 3) + if (end > 0) { + const fm = raw.slice(3, end).trim() + const body = raw.slice(end + 4) + // Very minimal parsing for title, metadata.lastModified, and sdkLang + const fmTitleMatch = fm.match(/^\s*title:\s*"?(.+?)"?\s*$/m) + const lastModMatch = fm.match(/^\s*metadata:\s*[\s\S]*?lastModified:\s*"?(.+?)"?\s*$/m) + const sdkLangMatch = fm.match(/^\s*sdkLang:\s*"?(.+?)"?\s*$/m) + const fmTitle = fmTitleMatch ? fmTitleMatch[1] : undefined + const fmLastModified = lastModMatch ? lastModMatch[1] : undefined + const sdkLang = sdkLangMatch ? sdkLangMatch[1] : undefined + return { body, fmTitle, fmLastModified, sdkLang } + } + } + return { body: raw } +} + +/** + * Convert absolute file path to content-relative path + * @param absFile - Absolute file path + * @returns Path relative to src/content/ + */ +export function toContentRelative(absFile: string): string { + const idx = absFile.indexOf(path.normalize("src/content/")) + return idx >= 0 ? absFile.slice(idx + "src/content/".length) : absFile +} + +/** + * Convert content-relative path to canonical URL + * @param section - Section name (e.g., 'ccip') + * @param relFromContent - Path relative to src/content/ + * @param siteBase - Base URL for the site + * @returns Full canonical URL + */ +export function toCanonicalUrl(section: string, relFromContent: string, siteBase: string): string { + // relFromContent like "ccip/index.mdx" or "ccip/foo/bar.mdx" + const withoutExt = relFromContent.replace(/\.(md|mdx)$/i, "") + let slug = withoutExt + if (slug.endsWith("/index")) slug = slug.slice(0, -"/index".length) + if (!slug.startsWith(section)) slug = `${section}/${slug}` + if (!slug.startsWith("/")) slug = `/${slug}` + return `${siteBase}${slug}` +} + +/** + * Infer page title from file path + * @param relFromContent - Path relative to src/content/ + * @returns Inferred title + */ +export function inferTitleFromPath(relFromContent: string): string { + const base = path.basename(relFromContent, path.extname(relFromContent)) + if (base.toLowerCase() === "index") { + const parts = relFromContent.split(path.sep).filter(Boolean) + return parts.length >= 2 ? titleCase(parts[parts.length - 2]) : "Documentation" + } + return titleCase(base) +} + +/** + * Convert string to title case + * @param s - Input string + * @returns Title-cased string + */ +export function titleCase(s: string): string { + return s + .replace(/[-_]/g, " ") + .replace(/\s+/g, " ") + .trim() + .replace(/\b\w/g, (m) => m.toUpperCase()) +} + +/** + * Get page language from filename or frontmatter + * @param absFile - Absolute file path + * @param sdkLang - SDK language from frontmatter + * @returns Language code or null if not language-specific + */ +export function getPageLanguage(absFile: string, sdkLang?: string): string | null { + // Return the language if specified in frontmatter + if (sdkLang) return sdkLang.toLowerCase() + + // Check filename suffix (e.g., "page-go.mdx" -> "go", "page-ts.mdx" -> "ts") + const basename = path.basename(absFile, path.extname(absFile)) + const match = basename.match(/-(go|ts)$/) + if (match) return match[1] + + // No language specified = common to all languages + return null +} + +/** + * Check if page should be included in language-specific file + * @param pageLanguage - Language of the page + * @param targetLanguage - Target language for the file + * @returns True if page should be included + */ +export function shouldIncludeInLanguageFile(pageLanguage: string | null, targetLanguage: string): boolean { + // Include if page is common (no language) or matches target language + return pageLanguage === null || pageLanguage === targetLanguage +} + +/** + * Convert value to ISO date string + * @param val - Date value (string or Date) + * @returns ISO date string (YYYY-MM-DD) or undefined + */ +export function getIsoStringOrUndefined(val: unknown): string | undefined { + if (typeof val !== "string") return undefined + const d = new Date(val) + return isNaN(d.getTime()) ? undefined : d.toISOString().slice(0, 10) +} + +/** + * Unescape markdown for plain text output + * @param s - Markdown string + * @returns Unescaped string + */ +export function unescapeForPlainText(s: string): string { + let inFence = false + return s + .split("\n") + .map((line) => { + const trimmed = line.trim() + if (trimmed.startsWith("```") || trimmed.startsWith("~~~")) { + inFence = !inFence + return line + } + if (inFence) return line + return line + .replace(/\\_/g, "_") + .replace(/\\\[/g, "[") + .replace(/\\\]/g, "]") + .replace(/\\\(/g, "(") + .replace(/\\\)/g, ")") + }) + .filter((line) => line.trim() !== "{/* prettier-ignore */}") + .join("\n") +} diff --git a/src/lib/solana/index.ts b/src/lib/solana/index.ts index ab6c225c01c..a4f53569577 100644 --- a/src/lib/solana/index.ts +++ b/src/lib/solana/index.ts @@ -10,7 +10,7 @@ * 4. Wallet - Browser wallet integration * * Migration Complete: All legacy code has been removed. - * Use DripOrchestrator from @api/ccip/services/faucet/drip-orchestrator for business logic. + * Use DripOrchestrator from ~/lib/ccip/services-api/faucet/drip-orchestrator for business logic. */ // Core layer - Pure utilities with no dependencies diff --git a/src/pages/api/ccip/types/index.ts b/src/pages/api/ccip/types/index.ts deleted file mode 100644 index f2a74d933ff..00000000000 --- a/src/pages/api/ccip/types/index.ts +++ /dev/null @@ -1,231 +0,0 @@ -// Chain Data API Types - -import { Environment } from "@config/data/ccip/types.ts" - -export { Environment } - -// Chain type and family declarations -export type ChainType = "evm" | "solana" | "aptos" | "sui" -export type ChainFamily = "evm" | "mvm" | "svm" - -export const prerender = false - -/** - * Enriched fee token information with address and metadata - * Used when enrichFeeTokens=true query parameter is set - */ -export type FeeTokenEnriched = { - symbol: string - name: string - address: string - decimals: number -} - -export type ChainConfigError = { - chainId: number - networkId: string - reason: string - missingFields: string[] -} - -export type ChainMetadata = { - environment: Environment - timestamp: string - requestId: string - ignoredChainCount: number -} - -export interface ChainDetails { - chainId: number | string - displayName: string - selector: string - internalId: string - feeTokens: string[] | FeeTokenEnriched[] - router: string - rmn: string - chainType: ChainType - chainFamily: ChainFamily - registryModule?: string - tokenAdminRegistry?: string - tokenPoolFactory?: string - feeQuoter?: string - mcms?: string -} - -export type ChainApiResponse = { - metadata: ChainMetadata - data: Record> - ignored: { - chainId: number - networkId: string - reason: string - missingFields: string[] - chain_id?: string - }[] -} - -export type OutputKeyType = "chainId" | "selector" | "internalId" - -export type ChainApiError = { - error: string - message: string -} - -export interface FilterType { - chainId?: string - selector?: string - internalId?: string -} - -export type SelectorEntry = { - selector: string - name: string -} - -export type SelectorsConfig = { - selectors: Record -} - -// Token Data API Types - -export type TokenConfigError = { - symbol: string - reason: string - missingFields: string[] -} - -export type TokenMetadata = { - environment: Environment - timestamp: string - requestId: string - ignoredTokenCount: number - validTokenCount: number -} - -export type TokenChainData = { - chainId: number | string - chainName: string - decimals: number - destinations: string[] - name: string - poolAddress: string - poolType: string - symbol: string - tokenAddress: string -} - -export type TokenDataResponse = { - [key: string]: { - [chainKey: string]: TokenChainData - } -} - -export type TokenServiceResponse = { - tokens: TokenDataResponse - errors: TokenConfigError[] - metadata: { - validTokenCount: number - ignoredTokenCount: number - } -} - -export type TokenApiResponse = { - metadata: TokenMetadata - data: TokenDataResponse - ignored: TokenConfigError[] -} - -export interface TokenFilterType { - token_id?: string - chain_id?: string -} - -// Lane Data API Types - -export type LaneConfigError = { - sourceChain: string - destinationChain: string - reason: string - missingFields: string[] -} - -export type LaneMetadata = { - environment: Environment - timestamp: string - requestId: string - ignoredLaneCount: number - validLaneCount: number -} - -// Internal interface with chainType and chainFamily for processing -export interface ChainInfoInternal { - chainId: number | string - displayName: string - selector: string - internalId: string - chainType: ChainType - chainFamily: ChainFamily -} - -// Public interface for API responses without chainType and chainFamily -export interface ChainInfo { - chainId: number | string - displayName: string - selector: string - internalId: string -} - -export interface LaneDetails { - sourceChain: ChainInfo - destinationChain: ChainInfo - onRamp: { - address: string - version: string - enforceOutOfOrder?: boolean - } - offRamp: { - address: string - version: string - } - supportedTokens: string[] -} - -export type LaneDataResponse = Record - -export type LaneServiceResponse = { - data: LaneDataResponse - errors: LaneConfigError[] - metadata: { - validLaneCount: number - ignoredLaneCount: number - } -} - -export type LaneApiResponse = { - metadata: LaneMetadata - data: LaneDataResponse - ignored: LaneConfigError[] -} - -export interface LaneFilterType { - sourceChainId?: string - destinationChainId?: string - sourceSelector?: string - destinationSelector?: string - sourceInternalId?: string - destinationInternalId?: string - version?: string -} - -// Faucet API Types -export type { - FaucetChainConfig, - ChallengeParams, - ChallengeResponse, - VerifyRequest, - VerifyResponse, - VerifySignatureArgs, - FamilyAdapter, - FaucetApiResponse, - FaucetError, -} from "./faucet.ts" diff --git a/src/pages/api/ccip/v1/chains.ts b/src/pages/api/ccip/v1/chains.ts index 64413aa9d68..98933605e8e 100644 --- a/src/pages/api/ccip/v1/chains.ts +++ b/src/pages/api/ccip/v1/chains.ts @@ -7,18 +7,17 @@ import { generateChainKey, createMetadata, handleApiError, - successHeaders, - commonHeaders, loadChainConfiguration, FilterType, APIErrorType, createErrorResponse, CCIPError, -} from "../utils.ts" +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" -import type { ChainDetails, ChainApiResponse } from "../types/index.ts" -import { ChainDataService } from "../../services/chain-data.ts" +import type { ChainDetails, ChainApiResponse } from "~/lib/ccip/types/index.ts" +import { ChainDataService } from "~/lib/ccip/services/chain-data.ts" export const prerender = false @@ -45,7 +44,7 @@ export const GET: APIRoute = async ({ request }) => { // Validate filters const filters: FilterType = { - chainId: params.get("chainId") || undefined, + chainId: params.get("chain_id") || undefined, selector: params.get("selector") || undefined, internalId: params.get("internalId") || undefined, } @@ -57,15 +56,15 @@ export const GET: APIRoute = async ({ request }) => { }) // Validate output key - const outputKey = validateOutputKey(params.get("outputKey") || undefined) + const outputKey = validateOutputKey(params.get("output_key") || undefined) logger.debug({ message: "Output key validated", requestId, outputKey, }) - // Validate enrichFeeTokens parameter - const enrichFeeTokens = validateEnrichFeeTokens(params.get("enrichFeeTokens") || undefined) + // Validate enrich_fee_tokens parameter + const enrichFeeTokens = validateEnrichFeeTokens(params.get("enrich_fee_tokens") || undefined) logger.debug({ message: "EnrichFeeTokens parameter validated", requestId, @@ -105,7 +104,7 @@ export const GET: APIRoute = async ({ request }) => { acc[family] = chainList.reduce( (familyAcc, chain) => { const key = - outputKey === "chainId" + outputKey === "chain_id" ? generateChainKey(chain.chainId, chain.chainType, outputKey) : outputKey ? chain[outputKey].toString() @@ -133,7 +132,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ diff --git a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts index 9c578ededb1..c6d7405c9cb 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts @@ -1,8 +1,9 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { commonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" import { getFaucetConfig } from "@lib/core/config/index.ts" -import { FaucetService } from "../../../../services/faucet-service.ts" +import { FaucetService } from "~/lib/ccip/services/faucet-service.ts" export const prerender = false export const runtime = "nodejs" // Required for crypto operations diff --git a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts index 4d88f178c45..23ef79769f7 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts @@ -1,11 +1,12 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { commonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" -import { FaucetService } from "../../../../services/faucet-service.ts" -import { SvmDripAdapter } from "@api/ccip/faucet/adapters/svm-drip.ts" -import { resolveFaucetChain } from "@api/ccip/faucet/chain-resolver.ts" -import { handleFaucetError } from "@api/ccip/services/faucet/error-handler.ts" -import { ChainConfigurationService } from "@api/ccip/services/chain-config.ts" +import { FaucetService } from "~/lib/ccip/services/faucet-service.ts" +import { SvmDripAdapter } from "~/lib/ccip/faucet/adapters/svm-drip.ts" +import { resolveFaucetChain } from "~/lib/ccip/faucet/chain-resolver.ts" +import { handleFaucetError } from "~/lib/ccip/services-api/faucet/error-handler.ts" +import { ChainConfigurationService } from "~/lib/ccip/services-api/chain-config.ts" export const prerender = false export const runtime = "nodejs" diff --git a/src/pages/api/ccip/v1/drips/[chainName]/index.ts b/src/pages/api/ccip/v1/drips/[chainName]/index.ts index b89cee85286..323a6466fad 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/index.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/index.ts @@ -1,7 +1,8 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { commonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" -import { FaucetService } from "../../../../services/faucet-service.ts" +import { FaucetService } from "~/lib/ccip/services/faucet-service.ts" export const prerender = false export const runtime = "nodejs" // Required for crypto operations diff --git a/src/pages/api/ccip/v1/lanes.ts b/src/pages/api/ccip/v1/lanes.ts index d0936224e3f..64788866101 100644 --- a/src/pages/api/ccip/v1/lanes.ts +++ b/src/pages/api/ccip/v1/lanes.ts @@ -3,16 +3,15 @@ import { validateEnvironment, validateOutputKey, handleApiError, - successHeaders, - commonHeaders, APIErrorType, createErrorResponse, CCIPError, -} from "../utils.ts" +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" -import type { LaneFilterType, LaneApiResponse, LaneMetadata } from "../types/index.ts" -import { LaneDataService } from "../../services/lane-data.ts" +import type { LaneFilterType, LaneApiResponse, LaneMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" export const prerender = false @@ -39,12 +38,12 @@ export const GET: APIRoute = async ({ request }) => { // Get filters for lanes const filters: LaneFilterType = { - sourceChainId: params.get("sourceChainId") || undefined, - destinationChainId: params.get("destinationChainId") || undefined, - sourceSelector: params.get("sourceSelector") || undefined, - destinationSelector: params.get("destinationSelector") || undefined, - sourceInternalId: params.get("sourceInternalId") || undefined, - destinationInternalId: params.get("destinationInternalId") || undefined, + sourceChainId: params.get("source_chain_id") || undefined, + destinationChainId: params.get("destination_chain_id") || undefined, + sourceSelector: params.get("source_selector") || undefined, + destinationSelector: params.get("destination_selector") || undefined, + sourceInternalId: params.get("source_internal_id") || undefined, + destinationInternalId: params.get("destination_internal_id") || undefined, version: params.get("version") || undefined, } @@ -55,7 +54,7 @@ export const GET: APIRoute = async ({ request }) => { }) // Validate output key - const outputKey = validateOutputKey(params.get("outputKey") || undefined) + const outputKey = validateOutputKey(params.get("output_key") || undefined) logger.debug({ message: "Output key validated", requestId, @@ -117,7 +116,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ diff --git a/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts new file mode 100644 index 00000000000..afbdf413edd --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { LaneDetailApiResponse, LaneDetailMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP lane detail request (by-chain-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source chain ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination chain ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails(environment, source, destination, "chain_id") + + if (!result.data) { + throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) + } + + logger.info({ + message: "Lane detail data retrieved successfully", + requestId, + source, + destination, + }) + + // Create lane detail metadata + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing lane detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lane detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts new file mode 100644 index 00000000000..555dec2a5db --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { SupportedTokensApiResponse, SupportedTokensMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP supported tokens request (by-chain-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source chain ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination chain ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits(environment, source, destination, "chain_id") + + if (!result.data) { + throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) + } + + logger.info({ + message: "Supported tokens data retrieved successfully", + requestId, + source, + destination, + tokenCount: result.tokenCount, + }) + + // Create metadata + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + tokenCount: result.tokenCount, + } + + const response: SupportedTokensApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing supported tokens request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process supported tokens request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts new file mode 100644 index 00000000000..9d0a9ca98ff --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { LaneDetailApiResponse, LaneDetailMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP lane detail request (by-internal-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source internal ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination internal ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails(environment, source, destination, "internal_id") + + if (!result.data) { + throw new CCIPError(404, `Lane from '${source}' to '${destination}' not found`) + } + + logger.info({ + message: "Lane detail data retrieved successfully", + requestId, + source, + destination, + }) + + // Create lane detail metadata + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing lane detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lane detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts new file mode 100644 index 00000000000..93fc939158e --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,116 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { SupportedTokensApiResponse, SupportedTokensMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP supported tokens request (by-internal-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source internal ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination internal ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits( + environment, + source, + destination, + "internal_id" + ) + + if (!result.data) { + throw new CCIPError(404, `Lane from '${source}' to '${destination}' not found`) + } + + logger.info({ + message: "Supported tokens data retrieved successfully", + requestId, + source, + destination, + tokenCount: result.tokenCount, + }) + + // Create metadata + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + tokenCount: result.tokenCount, + } + + const response: SupportedTokensApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing supported tokens request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process supported tokens request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts new file mode 100644 index 00000000000..2a39109fd82 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { LaneDetailApiResponse, LaneDetailMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP lane detail request (by-selector)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source selector is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination selector is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails(environment, source, destination, "selector") + + if (!result.data) { + throw new CCIPError(404, `Lane from selector '${source}' to selector '${destination}' not found`) + } + + logger.info({ + message: "Lane detail data retrieved successfully", + requestId, + source, + destination, + }) + + // Create lane detail metadata + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing lane detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lane detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts new file mode 100644 index 00000000000..8b5ab782a39 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { SupportedTokensApiResponse, SupportedTokensMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP supported tokens request (by-selector)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source selector is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination selector is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits(environment, source, destination, "selector") + + if (!result.data) { + throw new CCIPError(404, `Lane from selector '${source}' to selector '${destination}' not found`) + } + + logger.info({ + message: "Supported tokens data retrieved successfully", + requestId, + source, + destination, + tokenCount: result.tokenCount, + }) + + // Create metadata + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + tokenCount: result.tokenCount, + } + + const response: SupportedTokensApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing supported tokens request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process supported tokens request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/rate-limits.ts b/src/pages/api/ccip/v1/rate-limits.ts new file mode 100644 index 00000000000..57644869eb8 --- /dev/null +++ b/src/pages/api/ccip/v1/rate-limits.ts @@ -0,0 +1,114 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateRateLimitsFilters, + createRateLimitsMetadata, + handleApiError, + APIErrorType, + createErrorResponse, + CCIPError, +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { RateLimitsApiResponse } from "~/lib/ccip/types/index.ts" +import { RateLimitsDataService } from "~/lib/ccip/services/rate-limits-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ request }) => { + const requestId = crypto.randomUUID() + + try { + logger.info({ + message: "Processing CCIP rate-limits request", + requestId, + url: request.url, + }) + + const url = new URL(request.url) + const params = url.searchParams + + // Validate environment + const environment = validateEnvironment(params.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate and parse rate limits filters + const filters = validateRateLimitsFilters({ + sourceInternalId: params.get("source_internal_id") || undefined, + destinationInternalId: params.get("destination_internal_id") || undefined, + tokens: params.get("tokens") || undefined, + direction: params.get("direction") || undefined, + rateType: params.get("rate_type") || undefined, + }) + + logger.debug({ + message: "Filter parameters validated", + requestId, + filters, + }) + + const rateLimitsService = new RateLimitsDataService() + const { data, metadata: serviceMetadata } = await rateLimitsService.getFilteredRateLimits(environment, filters) + + logger.info({ + message: "Rate limits data retrieved successfully", + requestId, + tokenCount: serviceMetadata.tokenCount, + sourceChain: filters.sourceInternalId, + destinationChain: filters.destinationInternalId, + }) + + // Create rate-limits-specific metadata + const metadata = createRateLimitsMetadata( + environment, + filters.sourceInternalId, + filters.destinationInternalId, + serviceMetadata.tokenCount + ) + + const response: RateLimitsApiResponse = { + metadata, + data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing rate-limits request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process rate-limits request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/tokens.ts b/src/pages/api/ccip/v1/tokens.ts index c11a39d77e5..ad40a3a149c 100644 --- a/src/pages/api/ccip/v1/tokens.ts +++ b/src/pages/api/ccip/v1/tokens.ts @@ -4,17 +4,16 @@ import { validateOutputKey, createTokenMetadata, handleApiError, - successHeaders, - commonHeaders, APIErrorType, createErrorResponse, CCIPError, loadChainConfiguration, -} from "../utils.ts" +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" -import type { TokenFilterType, TokenApiResponse } from "../types/index.ts" -import { TokenDataService } from "../../services/token-data.ts" +import type { TokenFilterType, TokenApiResponse } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" export const prerender = false @@ -52,7 +51,7 @@ export const GET: APIRoute = async ({ request }) => { }) // Validate output key - we'll still use this for formatting display options - const outputKey = validateOutputKey(params.get("outputKey") || undefined) + const outputKey = validateOutputKey(params.get("output_key") || undefined) logger.debug({ message: "Output key validated", requestId, @@ -100,7 +99,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ diff --git a/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts new file mode 100644 index 00000000000..630c2ab3419 --- /dev/null +++ b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts @@ -0,0 +1,122 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateOutputKey, + handleApiError, + APIErrorType, + createErrorResponse, + CCIPError, +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { TokenDetailApiResponse, TokenDetailMetadata } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { tokenCanonicalSymbol } = params + + logger.info({ + message: "Processing CCIP token detail request", + requestId, + url: request.url, + tokenCanonicalSymbol, + }) + + // Validate token symbol is provided + if (!tokenCanonicalSymbol) { + throw new CCIPError(400, "tokenCanonicalSymbol parameter is required") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate output key for chain representation + const outputKey = validateOutputKey(queryParams.get("output_key") || undefined) + logger.debug({ + message: "Output key validated", + requestId, + outputKey, + }) + + const tokenDataService = new TokenDataService() + const result = await tokenDataService.getTokenWithFinality(environment, tokenCanonicalSymbol, outputKey) + + if (!result) { + throw new CCIPError(404, `Token '${tokenCanonicalSymbol}' not found`) + } + + logger.info({ + message: "Token detail data retrieved successfully", + requestId, + tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + }) + + // Create token detail metadata + const metadata: TokenDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + tokenSymbol: tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + } + + const response: TokenDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing token detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process token detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts new file mode 100644 index 00000000000..236414283cd --- /dev/null +++ b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts @@ -0,0 +1,122 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateOutputKey, + handleApiError, + APIErrorType, + createErrorResponse, + CCIPError, +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { TokenFinalityApiResponse, TokenDetailMetadata } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { tokenCanonicalSymbol } = params + + logger.info({ + message: "Processing CCIP token finality request", + requestId, + url: request.url, + tokenCanonicalSymbol, + }) + + // Validate token symbol is provided + if (!tokenCanonicalSymbol) { + throw new CCIPError(400, "tokenCanonicalSymbol parameter is required") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate output key for chain representation + const outputKey = validateOutputKey(queryParams.get("output_key") || undefined) + logger.debug({ + message: "Output key validated", + requestId, + outputKey, + }) + + const tokenDataService = new TokenDataService() + const result = await tokenDataService.getTokenFinality(environment, tokenCanonicalSymbol, outputKey) + + if (!result) { + throw new CCIPError(404, `Token '${tokenCanonicalSymbol}' not found`) + } + + logger.info({ + message: "Token finality data retrieved successfully", + requestId, + tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + }) + + // Create token finality metadata + const metadata: TokenDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + tokenSymbol: tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + } + + const response: TokenFinalityApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing token finality request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process token finality request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/page-markdown.ts b/src/pages/api/page-markdown.ts new file mode 100644 index 00000000000..d48e412ca57 --- /dev/null +++ b/src/pages/api/page-markdown.ts @@ -0,0 +1,139 @@ +/** + * API endpoint to generate markdown for a single page + * GET /api/page-markdown?path=/ccip/getting-started + */ + +import type { APIRoute } from "astro" +import fs from "fs/promises" +import path from "path" +import { transformPageToMarkdown } from "@lib/markdown/transformMarkdown.js" +import { extractFrontmatter, toCanonicalUrl, toContentRelative, getIsoStringOrUndefined } from "@lib/markdown/utils.js" +import { textPlainHeaders } from "@lib/api/cacheHeaders.js" + +const SITE_BASE = "https://docs.chain.link" + +// In-memory cache for transformed markdown +// TTL: 5 minutes (matches CDN cache duration) +const markdownCache = new Map() +const CACHE_TTL = 300_000 // 5 minutes in milliseconds + +export const prerender = false + +export const GET: APIRoute = async ({ request }) => { + const startTime = Date.now() + + try { + const url = new URL(request.url) + const requestedPath = url.searchParams.get("path") + const targetLanguage = url.searchParams.get("lang") || undefined + + if (!requestedPath) { + return new Response(JSON.stringify({ error: "Missing 'path' parameter" }), { + status: 400, + headers: { "Content-Type": "application/json" }, + }) + } + + // Check in-memory cache first (cache key includes language for multi-lang pages) + const cacheKey = targetLanguage ? `${requestedPath}:${targetLanguage}` : requestedPath + const cached = markdownCache.get(cacheKey) + if (cached && Date.now() - cached.timestamp < CACHE_TTL) { + const processingTime = Date.now() - startTime + return new Response(cached.markdown, { + status: 200, + headers: { + ...textPlainHeaders, + "X-Cache": "HIT", + "X-Processing-Time": `${processingTime}ms`, + }, + }) + } + + // Convert URL path to file path + // e.g., "/ccip/getting-started" -> "src/content/ccip/getting-started.mdx" + const cleanPath = requestedPath.startsWith("/") ? requestedPath.slice(1) : requestedPath + const possiblePaths = [ + path.resolve(`src/content/${cleanPath}.mdx`), + path.resolve(`src/content/${cleanPath}/index.mdx`), + path.resolve(`src/content/${cleanPath}.md`), + path.resolve(`src/content/${cleanPath}/index.md`), + ] + + let mdxAbsPath: string | null = null + for (const p of possiblePaths) { + try { + await fs.access(p) + mdxAbsPath = p + break + } catch { + // File doesn't exist, try next + } + } + + if (!mdxAbsPath) { + return new Response(JSON.stringify({ error: `Page not found: ${requestedPath}` }), { + status: 404, + headers: { "Content-Type": "application/json" }, + }) + } + + // Read the MDX file + const raw = await fs.readFile(mdxAbsPath, "utf-8") + const { body, fmTitle, fmLastModified } = extractFrontmatter(raw) + + // Extract section from path (first segment) + const section = cleanPath.split("/")[0] + + // Transform to markdown + const transformed = await transformPageToMarkdown(body, mdxAbsPath, { + siteBase: SITE_BASE, + targetLanguage, + }) + + // Generate metadata + const relFromContent = toContentRelative(mdxAbsPath) + const sourceUrl = toCanonicalUrl(section, relFromContent, SITE_BASE) + const title = fmTitle || path.basename(mdxAbsPath, path.extname(mdxAbsPath)) + const lastModified = getIsoStringOrUndefined(fmLastModified) + + // Format output with frontmatter + const headerLines = [ + `# ${title}`, + `Source: ${sourceUrl}`, + ...(lastModified ? [`Last Updated: ${lastModified}`] : []), + "", + "", + ] + + const finalMarkdown = [...headerLines, transformed.trim()].join("\n") + + // Store in cache (cache key includes language for multi-lang pages) + markdownCache.set(cacheKey, { + markdown: finalMarkdown, + timestamp: Date.now(), + }) + + const processingTime = Date.now() - startTime + + return new Response(finalMarkdown, { + status: 200, + headers: { + ...textPlainHeaders, + "X-Cache": "MISS", + "X-Processing-Time": `${processingTime}ms`, + }, + }) + } catch (error) { + console.error("Error generating markdown:", error) + return new Response( + JSON.stringify({ + error: "Internal server error", + message: error instanceof Error ? error.message : "Unknown error", + }), + { + status: 500, + headers: { "Content-Type": "application/json" }, + } + ) + } +} diff --git a/src/pages/api/services/lane-data.ts b/src/pages/api/services/lane-data.ts deleted file mode 100644 index 211bb888393..00000000000 --- a/src/pages/api/services/lane-data.ts +++ /dev/null @@ -1,392 +0,0 @@ -import { - Environment, - LaneDetails, - LaneFilterType, - LaneConfigError, - LaneServiceResponse, - ChainInfo, - ChainInfoInternal, - OutputKeyType, - ChainType, - ChainFamily, -} from "../ccip/types/index.ts" -import { loadReferenceData, Version } from "@config/data/ccip/index.ts" -import type { LaneConfig, ChainConfig } from "@config/data/ccip/types.ts" -import { generateChainKey, normalizeVersion } from "@api/ccip/utils.ts" -import { logger } from "@lib/logging/index.js" -import { - getChainId, - getTitle, - getChainTypeAndFamily, - directoryToSupportedChain, -} from "../../../features/utils/index.ts" - -export const prerender = false - -/** - * Service class for handling CCIP lane data operations - * Provides functionality to validate and filter lane configurations - */ -export class LaneDataService { - private errors: LaneConfigError[] = [] - private readonly requestId: string - private skippedLanesCount = 0 - - /** - * Creates a new instance of LaneDataService - */ - constructor() { - this.requestId = crypto.randomUUID() - - logger.debug({ - message: "LaneDataService initialized", - requestId: this.requestId, - }) - } - - /** - * Retrieves and filters lane data based on environment and filters - * - * @param environment - Network environment (mainnet/testnet) - * @param filters - Filter parameters for lanes - * @param outputKey - Format to use for displaying lane keys - * @returns Filtered lane data with metadata - */ - async getFilteredLanes( - environment: Environment, - filters: LaneFilterType, - outputKey: OutputKeyType - ): Promise { - logger.debug({ - message: "Processing lane data", - requestId: this.requestId, - environment, - filters, - outputKey, - }) - - try { - // Load reference data - const { lanesReferenceData, chainsReferenceData } = loadReferenceData({ - environment, - version: Version.V1_2_0, - }) - - const result: Record = {} - this.errors = [] - this.skippedLanesCount = 0 - - // Process all lanes - for (const [sourceChainKey, destinations] of Object.entries(lanesReferenceData)) { - for (const [destChainKey, laneConfig] of Object.entries(destinations)) { - try { - // Get chain information - const sourceChain = this.resolveChainInfo(sourceChainKey, chainsReferenceData) - const destChain = this.resolveChainInfo(destChainKey, chainsReferenceData) - - if (!sourceChain || !destChain) { - this.addError(sourceChainKey, destChainKey, "Failed to resolve chain information", [ - "sourceChain", - "destinationChain", - ]) - continue - } - - // Apply filters - if (!this.passesFilters(sourceChain, destChain, filters)) { - this.skippedLanesCount++ - continue - } - - // Generate lane key - const laneKey = this.generateLaneKey(sourceChain, destChain, outputKey) - - // Build lane details - const laneDetails = this.buildLaneDetails(sourceChain, destChain, laneConfig) - - // Check for version mismatch - if (laneDetails.onRamp.version !== laneDetails.offRamp.version) { - this.addError( - sourceChainKey, - destChainKey, - `Version mismatch: onRamp v${laneDetails.onRamp.version} != offRamp v${laneDetails.offRamp.version}`, - ["version"] - ) - continue - } - - // Apply version filter if provided - if (filters.version) { - // Both onRamp and offRamp must match the specified version - if (laneDetails.onRamp.version !== filters.version || laneDetails.offRamp.version !== filters.version) { - this.skippedLanesCount++ - continue - } - } - - result[laneKey] = laneDetails - - logger.debug({ - message: "Lane processed successfully", - requestId: this.requestId, - laneKey, - sourceChain: sourceChainKey, - destinationChain: destChainKey, - }) - } catch (error) { - this.addError( - sourceChainKey, - destChainKey, - `Lane processing failed: ${error instanceof Error ? error.message : "Unknown error"}`, - ["laneConfig"] - ) - } - } - } - - const validLaneCount = Object.keys(result).length - const ignoredLaneCount = this.errors.length - - logger.info({ - message: "Lane data processing completed", - requestId: this.requestId, - validLaneCount, - ignoredLaneCount, - skippedLanesCount: this.skippedLanesCount, - }) - - return { - data: result, - errors: this.errors, - metadata: { - validLaneCount, - ignoredLaneCount, - }, - } - } catch (error) { - logger.error({ - message: "Failed to process lane data", - requestId: this.requestId, - error: error instanceof Error ? error.message : "Unknown error", - }) - - throw error - } - } - - /** - * Resolves chain information from chain key - */ - private resolveChainInfo(chainKey: string, chainsReferenceData: Record): ChainInfoInternal | null { - try { - const chainConfig = chainsReferenceData[chainKey] - - if (!chainConfig) { - return null - } - - // Try to get supported chain for additional info, but don't fail if not found - let chainId: string | number = chainKey // fallback to chainKey - let displayName: string = chainKey // fallback to chainKey - let chainType: ChainType = "evm" // default to evm - let chainFamily: ChainFamily = "evm" // default to evm - - try { - const supportedChain = directoryToSupportedChain(chainKey) - const resolvedChainId = getChainId(supportedChain) - const resolvedDisplayName = getTitle(supportedChain) - const { chainType: resolvedChainType, chainFamily: resolvedChainFamily } = getChainTypeAndFamily(supportedChain) - - if (resolvedChainId) chainId = resolvedChainId - if (resolvedDisplayName) displayName = resolvedDisplayName - chainType = resolvedChainType - chainFamily = resolvedChainFamily - } catch { - // If directoryToSupportedChain fails, continue with fallback values - // This allows processing of chains not yet in the mapping - } - - // Get selector from chain configuration - const configData = chainConfig as ChainConfig - const selector = configData.chainSelector - - if (!selector) { - return null - } - - return { - chainId, - displayName, - selector, - internalId: chainKey, - chainType, - chainFamily, - } - } catch (error) { - logger.warn({ - message: "Failed to resolve chain info", - requestId: this.requestId, - chainKey, - error: error instanceof Error ? error.message : "Unknown error", - }) - return null - } - } - - /** - * Checks if a lane passes the given filters - */ - private passesFilters( - sourceChain: ChainInfoInternal, - destChain: ChainInfoInternal, - filters: LaneFilterType - ): boolean { - // Check source chain filters - if (filters.sourceChainId && !this.matchesChainFilter(sourceChain, filters.sourceChainId, "chainId")) { - return false - } - if (filters.sourceSelector && !this.matchesChainFilter(sourceChain, filters.sourceSelector, "selector")) { - return false - } - if (filters.sourceInternalId && !this.matchesChainFilter(sourceChain, filters.sourceInternalId, "internalId")) { - return false - } - - // Check destination chain filters - if (filters.destinationChainId && !this.matchesChainFilter(destChain, filters.destinationChainId, "chainId")) { - return false - } - if (filters.destinationSelector && !this.matchesChainFilter(destChain, filters.destinationSelector, "selector")) { - return false - } - if ( - filters.destinationInternalId && - !this.matchesChainFilter(destChain, filters.destinationInternalId, "internalId") - ) { - return false - } - - return true - } - - /** - * Checks if a chain matches a specific filter value - */ - private matchesChainFilter( - chain: ChainInfoInternal, - filterValue: string, - filterType: "chainId" | "selector" | "internalId" - ): boolean { - const filterValues = filterValue.split(",").map((v) => v.trim()) - const chainValue = chain[filterType].toString() - - // For chainId, also check generated chain key format - if (filterType === "chainId") { - const generatedKey = generateChainKey(chain.chainId, chain.chainType, "chainId") - return filterValues.includes(chainValue) || filterValues.includes(generatedKey) - } - - return filterValues.includes(chainValue) - } - - /** - * Generates a lane key based on source and destination chains - */ - private generateLaneKey( - sourceChain: ChainInfoInternal, - destChain: ChainInfoInternal, - outputKey: OutputKeyType - ): string { - const sourceKey = - outputKey === "chainId" - ? generateChainKey(sourceChain.chainId, sourceChain.chainType, outputKey) - : sourceChain[outputKey].toString() - - const destKey = - outputKey === "chainId" - ? generateChainKey(destChain.chainId, destChain.chainType, outputKey) - : destChain[outputKey].toString() - - return `${sourceKey}_to_${destKey}` - } - - /** - * Builds lane details from chain info and lane config - */ - private buildLaneDetails( - sourceChain: ChainInfoInternal, - destChain: ChainInfoInternal, - laneConfig: LaneConfig - ): LaneDetails { - // Convert internal chain info to public interface (remove chainType and chainFamily) - const publicSourceChain: ChainInfo = { - chainId: sourceChain.chainId, - displayName: sourceChain.displayName, - selector: sourceChain.selector, - internalId: sourceChain.internalId, - } - - const publicDestChain: ChainInfo = { - chainId: destChain.chainId, - displayName: destChain.displayName, - selector: destChain.selector, - internalId: destChain.internalId, - } - - return { - sourceChain: publicSourceChain, - destinationChain: publicDestChain, - onRamp: { - address: laneConfig.onRamp.address, - version: normalizeVersion(laneConfig.onRamp.version), - enforceOutOfOrder: laneConfig.onRamp.enforceOutOfOrder, - }, - offRamp: { - address: laneConfig.offRamp.address, - version: normalizeVersion(laneConfig.offRamp.version), - }, - supportedTokens: this.extractSupportedTokens(laneConfig), - } - } - - /** - * Extracts supported token keys from lane configuration - */ - private extractSupportedTokens(laneConfig: LaneConfig): string[] { - if (!laneConfig.supportedTokens) { - return [] - } - - // Extract token keys from supportedTokens object - // lanes.json structure: "supportedTokens": { "LINK": {...}, "CCIP-BnM": {...} } - return Object.keys(laneConfig.supportedTokens) - } - - /** - * Adds an error to the error collection - */ - private addError(sourceChain: string, destinationChain: string, reason: string, missingFields: string[]): void { - this.errors.push({ - sourceChain, - destinationChain, - reason, - missingFields, - }) - - logger.warn({ - message: "Lane validation error", - requestId: this.requestId, - sourceChain, - destinationChain, - reason, - missingFields, - }) - } - - /** - * Gets the request ID for this service instance - */ - getRequestId(): string { - return this.requestId - } -} diff --git a/src/pages/ccip/directory/mainnet/verifiers/index.astro b/src/pages/ccip/directory/mainnet/verifiers/index.astro new file mode 100644 index 00000000000..07aad33d482 --- /dev/null +++ b/src/pages/ccip/directory/mainnet/verifiers/index.astro @@ -0,0 +1,8 @@ +--- +import Verifiers from "~/components/CCIP/Verifiers/Verifiers.astro" +import { Environment } from "~/config/data/ccip" + +export const prerender = true +--- + + diff --git a/src/pages/ccip/directory/testnet/verifiers/index.astro b/src/pages/ccip/directory/testnet/verifiers/index.astro new file mode 100644 index 00000000000..a6101109fd7 --- /dev/null +++ b/src/pages/ccip/directory/testnet/verifiers/index.astro @@ -0,0 +1,8 @@ +--- +import Verifiers from "~/components/CCIP/Verifiers/Verifiers.astro" +import { Environment } from "~/config/data/ccip" + +export const prerender = true +--- + + diff --git a/src/pages/certification.astro b/src/pages/certification.astro index 2753c60246a..81d22dc18ea 100644 --- a/src/pages/certification.astro +++ b/src/pages/certification.astro @@ -72,21 +72,18 @@ const formattedContentTitle = `Courses | Chainlink Certifications` width="Auto" height="Auto" alt="" - srcset="/images/certification/image-200-p-500.png 500w, /images/certification/image-200.png 606w" sizes="(max-width: 606px) 100vw, 606px" class="plat-absolute plat-absolute--1" /> @@ -189,7 +186,6 @@ const formattedContentTitle = `Courses | Chainlink Certifications` src="/images/certification/Imagedevhubvideo.png" loading="lazy" sizes="(max-width: 560px) 100vw, 560px" - srcset="/images/certification/Imagedevhubvideo-p-500.png 500w, /images/certification/Imagedevhubvideo.png 560w" alt="" class="cover-image" /> @@ -216,7 +212,6 @@ const formattedContentTitle = `Courses | Chainlink Certifications` src="/images/certification/Imagedevhubresources.png" loading="lazy" sizes="(max-width: 560px) 100vw, 560px" - srcset="/images/certification/Imagedevhubresources-p-500.png 500w, /images/certification/Imagedevhubresources.png 560w" alt="" class="cover-image" /> diff --git a/src/pages/changelog/index.astro b/src/pages/changelog/index.astro deleted file mode 100644 index bd5a13d790d..00000000000 --- a/src/pages/changelog/index.astro +++ /dev/null @@ -1,103 +0,0 @@ ---- -import BaseLayout from "~/layouts/BaseLayout.astro" -import * as CONFIG from "../../config" -import { Typography } from "@chainlink/blocks" - -import { getSecret } from "astro:env/server" -import { searchClient, SearchClient } from "@algolia/client-search" -import { ChangelogItem } from "~/components/ChangelogSnippet/types" -import ChangelogCard from "~/components/ChangelogSnippet/ChangelogCard.astro" -const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.title}` - -const appId = getSecret("ALGOLIA_APP_ID") -const apiKey = getSecret("PUBLIC_ALGOLIA_SEARCH_PUBLIC_API_KEY") - -let client: SearchClient -let logs: ChangelogItem[] | undefined = undefined - -// Initialize client if appId and apiKey are available to avoid needing to update -// the github actions with the new keys (satisfies linkcheck-internal) -if (appId && apiKey) { - client = searchClient(appId, apiKey) - - const req = await client.search({ - requests: [ - { - indexName: "Changelog", - restrictSearchableAttributes: ["topic"], - }, - ], - }) - - const firstResult = req.results[0] - const results = "hits" in firstResult ? (firstResult.hits as ChangelogItem[]) : [] - console.log(results[1]) - // logs are returned sorted by created_at DESC - logs = results -} ---- - - -
-
- Changelog - Never miss an update -
- -
- {logs?.map((log) => )} -
-
-
- - diff --git a/src/pages/cre/[...id].astro b/src/pages/cre/[...id].astro index 7c2b40919ba..9f7ef425b52 100644 --- a/src/pages/cre/[...id].astro +++ b/src/pages/cre/[...id].astro @@ -107,24 +107,28 @@ if (isCanonical) { --- + {/* noindex for redirect pages */} + {isCanonical && } + { - isCanonical ? ( + isCanonical && (
- NAV + SmartData - NAV (v9) + SmartData (v9) Net Asset Value (NAV)Net Asset Value (NAV), Proof of Reserve (POR) aum, navPerShare, navDate, ripcord
- Tokenized Asset + Tokenized Asset Tokenized Asset (v10) Backed xStockTokenized equities price, tokenizedPrice, marketStatus, currentMultiplier,{" "} newMultiplier @@ -155,18 +155,18 @@ The [RWA Advanced (v11)](/data-streams/reference/report-schema-v11) report schem These advanced fields enable protocols to implement more sophisticated risk management and settlement logic. Where applicable, streams using this schema can provide coverage across extended trading sessions including pre-market, post-market, and overnight hours — though extended hours availability varies by stream. See individual [RWA stream details](/data-streams/rwa-streams?schema=v11) for specific coverage and the [RWA Advanced (v11) reference](/data-streams/reference/report-schema-v11) for complete field specifications. -## Net Asset Value (NAV) +## SmartData -[Chainlink NAV streams](/data-streams/nav-streams) use the [NAV (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). +[Chainlink SmartData streams](/data-streams/smartdata-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to data such as Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios, as well as Proof of Reserve data. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). NAV is a fundamental financial metric that represents the value of an investment vehicle such as a mutual fund or ETF and is calculated as the total assets minus the total liabilities. -Data Streams ensures that any NAV update, whenever it occurs, is captured and made available immediately and at low latency, allowing for seamless integration with onchain applications alongside other real-time data streams. Although the NAV value may not change frequently, Data Streams provides the most recent NAV as soon as it is published by the source. +Data Streams ensures that any SmartData update, whenever it occurs, is captured and made available immediately and at low latency, allowing for seamless integration with onchain applications alongside other real-time data streams. Although the values may not change frequently, Data Streams provides the most recent data as soon as it is published by the source. ## Tokenized Asset -[Chainlink Tokenized Asset streams](/data-streams/backed-streams) use the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) report schema to provide financial market data for tokenized equities such as [xStock](https://xstocks.com/us) assets. These streams combine data from US equity streams with data from the tokenization service to enable users to handle corporate actions affecting the underlying equities. Each report includes the staleness measure (`lastUpdateTimestamp`), consensus mid price (`price`), market status (`marketStatus`), current multiplier (`currentMultiplier`, the number of underlying shares each xStock is redeemable for), new multiplier (`newMultiplier`, the future number of shares after a scheduled corporate action), activation date/time of the corporate action (`activationDateTime`) and the tokenized price if available on primary or secondary markets (`tokenizedPrice`). +[Chainlink Tokenized Asset streams](/data-streams/tokenized-asset-streams) use the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) report schema to provide financial market data for tokenized equities. These streams combine data from US equity streams with data from tokenization services to enable users to handle corporate actions affecting the underlying equities. Each report includes the staleness measure (`lastUpdateTimestamp`), consensus mid price (`price`), market status (`marketStatus`), current multiplier (`currentMultiplier`, the number of underlying shares each tokenized asset is redeemable for), new multiplier (`newMultiplier`, the future number of shares after a scheduled corporate action), activation date/time of the corporate action (`activationDateTime`) and the tokenized price if available on primary or secondary markets (`tokenizedPrice`). The underlying US equities trade on traditional exchanges during [market hours](/data-streams/market-hours). These market hours depend per asset class and can be subject to unexpected halts, pauses and other behaviors affecting traditional markets. For this reason, this class of Data Streams contains a market hours flag and a staleness measure to equip our users to handle these events correctly. It is critical that users implement correct safeguards on their end to pause markets, add more conservative risk caps, or implement other measures appropriate for their application. -[Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) is designed specifically for tokenized equities such as xStocks and contains data from the Chainlink US equities streams, combined with data provided by the tokenizer to properly handle corporate actions. With this enhanced data users are able to handle expected and unexpected market events such as pauses, halts and market off hours. The tokenization provider layers in data around the `currentMultiplier`, the `newMultiplier` and the `activationDateTime` of the new multiplier to handle corporate actions. +[Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) is designed specifically for tokenized equities and contains data from the Chainlink US equities streams, combined with data provided by the tokenizer to properly handle corporate actions. With this enhanced data users are able to handle expected and unexpected market events such as pauses, halts and market off hours. The tokenization provider layers in data around the `currentMultiplier`, the `newMultiplier` and the `activationDateTime` of the new multiplier to handle corporate actions. diff --git a/src/content/data-streams/reference/report-schema-v10.mdx b/src/content/data-streams/reference/report-schema-v10.mdx index 08f8498104a..7dfc49a4b17 100644 --- a/src/content/data-streams/reference/report-schema-v10.mdx +++ b/src/content/data-streams/reference/report-schema-v10.mdx @@ -5,7 +5,7 @@ title: "Report Schema: Tokenized Asset (v10)" metadata: title: "Tokenized Asset (v10) | Chainlink Data Streams" description: "Learn about Chainlink Data Streams Tokenized Asset (v10) schema, including fields, encoding, and examples for integrating tokenized asset data in your applications." - keywords: ["Report Schema", "Tokenized Assets", "Backed xStock", "v10 Schema", "Data Format", "Report Structure"] + keywords: ["Report Schema", "Tokenized Assets", "Tokenized Equities", "v10 Schema", "Data Format", "Report Structure"] --- import DataStreams from "@features/data-streams/common/DataStreams.astro" @@ -16,7 +16,7 @@ import Aside from "@components/Aside.astro" -Chainlink Backed xStock Data Streams adhere to the report schema outlined below. +Chainlink Tokenized Asset Data Streams adhere to the report schema outlined below. ### Schema Fields @@ -38,15 +38,17 @@ Chainlink Backed xStock Data Streams adhere to the report schema outlined below. {/* prettier-ignore */} **Notes:** -- Future Backed xStock streams may use different report schemas. +- Future Tokenized Asset streams may use different report schemas. - `price` updates in real time during market open, but may become stale during market closed periods. - `currentMultiplier` reflects all past corporate actions and is updated only when a new action is activated. - `activationDateTime` and `newMultiplier` provide advance notice of upcoming corporate actions, allowing protocols to prepare. -- See more detailed guidance for handling stock splits in the [Best Practices](/data-streams/concepts/best-practices#handling-stock-splits-for-tokenized-assets) documentation. +- See more detailed guidance for handling stock splits in the [Handling Stock Splits](/data-streams/tokenized-asset-streams/handling-stock-splits) documentation. diff --git a/src/content/data-streams/reference/report-schema-v11.mdx b/src/content/data-streams/reference/report-schema-v11.mdx index 25278ef3faf..a388c135d32 100644 --- a/src/content/data-streams/reference/report-schema-v11.mdx +++ b/src/content/data-streams/reference/report-schema-v11.mdx @@ -22,6 +22,16 @@ metadata: import DataStreams from "@features/data-streams/common/DataStreams.astro" import ReportSchemaTabs from "@features/data-streams/common/ReportSchemaTabs.astro" +import { Aside } from "@components" + +{/* Fix for the table cutting off/overflowing */} + + + @@ -30,41 +40,72 @@ Chainlink Data Streams that use the RWA Advanced (v11) schema adhere to the stru ## Schema Fields -| Field | Type | Description | -| ----------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `feedId` | `bytes32` | Unique identifier for the Data Streams feed | -| `validFromTimestamp` | `uint32` | Earliest timestamp when the price is valid (seconds) | -| `observationsTimestamp` | `uint32` | Latest timestamp when the price is valid (seconds) | -| `nativeFee` | `uint192` | Cost to verify report onchain (native token) | -| `linkFee` | `uint192` | Cost to verify report onchain (LINK) | -| `expiresAt` | `uint32` | Expiration date of the report (seconds) | -| `mid` | `int192` | Liquidity-weighted mid price | -| `lastSeenTimestampNs` | `uint64` | Staleness indicator based on mid price (nanoseconds) | -| `bid` | `int192` | Median bid price | -| `bidVolume` | `int192` | Volume at bid price | -| `ask` | `int192` | Median ask price | -| `askVolume` | `int192` | Volume at ask price | -| `lastTradedPrice` | `int192` | Last traded price | -| `marketStatus` | `uint32` | Status of the real-world equity market.
Possible values:
`0` (Unknown),
`1` (Pre-market extended hours),
`2` (Regular hours),
`3` (Post-market hours),
`4` (Overnight),
`5` (Weekend)
[More details](#market-status-values) | +| Field | Type | Description | +| ----------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| `feedId` | `bytes32` | Unique identifier for the Data Streams feed | +| `validFromTimestamp` | `uint32` | Earliest timestamp when the price is valid (seconds) | +| `observationsTimestamp` | `uint32` | Latest timestamp when the price is valid (seconds) | +| `nativeFee` | `uint192` | Cost to verify report onchain (native token) | +| `linkFee` | `uint192` | Cost to verify report onchain (LINK) | +| `expiresAt` | `uint32` | Expiration date of the report (seconds) | +| `mid` | `int192` | DON Consensus mid-price | +| `lastSeenTimestampNs` | `uint64` | Reflects the timestamp of the last update for the **mid price only** (nanoseconds). See [Notes](#notes) below. | +| `bid` | `int192` | Median bid price | +| `bidVolume` | `int192` | Volume at bid price. See [bid/ask volume note](#bidask-volume-note) below. | +| `ask` | `int192` | Median ask price | +| `askVolume` | `int192` | Volume at ask price. See [bid/ask volume note](#bidask-volume-note) below. | +| `lastTradedPrice` | `int192` | Last traded price | +| `marketStatus` | `uint32` | Status of the real-world asset market. Values depend on the stream's supported hours. See [Market Status Values](#market-status-values) for details. | ### Market Status Values -The `marketStatus` field reflects the current state of the equity market: +The `marketStatus` field indicates the current state of the market. The possible values vary depending on the stream's supported trading hours: + +#### Standard RWA Streams + +For streams with standard market hours coverage. Unless a feed explicitly states extended hours support, it is assumed to follow this format: + +| Value | Status | Description | +| ----- | ----------- | ---------------------------------- | +| `0` | **Unknown** | Market status cannot be determined | +| `1` | **Closed** | Market is closed | +| `2` | **Open** | Market is open | + +#### 24/5 US Equities Streams + +For streams with 24/5 extended hours coverage (e.g., US Equities): -| Value | Status | Hours (ET) | Description | -| ----- | ----------------- | ------------------------------------- | ---------------------------------------------- | -| `0` | **Unknown** | — | Market status cannot be determined | -| `1` | **Pre-market** | 4:00am–9:30am Mon–Fri | Extended hours before regular trading session | -| `2` | **Regular hours** | 9:30am–4:00pm Mon–Fri | Primary trading session with highest liquidity | -| `3` | **Post-market** | 4:00pm–8:00pm Mon–Fri | Extended hours after regular trading session | -| `4` | **Overnight** | 8:00pm–4:00am Sun evening–Fri morning | Overnight session with limited liquidity | -| `5` | **Weekend** | 8:00pm Fri–8:00pm Sun | Weekend period when primary markets are closed | +| Value | Status | Normal Hours (ET) | Description | +| ----- | ----------------- | ------------------------------------- | ---------------------------------------------------------- | +| `0` | **Unknown** | — | Market status cannot be determined | +| `1` | **Pre-market** | 4:00am–9:30am Mon–Fri | Extended hours before regular trading session | +| `2` | **Regular hours** | 9:30am–4:00pm Mon–Fri | Primary trading session with highest liquidity | +| `3` | **Post-market** | 4:00pm–8:00pm Mon–Fri | Extended hours after regular trading session | +| `4` | **Overnight** | 8:00pm–4:00am Sun evening–Fri morning | Overnight session with limited liquidity | +| `5` | **Closed** | — | Market closed (weekends, holidays, or unexpected closures) | -Users should implement appropriate safeguards based on market status, such as pausing trading, adjusting risk parameters, or implementing staleness checks during non-regular hours. +Users should implement appropriate safeguards based on market status, such as pausing trading, adjusting risk parameters, or implementing staleness checks during non-regular hours or closed periods. + + ### Notes +#### Last Seen Timestamp + +- `lastSeenTimestampNs` helps applications detect stale data for the mid price, especially important during market transitions and holidays. +- **IMPORTANT**: The `lastSeenTimestampNs` field reflects the timestamp of the last update for the `mid` price only. Do not assume this timestamp applies to `bid`, `ask`, `bidVolume`, `askVolume`, or `lastTradedPrice`. Different fields may have been updated at different times. + +#### Bid/Ask Volume + +For U.S. equities, there is no single consolidated order book. Instead, multiple venues each maintain their own order books. Because data providers source from different markets, the `bidVolume` and `askVolume` reported at each update come from one specific order book at a time, not an aggregate across all venues. + +As a result, these volume fields should not be treated as a proxy for total market liquidity at the top of book. They are informational and not especially representative in fragmented markets like U.S. equities. + +#### Additional Notes + - Future streams using this format may adopt different report schemas as needed. -- `lastSeenTimestampNs` helps applications detect stale data, especially important during market transitions and holidays. -- Market status cannot detect public holidays. See [Market Hours](/data-streams/market-hours) for major holiday periods. - Data availability and sourcing vary by session. Liquidity is typically highest during regular hours and lower during extended and overnight sessions. diff --git a/src/content/data-streams/reference/report-schema-v8.mdx b/src/content/data-streams/reference/report-schema-v8.mdx index 061a3ec2fe8..aee16c91a8c 100644 --- a/src/content/data-streams/reference/report-schema-v8.mdx +++ b/src/content/data-streams/reference/report-schema-v8.mdx @@ -35,5 +35,5 @@ RWA streams adhere to the report schema outlined below. - `marketStatus`: - Users are responsible for handling market status changes in their applications. - - For further guidance, refer to the [Market Hours Best Practices](/data-streams/concepts/best-practices#market-hours) documentation. + - For further guidance, refer to the [Handling Market Events](/data-streams/rwa-streams/handling-market-events) documentation. - Future RWA streams may use different report schemas. diff --git a/src/content/data-streams/reference/report-schema-v9.mdx b/src/content/data-streams/reference/report-schema-v9.mdx index 6474bacd7ef..26f6756affc 100644 --- a/src/content/data-streams/reference/report-schema-v9.mdx +++ b/src/content/data-streams/reference/report-schema-v9.mdx @@ -1,11 +1,22 @@ --- section: dataStreams date: Last Modified -title: "Report Schema: NAV (v9)" +title: "Report Schema: SmartData (v9)" metadata: - title: "NAV (v9) | Chainlink Data Streams" - description: "Learn about Chainlink Data Streams NAV (v9) schema, including fields, encoding, and examples for integrating NAV data in your applications." - keywords: ["Report Schema", "NAV", "Net Asset Value", "v9 Schema", "Data Format", "Report Structure"] + title: "SmartData (v9) | Chainlink Data Streams" + description: "Learn about Chainlink Data Streams SmartData (v9) schema, including fields, encoding, and examples for integrating NAV and POR data in your applications." + keywords: + [ + "Report Schema", + "SmartData", + "NAV", + "POR", + "Net Asset Value", + "Proof of Reserve", + "v9 Schema", + "Data Format", + "Report Structure", + ] --- import DataStreams from "@features/data-streams/common/DataStreams.astro" @@ -15,7 +26,7 @@ import ReportSchemaTabs from "@features/data-streams/common/ReportSchemaTabs.ast -Chainlink NAV Data Streams streams adhere to the report schema outlined below. +Chainlink SmartData streams adhere to the report schema outlined below. ### Schema Fields @@ -34,7 +45,7 @@ Chainlink NAV Data Streams streams adhere to the report schema outlined below. **Notes:** -- Future NAV streams may use different report schemas. +- Future SmartData streams may use different report schemas. ##### `ripcord` Status diff --git a/src/content/data-streams/rwa-streams/24-5-us-equities-user-guide.mdx b/src/content/data-streams/rwa-streams/24-5-us-equities-user-guide.mdx new file mode 100644 index 00000000000..c20768fee36 --- /dev/null +++ b/src/content/data-streams/rwa-streams/24-5-us-equities-user-guide.mdx @@ -0,0 +1,402 @@ +--- +section: dataStreams +date: "Last Modified" +title: "24/5 US Equities User Guide" +metadata: + title: "24/5 US Equities User Guide | Chainlink Data Streams" + description: "User guide for Chainlink 24/5 U.S. Equities Streams, covering schema, feeds, continuous price feed composition, and risk management." +whatsnext: + { + "Find the schema of data to expect from Data Streams reports: RWA Advanced (v11)": "/data-streams/reference/report-schema-v11", + "Learn about Data Streams market hours and schedules": "/data-streams/market-hours", + } +--- + +import { Aside, ClickToZoom } from "@components" +import { Tabs } from "@components/Tabs" +import { FeedList } from "@features/feeds" + +Chainlink 24/5 U.S. Equities Streams provide real-time equity pricing data across all major U.S. single-name equities and ETFs spanning regular, pre-market, post-market, and overnight trading sessions. The [advanced RWA schema](/data-streams/reference/report-schema-v11) includes fields such as market status flags, best bid and ask prices, bid and ask volumes, staleness measures, and last traded prices to facilitate more advanced execution and risk management. + + + +The data referenced in this document covers 24/5 trading hours in US equities on a range of traditional venues. While there is currently no trading activity in traditional markets over the weekend on any venue, protocols can extend their pricing coverage to 24/7 in multiple ways, such as leveraging the pricing of [tokenized stocks](#stream-switching-example-logic) on secondary markets such as CEXes and DEXes. + +Developers are responsible for choosing the appropriate feed and ensuring that the operation and performance of their choice matches expectations. For more information, please visit the Chainlink [documentation](/data-streams/developer-responsibilities). + +## Schema + +The data is delivered using the [RWA Advanced (v11) schema](/data-streams/reference/report-schema-v11). + +This advanced RWA schema is built to support 24/5 streams, including DON Consensus `mid` price (with its corresponding timestamp `lastSeenTimestampNs` for staleness tracking), order book depth (`bid`, `ask`, `bidVolume`, `askVolume`), execution data (`lastTradedPrice`), and granular market phases (`marketStatus` values for Pre-market, Regular hours, Post-market, Overnight, and Closed). + + + + + +## Feeds + +Each instrument is exposed through three distinct data streams feeds, each corresponding to a specific trading phase: **Regular Hours**, **Extended Hours**, and **Overnight Hours**. + +You can view all available 24/5 US Equities streams in the [stream table viewer](/data-streams/stream-ids) or see the [complete list below](#available-streams). + +For example, **TSLA** is available via the following streams: + +- `TSLA/USD-Streams-ExtendedHours` +- `TSLA/USD-Streams-OvernightHours` +- `TSLA/USD-Streams-RegularHours` + +To construct a **continuous price feed**, users must **dynamically switch** between these individual streams based on the value of `marketStatus`. The mapping logic is as follows: + +| Market Status | Stream | +| ----------------- | --------------------------------- | +| `1` (Pre-market) | `TSLA/USD-Streams-ExtendedHours` | +| `2` (Regular) | `TSLA/USD-Streams-RegularHours` | +| `3` (Post-market) | `TSLA/USD-Streams-ExtendedHours` | +| `4` (Overnight) | `TSLA/USD-Streams-OvernightHours` | + + + +## Building a Continuous Price Feed + +Building a continuous price feed by dynamically switching streams requires robust exception handling to manage edge cases effectively. Because different protocols have unique risk profiles and design requirements, Data Streams allows you to implement custom logic tailored to your specific needs. + +There is no one-size-fits-all solution to integrating 24/5 streams. The sections below outline edge cases you will encounter when building a continuous price feed along with recommended mitigation strategies. For information on structural risks and protocol-specific considerations, see the [Risks](#risks) section. + +If you wish to jump ahead to view an example of switching logic, jump to [Stream Switching Example Logic](#stream-switching-example-logic). + +### Edge Cases and Mitigation + +#### Price Jumps at Session Transition Boundaries + +When transitioning between Regular ↔ Extended ↔ Overnight sessions, noticeable price dislocations can occur. + +These differences are expected and normal due to unique liquidity conditions, venues, participants, and pricing sources per session. These are not bad data; they are true market microstructure effects. + +Typical jumps are **1–2%**, but **larger spikes (10–20%+)** are possible during low-liquidity environments or impactful news cycles. + + + +##### Mitigation + +**Phase-specific streams are provided intentionally** to give users control over when and how transitions occur. Optional safeguards: + +- Pause or lock market activity during transition windows +- Delay feed switching until price convergence or stability threshold is met +- Apply price smoothing (EMA/VWAP/TWAP) across transition windows +- Temporarily reference [tokenized asset](#stream-switching-example-logic) price (where available) + +#### Market Status Unknown/Unavailable (`marketStatus = 0`) + +The system may return `marketStatus = 0` (Unknown). **If your implementation relies on automated feed switching based on market status, you must account for this scenario.** + +Market status is sourced from several independent providers configured as primary/fallback. While resilient, multiple providers can fail simultaneously. + +##### Mitigation + +Consumers must treat `marketStatus = 0` (Unknown) as a valid state and define deterministic behaviors when it is returned. Potential actions include: + +- Pause or lock market activity +- Allow restricted trading within a bounded range (e.g., last-valid price ± threshold) +- Temporarily reference [tokenized asset](#stream-switching-example-logic) price (where available) + +#### Closed (`marketStatus = 5`) + +Market status `5` indicates the market is closed, which includes weekends, public holidays, and unexpected market closures. During these periods, all three feeds will carry stale values. This reflects true underlying market inactivity rather than an outage or failure. + +##### Mitigation + +Consumers must treat `marketStatus = 5` (Closed) as a valid state and define deterministic behaviors when it is returned. Potential actions include: + +- Pause or lock market activity +- Allow restricted trading within a bounded range (e.g., last-valid price ± threshold) +- Temporarily reference [tokenized asset](#stream-switching-example-logic) price (where available) + +#### Stale Data Detection + +Markets may stop updating due to exchange outages, circuit breakers, trading halts, or corporate actions. The `marketStatus` field will continue reflecting the status that it normally would. Use the `lastSeenTimestampNs` field (which reflects the timestamp of the last update for the `mid` price only) to detect staleness by comparing it against the current time. When this timestamp stops advancing, it indicates the underlying venue has stopped providing updates. + +Phase-specific feeds can introduce unique behavior due to venue-specific operational characteristics and market microstructure. The following are some examples of scenarios that may occur during session transitions or under specific market conditions: + +##### Regular Hours Session: Delayed Quote Availability at Market Open + +During the first 10–20 seconds after regular hours open (9:30am ET), bid/ask quotes may not yet be available from the regular hours venue. In those cases, the reported price may still reflect the previous regular hours close rather than live market data. + +Users should factor this transition period into their switching logic and consider alternative strategies during the first ~20 seconds of regular hours, such as: + +- Pause or lock market activity +- Continue using the pre-market (Extended Hours) stream until fresh regular hours quotes are available +- Temporarily reference [tokenized asset](#stream-switching-example-logic) price (where available) + +##### Overnight Session: Stale Bid/Ask at Session Start + +During the early overnight session -- before the overnight venue begins publishing data -- the feed may display the last bid/ask prices and volumes from the previous regular session. This occurs because no new quotes are available yet from the overnight venue. + +Once the overnight venue starts publishing its own quotes, the data will update to reflect current overnight market conditions. This behavior is normal market microstructure, not a data quality issue. It reflects the actual state of the market during the transition period when overnight liquidity has not yet begun. + +Users relying on bid/ask data during early overnight hours should be aware of this carryover behavior and implement appropriate safeguards, such as checking `lastSeenTimestampNs` for staleness or widening risk parameters during overnight session transitions. + +##### Mitigation + +Consumers must have fallback logic in place when the data is stale. Potential actions include: + +- Pause or lock market activity +- Use last-valid price as reference +- Allow bounded-range trading based on last-valid price +- Temporarily reference [tokenized asset](#stream-switching-example-logic) price (where available) + +### Stream Switching Example Logic + +The following examples demonstrate how to implement a continuous price feed by dynamically switching between phase-specific streams. These examples use tokenized asset prices as the fallback strategy for edge cases (stale data, Unknown market status, and Closed). Developers may choose alternative mitigation strategies based on their protocol's risk requirements. + +Developers interested in using tokenized assets can find the list of supported assets and schema in the [Tokenized Assets documentation](/data-streams/tokenized-asset-streams). Using tokenized assets carries its own risks, including liquidity limitations and price deviations from spot markets. Evaluate these factors carefully before integrating tokenized prices into your protocol. + + + +#### Decision Flow + +To build a continuous price feed, follow this general decision flow. This is a simplified outline that leverages tokenized asset prices as fallback; your implementation must account for all risks outlined above and in the [Risks](#risks) section below. + +1. **Fetch and decode** the Regular Hours stream report to get `marketStatus` and `lastSeenTimestampNs` + +2. **Check staleness first:** + - **If data is stale** (timestamp older than your threshold) → **[Use Tokenized Asset stream](/data-streams/tokenized-asset-streams)** or apply custom risk mitigation + - **If data is fresh** → Continue to step 3 + +3. **Route based on market status:** + - **`marketStatus = 0`** (Unknown) → **Use Tokenized Asset stream** or apply custom risk mitigation + - **`marketStatus = 1`** (Pre-market) → **Use Extended Hours stream** + - **`marketStatus = 2`** (Regular) → **Use Regular Hours stream** + - **`marketStatus = 3`** (Post-market) → **Use Extended Hours stream** + - **`marketStatus = 4`** (Overnight) → **Use Overnight Hours stream** + - **`marketStatus = 5`** (Closed) → **Use Tokenized Asset stream** or apply custom risk mitigation + +4. **Apply additional safeguards** as needed for your protocol (e.g., price jump checks, circuit breakers, holiday calendars, bounded trading ranges) + +5. **Return the `mid` price** from the selected stream + + + +#### Example Implementation Logic + +This example demonstrates switching logic with tokenized asset prices as fallback. View examples in different SDK languages. + +Please note that these code snippets are illustrative and may require adaptation to fit your specific environment, SDK versions, and error handling practices. Refer to the guide to [fetch](/data-streams/tutorials/go-sdk-fetch) and [stream](/data-streams/tutorials/go-sdk-stream) decoded reports in your chosen SDK. + +
+ +{/* prettier-ignore */} + + TypeScript + Go + Rust + + ```typescript + import { createClient, decodeReport } from "@chainlink/data-streams-sdk" + + const client = createClient({ apiKey, userSecret, endpoint }) + + async function getPrice() { + const regularReport = await client.getLatestReport(REGULAR_HOURS) + const decoded = decodeReport(regularReport.fullReport, regularReport.feedID) + + // Check staleness (5 minute threshold) + const isStale = (Date.now() - decoded.lastSeenTimestampNs / 1000000) > 300000 + + // Determine which stream to use + if (isStale || decoded.marketStatus === 0 || decoded.marketStatus === 5) { + // Stale, Unknown, or Closed -> use tokenized asset + const tokenReport = await client.getLatestReport(TOKENIZED_TSLA) + return decodeReport(tokenReport.fullReport, tokenReport.feedID).mid + } else if (decoded.marketStatus === 1 || decoded.marketStatus === 3) { + const report = await client.getLatestReport(EXTENDED_HOURS) + return decodeReport(report.fullReport, report.feedID).mid + } else if (decoded.marketStatus === 2) { + return decoded.mid + } else if (decoded.marketStatus === 4) { + const report = await client.getLatestReport(OVERNIGHT_HOURS) + return decodeReport(report.fullReport, report.feedID).mid + } + } + ``` + + + + ```go + import "github.com/smartcontractkit/data-streams-sdk/go/feed" + + func getPrice() (*big.Int, error) { + report, err := client.GetLatestReport(REGULAR_HOURS) + if err != nil { + return nil, err + } + + decoded, err := feed.Decode(report.FullReport) + if err != nil { + return nil, err + } + + // Check staleness (5 minute threshold) + isStale := time.Since(decoded.LastSeenTimestamp) > 5*time.Minute + + // Determine which stream to use + if isStale || decoded.MarketStatus == 0 || decoded.MarketStatus == 5 { + // Stale, Unknown, or Closed -> use tokenized asset + tokenReport, _ := client.GetLatestReport(TOKENIZED_TSLA) + tokenDecoded, _ := feed.Decode(tokenReport.FullReport) + return tokenDecoded.Mid, nil + } else if decoded.MarketStatus == 1 || decoded.MarketStatus == 3 { + extReport, _ := client.GetLatestReport(EXTENDED_HOURS) + extDecoded, _ := feed.Decode(extReport.FullReport) + return extDecoded.Mid, nil + } else if decoded.MarketStatus == 2 { + return decoded.Mid, nil + } else if decoded.MarketStatus == 4 { + ovnReport, _ := client.GetLatestReport(OVERNIGHT_HOURS) + ovnDecoded, _ := feed.Decode(ovnReport.FullReport) + return ovnDecoded.Mid, nil + } + } + ``` + + + + ```rust + use data_streams_sdk::{client::Client, feed}; + + async fn get_price() -> Result> { + let report = client.get_latest_report(REGULAR_HOURS).await?; + let decoded = feed::decode(&report.full_report)?; + + // Check staleness (5 minute threshold) + let is_stale = (SystemTime::now().duration_since(UNIX_EPOCH)?.as_nanos() + - decoded.last_seen_timestamp_ns as u128) > 300_000_000_000; + + // Determine which stream to use + if is_stale || decoded.market_status == 0 || decoded.market_status == 5 { + // Stale, Unknown, or Closed -> use tokenized asset + let token_report = client.get_latest_report(TOKENIZED_TSLA).await?; + let token_decoded = feed::decode(&token_report.full_report)?; + Ok(token_decoded.mid) + } else if decoded.market_status == 1 || decoded.market_status == 3 { + let ext_report = client.get_latest_report(EXTENDED_HOURS).await?; + let ext_decoded = feed::decode(&ext_report.full_report)?; + Ok(ext_decoded.mid) + } else if decoded.market_status == 2 { + Ok(decoded.mid) + } else if decoded.market_status == 4 { + let ovn_report = client.get_latest_report(OVERNIGHT_HOURS).await?; + let ovn_decoded = feed::decode(&ovn_report.full_report)?; + Ok(ovn_decoded.mid) + } else { + Err("Unknown market status".into()) + } + } + ``` + + + + + + +## Risks + +While 24/5 streams provide extended market coverage, they introduce specific risks related to liquidity, volatility, and data sourcing. Users must understand these factors and implement appropriate safeguards. + +In the following sections, we outline key risks and recommended mitigation strategies. + +### Single Provider for Extended & Overnight Data + +Extended and overnight session price feeds are currently sourced from a single data provider, making these sessions less reliable than the regular hours price feed which is multi-sourced. + +If the provider experiences downtime, technical failures, or connectivity disruption, the feed may flatline or report highly inaccurate figures, preventing users from reacting to real price movements. Such issues may lead to mispricing, failed liquidations, and potential bad debt accumulation. + +##### Mitigation + +The feed includes a staleness indicator, allowing consumers to detect when data stops updating. Users are strongly recommended to implement fallback logic within their protocol risk framework, which may include: + +- Pause or lock market activity +- Restrict to narrow price bands +- Temporarily switch to the tokenized price feed (understanding that it also carries liquidity limitations) + +### Structural Illiquidity and Volatility in Extended & Overnight Hours + +Pre-market and post-market sessions are typically thinly traded, with fragmented liquidity and higher spreads, leading to stale ticks, price gaps, and elevated volatility. These conditions are inherent to the market, not to the feed, and will be visible in the published data. + +##### Mitigation + +Users should evaluate whether the full 24/5 price coverage is appropriate for their use case. Consider the following: + +- Configure risk thresholds, circuit breakers, or mode switching aligned with your risk appetite +- Validate these configurations during integration and simulation, not post-deployment + +### Corporate Actions + +Traditional equities are subject to corporate actions which can dramatically change the price of an asset overnight, especially in the case of stock splits and reverse stock splits. These actions are usually announced outside regular trading hours and can cause substantial price movements when markets reopen. + +Additionally, the overnight session data provider may disable trading for individual symbols during pending corporate actions such as dividends, splits, or mergers. When this occurs, there will be no overnight session data available for that specific symbol, and this closure will not be reflected in the `marketStatus` field. The overnight feed may continue to display stale data from the previous session, or the data may flatline, making it critical to monitor `lastSeenTimestampNs` for staleness detection. + +##### Mitigation + +Consumers should: + +- Actively monitor corporate action announcements +- Adjust pricing logic, risk parameters, and open positions accordingly +- Consider pausing markets during corporate action windows to prevent unfair liquidations +- Implement staleness checks on `lastSeenTimestampNs` to detect when overnight session data stops updating due to symbol-specific trading halts + +### Trading Halts Are Not Explicitly Flagged + +Trading halts can occur for various reasons including regulatory actions, pending news announcements, volatility circuit breakers, or operational issues. When the underlying market is halted, this will not be reflected in the `marketStatus` field. + +Automated switching logic that relies only on `marketStatus` or staleness signals can incorrectly interpret halt inactivity as an outage or unexpected feed degradation, leading to unnecessary fallbacks, paused markets, or erroneous risk decisions. + +##### Mitigation + +Consumers must: + +- Monitor exchange halt notifications and adjust protocol behavior accordingly +- Implement appropriate safeguards when trading halts are detected to prevent unfair liquidations or trades at stale prices + +For detailed market hours and trading schedules, see the [Market Hours](/data-streams/market-hours) documentation. + +## Available Streams + +The table below shows all available 24/5 US Equities streams. Use the **Time segment** filter to view streams for specific trading sessions. + + diff --git a/src/content/data-streams/rwa-streams/handling-market-events-v11.mdx b/src/content/data-streams/rwa-streams/handling-market-events-v11.mdx new file mode 100644 index 00000000000..edc893b6f83 --- /dev/null +++ b/src/content/data-streams/rwa-streams/handling-market-events-v11.mdx @@ -0,0 +1,176 @@ +--- +section: dataStreams +date: "Last Modified" +title: "Handling Market Events (v11)" +metadata: + title: "Handling Market Events (v11) | Chainlink Data Streams" + description: "Learn how to handle market hours, volatility, and corporate actions when using Chainlink Data Streams with the v11 schema." +whatsnext: + { + "Learn about Data Streams market hours and schedules": "/data-streams/market-hours", + "Find the schema of data to expect from Data Streams reports: RWA Advanced (v11)": "/data-streams/reference/report-schema-v11", + } +--- + +import { Aside } from "@components" +import MarketEventsTabs from "@features/data-streams/common/MarketEventsTabs.astro" + + + + + +Apply these best practices when integrating or operating markets that use tokenized real-world assets during standard market hours. Developers and operators are responsible for assessing market integrity, implementing mitigations, and managing application-level risks — see the [Developer Responsibilities](/data-streams/developer-responsibilities) guidance for details. + +## Market Hours + +Markets for Real-World Assets (RWA) operate during specific hours and are subject to various market conditions that can create risks for applications. The following sections outline common market issues and how to mitigate them. + + + +### Market gaps + +Market gaps occur when there are interruptions in trading or price discovery, leading to periods where the last available price may not reflect current market conditions. These gaps can create risks, particularly around market opens, closures, and unexpected disruptions. + +#### Market close + +The following guidance applies to streams during non-trading hours. Check your stream's specific `marketStatus` values in the [schema documentation](/data-streams/reference/report-schema-v11#market-status-values). + +Around market close, large price jumps may occur due to after-hours news. This can create a large pricing gap between the close of the last session and the open of the new session. Such a price jump can cause issues for protocols by triggering sudden liquidations. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until market open.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Timestamp of the closing price of the last session.
| Keep markets closed while `marketStatus` indicates closed to prevent users trading at unfair prices.

Leverage available should be set in line with the asset average volatility to avoid bad debt if a user's collateral is insufficient to cover the losses. | + +#### Price formation at open/close + +Certain assets (e.g., FX open on Sunday afternoon) experience gradual price discovery due to fragmented liquidity and delayed trading activity. + +Integrating protocols should avoid opening their market with the last close price. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a bid/ask becomes available or a transaction occurs.
  • `marketStatus`: Market Open status value.
  • `lastUpdateTimestamp`: Timestamp of the closing price of the last session.
| Wait until `lastUpdateTimestamp` is current before opening the market so traders don't execute on stale quotes. | + +#### Sudden failures + +Unexpected system outages, order execution failures, or data feed disruptions can occur in traditional data brokers and trading systems. + +The price will be flat during that period, meaning if an integrating protocol lacks a mechanism to handle halts, it may struggle to determine fair prices thus leading to unpredictable liquidations. + +| Data Stream behavior | User guidance | +| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Last mid-price is repeated until a new price is available.
  • `marketStatus`: Market Open status value.
  • `lastUpdateTimestamp`: Timestamp of the last mid-price.
| Decide whether to allow users to open/close positions when `marketStatus` indicates open but `lastUpdateTimestamp` is stale. | + +#### Trading halts + +Stocks can be halted due to extreme volatility (e.g., limit up/down rules) or regulatory actions. + +The price will be flat during that period, meaning if an integrating protocol lacks a mechanism to handle halts, it may struggle to determine fair prices thus leading to unpredictable liquidations. + +| Data Stream behavior | User guidance | +| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Last mid-price is repeated until a new price is available.
  • `marketStatus`: Market Open status value.
  • `lastUpdateTimestamp`: Timestamp of the last mid-price.
| Decide whether to allow users to open/close positions when `marketStatus` indicates open but `lastUpdateTimestamp` is stale. | + +--- + +## Volatility & low liquidity + +During periods of high volatility or low liquidity, price movements can become unpredictable and exaggerated. These conditions can increase the risk of sudden liquidations and bad debt accumulation, requiring careful risk management strategies. + +### Algorithmic & HFT activity + +Rapid-fire trading by algos can create unpredictable price movements. + +High volatility can lead to liquidation and potential bad debt accumulation. + +| Data Stream behavior | User guidance | +| :--------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Current mid price.
  • `marketStatus`: Market Open status value.
  • `lastUpdateTimestamp`: Current timestamp.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +### Low liquidity at open/close + +Reduced market depth at trading session transitions can lead to higher volatility and spreads. + +High volatility can lead to liquidation and potential bad debt accumulation. + +| Data Stream behavior | User guidance | +| :--------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Current mid price.
  • `marketStatus`: Market Open status value.
  • `lastUpdateTimestamp`: Current timestamp.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +--- + +## Corporate actions + +Corporate actions are events initiated by publicly traded companies that can significantly impact stock prices and trading behavior. These actions are usually announced outside regular trading hours and can cause substantial price movements when markets reopen. Users should monitor these events closely as they can lead to sudden price adjustments that may trigger unexpected liquidations or require position modifications. + +### Bankruptcy & delisting + +Bankruptcy can lead to delisting or complete loss of equity value. + +Delisting will zero out prices for the asset. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +|
  • `midPrice`: Closing price is repeated until a new price is available.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Closing timestamp of the last session.
| Monitor delisting news during market closed periods and close markets permanently once confirmed. | + +### Spin-offs + +When a company spins off a business unit into a separate publicly traded entity, the parent company's stock may adjust accordingly, while the spun-off company's shares begin trading independently. + +Positions may need to be manually adjusted if the integrating protocol doesn't support tracking the new entity. + +| Data Stream behavior | User guidance | +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until the first post-spin trade.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Last close.
| Monitor spin-off and split announcements during market closed periods.

Auto-pause the market if the first post-event price moves by more than X% from the prior close, update positions, then reopen.

If automatic adjustment isn't possible, disable leverage during the event window to prevent unfair liquidations. | + +### Stock splits & reverse splits + + + +A stock split increases the number of shares while reducing the price per share (e.g., 2-for-1 split), often making shares more accessible to investors. A reverse split does the opposite, consolidating shares to increase the price per share. + +A 2-for-1 split would reduce the price by 50% from the previous trading session, any leveraged user could get liquidated. + +| Data Stream behavior | User guidance | +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until the split-adjusted price prints.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Last close.
| Monitor spin-off and split announcements during market closed periods.

Auto-pause the market if the first post-event price moves by more than X% from the prior close, update positions, then reopen.

If automatic adjustment isn't possible, disable leverage during the event window to prevent unfair liquidations. | + +### Mergers & acquisitions (M&A) + +If a company is being acquired, its stock price may rise to reflect the acquisition premium. The acquiring company's stock might fluctuate based on investor sentiment regarding the deal's financial and strategic impact. + +Announcements can cause sharp price spikes or sustained moves. + +| Data Stream behavior | User guidance | +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a new price prints.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Last close.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +### Share buybacks & stock issuance + +Reduced share supply from a buyback can drive stock prices higher, while an increase in share supply can lead to price dilution. + +Announcements can cause sharp price spikes or sustained moves. + +| Data Stream behavior | User guidance | +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a new price prints.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Last close.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +### Dividends + +A company's stock price typically adjusts to reflect dividend payments. For example, when a company declares a 10% dividend, its stock price often drops by a similar amount on the ex-dividend date, as new buyers are no longer entitled to that dividend. + +Announcements can cause sharp price spikes or sustained moves. + +| Data Stream behavior | User guidance | +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until the ex-date trade prints.
  • `marketStatus`: Market Closed status value(s).
  • `lastUpdateTimestamp`: Last close.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | diff --git a/src/content/data-streams/rwa-streams/handling-market-events.mdx b/src/content/data-streams/rwa-streams/handling-market-events.mdx new file mode 100644 index 00000000000..6359b9da1df --- /dev/null +++ b/src/content/data-streams/rwa-streams/handling-market-events.mdx @@ -0,0 +1,170 @@ +--- +section: dataStreams +date: "Last Modified" +title: "Handling Market Events" +metadata: + title: "Handling Market Events | Chainlink Data Streams" + description: "Learn how to handle market hours, volatility, and corporate actions when using Chainlink Data Streams." +whatsnext: + { + "Learn about Data Streams market hours and schedules": "/data-streams/market-hours", + "Find the schema of data to expect from Data Streams reports: RWA": "/data-streams/reference/report-schema-v8", + } +--- + +import { Aside } from "@components" +import MarketEventsTabs from "@features/data-streams/common/MarketEventsTabs.astro" + + + +Apply these best practices when integrating or operating markets that use tokenized real-world assets. Developers and operators are responsible for assessing market integrity, implementing mitigations, and managing application-level risks — see the [Developer Responsibilities](/data-streams/developer-responsibilities) guidance for details. + +## Market Hours + +Markets for Real-World Assets (RWA) operate during specific hours and are subject to various market conditions that can create risks for applications. The following sections outline common market issues and how to mitigate them. + + + +### Market gaps + +Market gaps occur when there are interruptions in trading or price discovery, leading to periods where the last available price may not reflect current market conditions. These gaps can create risks, particularly around market opens, closures, and unexpected disruptions. + +#### Market close + +Large price jumps between trading sessions due to after-hours news. + +A large price jump at market open could cause sudden liquidations, potentially leaving an integrating protocol with bad debt if a trader's collateral is insufficient to cover the losses. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until market open.
  • `marketStatus`: 1 = Market Closed.
  • `lastUpdateTimestamp`: Timestamp of the closing price of the last session.
| Keep markets closed while `marketStatus = 1` to prevent users trading at unfair prices.

Leverage available should be set in line with the asset average volatility to avoid bad debt if a trader's collateral is insufficient to cover the losses. | + +#### Price formation at open/close + +Certain assets (e.g., FX open on Sunday afternoon) experience gradual price discovery due to fragmented liquidity and delayed trading activity. + +Integrating protocols should avoid opening their market with the last close price. + +| Data Stream behavior | User guidance | +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a bid/ask becomes available or a transaction occurs.
  • `marketStatus`: `2` (Market Open).
  • `lastUpdateTimestamp`: Timestamp of the closing price of the last session.
| Wait until `lastUpdateTimestamp` is current before opening the market so traders don't execute on stale quotes. | + +#### Sudden failures + +Unexpected system outages, order execution failures, or data feed disruptions can occur in traditional data brokers and trading systems. + +The price will be flat during that period, meaning if an integrating protocol lacks a mechanism to handle halts, it may struggle to determine fair prices thus leading to unpredictable liquidations. + +| Data Stream behavior | User guidance | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Last mid-price is repeated until a new price is available.
  • `marketStatus`: `2` (Market Open).
  • `lastUpdateTimestamp`: Timestamp of the last mid-price.
| Decide whether to allow users to open/close positions when `marketStatus = 2` but `lastUpdateTimestamp` is stale. | + +#### Trading halts + +Stocks can be halted due to extreme volatility (e.g., limit up/down rules) or regulatory actions. + +The price will be flat during that period, meaning if an integrating protocol lacks a mechanism to handle halts, it may struggle to determine fair prices thus leading to unpredictable liquidations. + +| Data Stream behavior | User guidance | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Last mid-price is repeated until a new price is available.
  • `marketStatus`: `2` (Market Open).
  • `lastUpdateTimestamp`: Timestamp of the last mid-price.
| Decide whether to allow users to open/close positions when `marketStatus = 2` but `lastUpdateTimestamp` is stale. | + +--- + +## Volatility & low liquidity + +During periods of high volatility or low liquidity, price movements can become unpredictable and exaggerated. These conditions can increase the risk of sudden liquidations and bad debt accumulation, requiring careful risk management strategies. + +### Algorithmic & HFT activity + +Rapid-fire trading by algos can create unpredictable price movements. + +High volatility can lead to liquidation and potential bad debt accumulation. + +| Data Stream behavior | User guidance | +| :-------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Current mid price.
  • `marketStatus`: `2` (Market Open).
  • `lastUpdateTimestamp`: Current timestamp.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +### Low liquidity at open/close + +Reduced market depth at trading session transitions can lead to higher volatility and spreads. + +High volatility can lead to liquidation and potential bad debt accumulation. + +| Data Stream behavior | User guidance | +| :-------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | +|
  • `midPrice`: Current mid price.
  • `marketStatus`: `2` (Market Open).
  • `lastUpdateTimestamp`: Current timestamp.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +--- + +## Corporate actions + +Corporate actions are events initiated by publicly traded companies that can significantly impact stock prices and trading behavior. These actions are usually announced outside regular trading hours and can cause substantial price movements when markets reopen. Users should monitor these events closely as they can lead to sudden price adjustments that may trigger unexpected liquidations or require position modifications. + +### Bankruptcy & delisting + +Bankruptcy can lead to delisting or complete loss of equity value. + +Delisting will zero out prices for the asset. + +| Data Stream behavior | User guidance | +| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a new price is available.
  • `marketStatus`: `1` (Market Closed).
  • `lastUpdateTimestamp`: Closing timestamp of the last session.
| Monitor delisting news during `marketStatus` = `1` and close markets permanently once confirmed. | + +### Spin-offs + +When a company spins off a business unit into a separate publicly traded entity, the parent company's stock may adjust accordingly, while the spun-off company's shares begin trading independently. + +Positions may need to be manually adjusted if the integrating protocol doesn't support tracking the new entity. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until the first post-spin trade.
  • `marketStatus`: `1` (Market Closed).
  • `lastUpdateTimestamp`: Last close.
| Monitor spin-off and split announcements while `marketStatus = 1`.

Auto-pause the market if the first post-event price moves by more than X% from the prior close, update positions, then reopen.

If automatic adjustment isn't possible, disable leverage during the event window to prevent unfair liquidations. | + +### Stock splits & reverse splits + + + +A stock split increases the number of shares while reducing the price per share (e.g., 2-for-1 split), often making shares more accessible to investors. A reverse split does the opposite, consolidating shares to increase the price per share. + +A 2-for-1 split would reduce the price by 50% from the previous trading session, any leveraged user could get liquidated. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until the split-adjusted price prints.
  • `marketStatus`: `1` (Market Closed).
  • `lastUpdateTimestamp`: Last close.
| Monitor spin-off and split announcements while `marketStatus = 1`.

Auto-pause the market if the first post-event price moves by more than X% from the prior close, update positions, then reopen.

If automatic adjustment isn't possible, disable leverage during the event window to prevent unfair liquidations. | + +### Mergers & acquisitions (M&A) + +If a company is being acquired, its stock price may rise to reflect the acquisition premium. The acquiring company's stock might fluctuate based on investor sentiment regarding the deal's financial and strategic impact. + +Announcements can cause sharp price spikes or sustained moves. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a new price prints.
  • `marketStatus`: `1` (Market Closed).
  • `lastUpdateTimestamp`: Last close.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +### Share buybacks & stock issuance + +Reduced share supply from a buyback can drive stock prices higher, while an increase in share supply can lead to price dilution. + +Announcements can cause sharp price spikes or sustained moves. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until a new price prints.
  • `marketStatus`: `1` (Market Closed).
  • `lastUpdateTimestamp`: Last close.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | + +### Dividends + +A company's stock price typically adjusts to reflect dividend payments. For example, when a company declares a 10% dividend, its stock price often drops by a similar amount on the ex-dividend date, as new buyers are no longer entitled to that dividend. + +Announcements can cause sharp price spikes or sustained moves. + +| Data Stream behavior | User guidance | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------- | +|
  • `midPrice`: Closing price is repeated until the ex-date trade prints.
  • `marketStatus`: `1` (Market Closed).
  • `lastUpdateTimestamp`: Last close.
| Monitor liquidation thresholds closely to prevent accumulating bad debt. | diff --git a/src/content/data-streams/nav-streams/index.mdx b/src/content/data-streams/smartdata-streams/index.mdx similarity index 63% rename from src/content/data-streams/nav-streams/index.mdx rename to src/content/data-streams/smartdata-streams/index.mdx index b7943ebed18..7c9b3cd61c9 100644 --- a/src/content/data-streams/nav-streams/index.mdx +++ b/src/content/data-streams/smartdata-streams/index.mdx @@ -1,10 +1,10 @@ --- section: dataStreams -title: "Net Asset Value (NAV) Data Streams" +title: "SmartData Streams" datafeedtype: streamsNav metadata: - title: "Net Asset Value (NAV) Data Streams" - description: "A list of available Data Streams Net Asset Value streams and their ID." + title: "SmartData Streams" + description: "A list of available SmartData streams including NAV and POR feeds and their IDs." date: Last Modified isIndex: true --- diff --git a/src/content/data-streams/supported-networks.mdx b/src/content/data-streams/supported-networks.mdx index b9db36c7471..3e5404e4f45 100644 --- a/src/content/data-streams/supported-networks.mdx +++ b/src/content/data-streams/supported-networks.mdx @@ -23,7 +23,7 @@ The table below lists all networks supported by Data Streams, each with verifier ## Streams Trade implementation (Onchain Lookup) -[Streams Trade](streams-trade), the alternative implementation, allows smart contracts to access Data Streams onchain using the [`StreamsLookup`](/data-streams/getting-started) capability integrated with [Chainlink Automation](/chainlink-automation). +[Streams Trade](/data-streams/streams-trade), the alternative implementation, allows smart contracts to access Data Streams onchain using the [`StreamsLookup`](/data-streams/getting-started) capability integrated with [Chainlink Automation](/chainlink-automation). Streams Trade is currently available on the following networks: diff --git a/src/content/data-streams/tokenized-asset-streams/handling-stock-splits.mdx b/src/content/data-streams/tokenized-asset-streams/handling-stock-splits.mdx new file mode 100644 index 00000000000..9b099f83bc2 --- /dev/null +++ b/src/content/data-streams/tokenized-asset-streams/handling-stock-splits.mdx @@ -0,0 +1,108 @@ +--- +section: dataStreams +date: "Last Modified" +title: "Handling Stock Splits" +metadata: + title: "Handling Stock Splits for Tokenized Assets | Chainlink Data Streams" + description: "Learn how to handle stock splits and reverse splits for tokenized assets using Chainlink Data Streams v10 schema." +whatsnext: + { + "Find the schema of data to expect from Data Streams reports: Tokenized Asset (v10)": "/data-streams/reference/report-schema-v10", + } +--- + +import { Aside } from "@components" + +Corporate actions, such as stock splits and reverse splits, require precise handling for tokenized assets to ensure price continuity and avoid disruptions. These events alter per‑share pricing while leaving the underlying economic exposure unchanged. They can produce abrupt per‑share price moves and must be handled carefully to avoid incorrect onchain price computations and unexpected liquidations. + +In the [v10 report schema](/data-streams/reference/report-schema-v10), continuity is preserved by staging a multiplier change with a scheduled `activationDateTime` so the Theoretical Price (`price` \* `currentMultiplier`) remains continuous. Split ratios are typically known in advance, but activation may occur while markets are closed, so some external price sources may not reflect the split until trading resumes. + + + +## Guiding principle + +Follow these principles when handling multiplier changes during corporate actions: + +1. The protocol considers the Theoretical Price as `price` \* `currentMultiplier`. +1. Ahead of the event, `newMultiplier` and `activationDateTime` are staged. +1. At `activationDateTime` (Unix), `currentMultiplier` becomes `newMultiplier`. + - The underlying `price` from traditional markets should start reflecting the split the next time trading opens, so at the next `price` update, the Theoretical Price should remain continuous. + +## Example (10:1 split, AAPL) + +The following hypothetical scenario demonstrates how a 10:1 AAPL stock split is handled through the staged multiplier system, showing the progression from announcement through protocol reopening with proper price continuity maintained throughout. + +The following timeline outlines the key events and actions taken at each stage: + +- **T-2**: [Split announcement and multiplier staging](#announcement-t-2) +- **T-1**: [Protocol preparation and monitoring setup](#protocol-engagement-t-1) +- **T0**: [Multiplier activation (split effective date)](#activation-t0) +- **T+1**: [Market reopening with adjusted prices](#market-reopening-t1) +- **T+2**: [Protocol resumption after verification](#protocol-reopening-t2) + +### Announcement (T-2) + +A 10:1 AAPL stock split is announced. [The report](/data-streams/reference/report-schema-v10) updates to stage the split: + +- `newMultiplier` is set to 10x the value of `currentMultiplier`. +- `activationDateTime` is set to the Unix timestamp of the split. +- `currentMultiplier` is unaffected until activation. + +### Protocol engagement (T-1) + +At this stage, users are advised to monitor for changes in `activationDateTime` and inspect the upcoming change to prepare appropriate action, such as preparing the protocol for a pause around the `activationDateTime` in order to ensure appropriate handling of the stock split. + +### Activation (T0) + +When the provider applies the split, [the report](/data-streams/reference/report-schema-v10) updates: + +- `newMultiplier` remains the current value. +- `activationDateTime` is set to `0`. +- `currentMultiplier` is updated to the same value as `newMultiplier`. + + + +If activation occurs while the underlying market is closed, prices may still show the pre‑event last trade. Do not compute the Theoretical Price during this pre-adjustment window. Monitor `marketStatus` and keep the protocol paused until the first post‑event trade prints and the Theoretical Price is continuous. + +### Market reopening (T1) + +The stock split has taken effect. Generally, this occurs after the market closes or over the weekend, meaning `price` may not yet reflect the new economic value per share. Upon the market reopening, `price` should start reflecting the split-adjusted value. + +### Protocol reopening (T2) + +Users should pause markets before `activationDateTime` and keep them paused until: + +- The market has reopened (monitor `marketStatus`) +- `price` has updated in line with the split ratio (e.g., 10:1) +- You have confirmed that the Theoretical Price matches expectations + +After all the above checks have been confirmed, users can unpause their protocol and continue and resume normal operation. + +## Activation-time convention + +Each tokenized asset issuer sets its own activation time. For example, the xStocks default `activationDateTime` is 00:00 UTC on the effective date. Once `activationDateTime` is reached, `currentMultiplier` becomes `newMultiplier`. + +Because underlying venues may be closed at activation, some external price sources may not reflect the split immediately. If `activationDateTime` occurs while the underlying market is closed, the report’s `currentMultiplier` will become `newMultiplier`; however, `price` can remain at the pre-event level until the market reopens. During this post-activation, pre-adjustment interval (after the multiplier has changed but before the underlying `price` updates), the Theoretical Price can be incorrect. Use `marketStatus` to pause until `price` reflects the event. + +## Integrator risk & handling + +Computing `price` \* `currentMultiplier` when the price has not adjusted (e.g., market closed) can produce large errors. It is critical to ensure that the Theoretical Price is again reflective of actual market conditions before allowing live trading. + +Treat any multiplier change (splits, dividends, etc) and `activationDateTime` as a maintenance window; pause/guard the protocol, then verify post-activation conditions before resuming. + + + +For broader guidance around market hours and event handling, refer to the [Market Hours](/data-streams/market-hours) guidance. diff --git a/src/content/data-streams/backed-streams/index.mdx b/src/content/data-streams/tokenized-asset-streams/index.mdx similarity index 53% rename from src/content/data-streams/backed-streams/index.mdx rename to src/content/data-streams/tokenized-asset-streams/index.mdx index c6d241037ff..54ae72c6412 100644 --- a/src/content/data-streams/backed-streams/index.mdx +++ b/src/content/data-streams/tokenized-asset-streams/index.mdx @@ -14,9 +14,11 @@ import Aside from "@components/Aside.astro" {/* prettier-ignore */} -1. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +1. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash npx tsx singleStream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/content/data-streams/tutorials/ts-sdk-stream.mdx b/src/content/data-streams/tutorials/ts-sdk-stream.mdx index 61ef2c1b33b..0563400dc22 100644 --- a/src/content/data-streams/tutorials/ts-sdk-stream.mdx +++ b/src/content/data-streams/tutorials/ts-sdk-stream.mdx @@ -237,7 +237,7 @@ First, you'll set up a basic TypeScript project, installing the SDK and pasting accordingly. -1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: ```bash npx tsx stream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/content/datalink/llms-full.txt b/src/content/datalink/llms-full.txt index 28ca7c36e33..e9aa0662c97 100644 --- a/src/content/datalink/llms-full.txt +++ b/src/content/datalink/llms-full.txt @@ -1177,6 +1177,227 @@ Deploy a `ClientReportsVerifier` contract on *Arbitrum Sepolia*. This contract i 1. [Open the ClientReportsVerifier.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/DataLink/ClientReportsVerifier.sol) contract in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; + import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; + import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + + using SafeERC20 for IERC20; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + * + * This contract can verify Chainlink DataLink reports onchain and pay + * the verification fee in LINK (when required). + * + * - If `VerifierProxy.s_feeManager()` returns a non-zero address, the network + * expects you to interact with that FeeManager for every verification call: + * quote fees, approve the RewardManager, then call `verify()`. + * + * - If `s_feeManager()` returns the zero address, no FeeManager contract has + * been deployed on that chain. In that case there is nothing to quote or pay + * onchain, so the contract skips the fee logic entirely. + * + * The `if (address(feeManager) != address(0))` check below chooses the + * correct path automatically, making the same bytecode usable on any chain. + */ + + // ──────────────────────────────────────────────────────────────────────────── + // Interfaces + // ──────────────────────────────────────────────────────────────────────────── + + interface IVerifierProxy { + /** + * @notice Route a report to the correct verifier and (optionally) bill fees. + * @param payload Full report payload (header + signed report). + * @param parameterPayload ABI-encoded fee metadata. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function verifyBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload + ) external payable returns (bytes[] memory verifiedReports); + + function s_feeManager() external view returns (IVerifierFeeManager); + } + + interface IFeeManager { + /** + * @return fee, reward, totalDiscount + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); + } + + // ──────────────────────────────────────────────────────────────────────────── + // Contract + // ──────────────────────────────────────────────────────────────────────────── + + /** + * @dev This contract implements functionality to verify DataLink reports from + * the API, with payment in LINK tokens. + */ + contract ClientReportsVerifier { + // ----------------- Errors ----------------- + error NothingToWithdraw(); + error NotOwner(address caller); + error InvalidReportVersion(uint16 version); + + // ----------------- Report schemas ----------------- + // Extract schema version from feed ID (first 2 bytes of the feed ID) + /** + * @dev DataLink report schema v3. + * Prices, bids and asks use 8 or 18 decimals depending on the feed. + */ + struct ReportV3 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + int192 bid; + int192 ask; + } + + /** + * @dev DataLink report schema v4. + */ + struct ReportV4 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + uint32 marketStatus; + } + + // ----------------- Storage ----------------- + IVerifierProxy public immutable i_verifierProxy; + address private immutable i_owner; + + int192 public lastDecodedPrice; + + // ----------------- Events ----------------- + event DecodedPrice(int192 price); + + // ----------------- Constructor / modifier ----------------- + /** + * @param _verifierProxy Address of the VerifierProxy on the target network. + * Addresses: https://docs.chain.link/datalink/pull-delivery/verifier-proxy-addresses + */ + constructor( + address _verifierProxy + ) { + i_owner = msg.sender; + i_verifierProxy = IVerifierProxy(_verifierProxy); + } + + modifier onlyOwner() { + if (msg.sender != i_owner) revert NotOwner(msg.sender); + _; + } + + // ----------------- Public API ----------------- + + /** + * @notice Verify a DataLink report (schema v3 or v4). + * + * @dev Steps: + * 1. Decode the unverified report to get `reportData`. + * 2. Read the first two bytes → schema version (`0x0003` or `0x0004`). + * - Revert if the version is unsupported. + * 3. Fee handling: + * - Query `s_feeManager()` on the proxy. + * – Non-zero → quote the fee, approve the RewardManager, + * ABI-encode the fee token address for `verify()`. + * – Zero → no FeeManager; skip quoting/approval and pass `""`. + * 4. Call `VerifierProxy.verify()`. + * 5. Decode the verified report into the correct struct and emit the price. + * + * @param unverifiedReport Full payload returned. + * @custom:reverts InvalidReportVersion when schema ≠ v3/v4. + */ + function verifyReport( + bytes memory unverifiedReport + ) external { + // ─── 1. & 2. Extract reportData and schema version ── + (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + if (reportVersion != 3 && reportVersion != 4) { + revert InvalidReportVersion(reportVersion); + } + + // ─── 3. Fee handling ── + IFeeManager feeManager = IFeeManager(address(i_verifierProxy.s_feeManager())); + + bytes memory parameterPayload; + if (address(feeManager) != address(0)) { + // FeeManager exists — always quote & approve + address feeToken = feeManager.i_linkAddress(); + + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeToken); + + IERC20(feeToken).approve(feeManager.i_rewardManager(), fee.amount); + parameterPayload = abi.encode(feeToken); + } else { + // No FeeManager deployed on this chain + parameterPayload = bytes(""); + } + + // ─── 4. Verify through the proxy ── + bytes memory verified = i_verifierProxy.verify(unverifiedReport, parameterPayload); + + // ─── 5. Decode & store price ── + if (reportVersion == 3) { + int192 price = abi.decode(verified, (ReportV3)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } else { + int192 price = abi.decode(verified, (ReportV4)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } + } + + /** + * @notice Withdraw all balance of an ERC-20 token held by this contract. + * @param _beneficiary Address that receives the tokens. + * @param _token ERC-20 token address. + */ + function withdrawToken( + address _beneficiary, + address _token + ) external onlyOwner { + uint256 amount = IERC20(_token).balanceOf(address(this)); + if (amount == 0) revert NothingToWithdraw(); + IERC20(_token).safeTransfer(_beneficiary, amount); + } + } + ``` + 2. Select the `ClientReportsVerifier.sol` contract in the **Solidity Compiler** tab. 3. Compile the contract. @@ -1222,6 +1443,227 @@ For this tutorial on *Arbitrum Sepolia*, fees are required, so you need to fund The example code you deployed has all the interfaces and functions required to verify DataLink reports onchain. +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; +import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +using SafeERC20 for IERC20; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + * + * This contract can verify Chainlink DataLink reports onchain and pay + * the verification fee in LINK (when required). + * + * - If `VerifierProxy.s_feeManager()` returns a non-zero address, the network + * expects you to interact with that FeeManager for every verification call: + * quote fees, approve the RewardManager, then call `verify()`. + * + * - If `s_feeManager()` returns the zero address, no FeeManager contract has + * been deployed on that chain. In that case there is nothing to quote or pay + * onchain, so the contract skips the fee logic entirely. + * + * The `if (address(feeManager) != address(0))` check below chooses the + * correct path automatically, making the same bytecode usable on any chain. + */ + +// ──────────────────────────────────────────────────────────────────────────── +// Interfaces +// ──────────────────────────────────────────────────────────────────────────── + +interface IVerifierProxy { + /** + * @notice Route a report to the correct verifier and (optionally) bill fees. + * @param payload Full report payload (header + signed report). + * @param parameterPayload ABI-encoded fee metadata. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function verifyBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload + ) external payable returns (bytes[] memory verifiedReports); + + function s_feeManager() external view returns (IVerifierFeeManager); +} + +interface IFeeManager { + /** + * @return fee, reward, totalDiscount + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); +} + +// ──────────────────────────────────────────────────────────────────────────── +// Contract +// ──────────────────────────────────────────────────────────────────────────── + +/** + * @dev This contract implements functionality to verify DataLink reports from + * the API, with payment in LINK tokens. + */ +contract ClientReportsVerifier { + // ----------------- Errors ----------------- + error NothingToWithdraw(); + error NotOwner(address caller); + error InvalidReportVersion(uint16 version); + + // ----------------- Report schemas ----------------- + // Extract schema version from feed ID (first 2 bytes of the feed ID) + /** + * @dev DataLink report schema v3. + * Prices, bids and asks use 8 or 18 decimals depending on the feed. + */ + struct ReportV3 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + int192 bid; + int192 ask; + } + + /** + * @dev DataLink report schema v4. + */ + struct ReportV4 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + uint32 marketStatus; + } + + // ----------------- Storage ----------------- + IVerifierProxy public immutable i_verifierProxy; + address private immutable i_owner; + + int192 public lastDecodedPrice; + + // ----------------- Events ----------------- + event DecodedPrice(int192 price); + + // ----------------- Constructor / modifier ----------------- + /** + * @param _verifierProxy Address of the VerifierProxy on the target network. + * Addresses: https://docs.chain.link/datalink/pull-delivery/verifier-proxy-addresses + */ + constructor( + address _verifierProxy + ) { + i_owner = msg.sender; + i_verifierProxy = IVerifierProxy(_verifierProxy); + } + + modifier onlyOwner() { + if (msg.sender != i_owner) revert NotOwner(msg.sender); + _; + } + + // ----------------- Public API ----------------- + + /** + * @notice Verify a DataLink report (schema v3 or v4). + * + * @dev Steps: + * 1. Decode the unverified report to get `reportData`. + * 2. Read the first two bytes → schema version (`0x0003` or `0x0004`). + * - Revert if the version is unsupported. + * 3. Fee handling: + * - Query `s_feeManager()` on the proxy. + * – Non-zero → quote the fee, approve the RewardManager, + * ABI-encode the fee token address for `verify()`. + * – Zero → no FeeManager; skip quoting/approval and pass `""`. + * 4. Call `VerifierProxy.verify()`. + * 5. Decode the verified report into the correct struct and emit the price. + * + * @param unverifiedReport Full payload returned. + * @custom:reverts InvalidReportVersion when schema ≠ v3/v4. + */ + function verifyReport( + bytes memory unverifiedReport + ) external { + // ─── 1. & 2. Extract reportData and schema version ── + (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + if (reportVersion != 3 && reportVersion != 4) { + revert InvalidReportVersion(reportVersion); + } + + // ─── 3. Fee handling ── + IFeeManager feeManager = IFeeManager(address(i_verifierProxy.s_feeManager())); + + bytes memory parameterPayload; + if (address(feeManager) != address(0)) { + // FeeManager exists — always quote & approve + address feeToken = feeManager.i_linkAddress(); + + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeToken); + + IERC20(feeToken).approve(feeManager.i_rewardManager(), fee.amount); + parameterPayload = abi.encode(feeToken); + } else { + // No FeeManager deployed on this chain + parameterPayload = bytes(""); + } + + // ─── 4. Verify through the proxy ── + bytes memory verified = i_verifierProxy.verify(unverifiedReport, parameterPayload); + + // ─── 5. Decode & store price ── + if (reportVersion == 3) { + int192 price = abi.decode(verified, (ReportV3)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } else { + int192 price = abi.decode(verified, (ReportV4)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } + } + + /** + * @notice Withdraw all balance of an ERC-20 token held by this contract. + * @param _beneficiary Address that receives the tokens. + * @param _token ERC-20 token address. + */ + function withdrawToken( + address _beneficiary, + address _token + ) external onlyOwner { + uint256 amount = IERC20(_token).balanceOf(address(this)); + if (amount == 0) revert NothingToWithdraw(); + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Initializing the contract When deploying the contract, you define the verifier proxy address for the feed you want to read from. You can find this address on the [Verifier Proxy Addresses](/datalink/pull-delivery/verifier-proxy-addresses) page. The verifier proxy address provides functions that are required for this example: diff --git a/src/content/getting-started/llms-full.txt b/src/content/getting-started/llms-full.txt index efe408fcceb..19d0a8d9ba2 100644 --- a/src/content/getting-started/llms-full.txt +++ b/src/content/getting-started/llms-full.txt @@ -29,6 +29,32 @@ Some networks are not EVM-compatible and use languages other than Solidity for s The structure of a smart contract is similar to that of a class in Javascript, with a few differences. For example, the following `HelloWorld` contract is a simple smart contract that stores a single variable and includes a function to update the value of that variable. +```sol +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.7; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract HelloWorld { + string public message; + + constructor( + string memory initialMessage + ) { + message = initialMessage; + } + + function updateMessage( + string memory newMessage + ) public { + message = newMessage; + } +} +``` + ### Solidity versions The first thing that every Solidity file must have is the Solidity version definition. The `HelloWorld.sol` contract uses version `0.8.7`, which is defined in the contract as `pragma solidity 0.8.7;` @@ -102,6 +128,38 @@ Functions use visibility modifiers to define the access level. Learn more about An **interface** is another concept that is familiar to programmers of other languages. Interfaces define functions without their implementation, which leaves inheriting contracts to define the actual implementation themselves. This makes it easier to know what functions to call in a contract. Here's an example of an interface: +```sol +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.7; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +interface numberComparison { + function isSameNum( + uint256 a, + uint256 b + ) external view returns (bool); +} + +contract Test is numberComparison { + constructor() {} + + function isSameNum( + uint256 a, + uint256 b + ) external pure override returns (bool) { + if (a == b) { + return true; + } else { + return false; + } + } +} +``` + For this example, `override` is necessary in the `Test` contract function because it overrides the base function contained in the `numberComparison` interface. The contract uses `pure` instead of `view` because the `isSameNum` function in the `Test` contract does not return a storage variable. ## What does "deploying" mean? diff --git a/src/content/quickstarts/automated-portfolio-manager.mdx b/src/content/quickstarts/automated-portfolio-manager.mdx index 26a7cac21df..5425f619624 100644 --- a/src/content/quickstarts/automated-portfolio-manager.mdx +++ b/src/content/quickstarts/automated-portfolio-manager.mdx @@ -7,16 +7,19 @@ image: "QuickStarts-AutomatedPortfolioManager.webp" products: ["Feeds", "Automation", "Functions"] time: "45 minutes" datePublished: "2024-09-18" -lastModified: "2025-06-17" +lastModified: "2026-01-16" difficulty: "intermediate" --- import { Accordion, Aside, CodeSample, ClickToZoom } from "@components" - diff --git a/src/content/resources/contributing-to-chainlink.mdx b/src/content/resources/contributing-to-chainlink.mdx index 952c5214272..b7537ca3581 100644 --- a/src/content/resources/contributing-to-chainlink.mdx +++ b/src/content/resources/contributing-to-chainlink.mdx @@ -123,9 +123,3 @@ If you're interested in running an in-person meetup or watch party, [reach out t Chainlink runs hackathons multiple times per year and often sponsors other hackathons across the blockchain ecosystem. Participating in a hackathon that Chainlink is a part of is a great way to learn how to use Chainlink. It is also a great way to showcase your skills to the Chainlink team and the wider community. Hackathons are a popular place for recruiting talent into the blockchain ecosystem. To stay up to date on the hackathons that Chainlink is running or sponsoring, keep an eye out on the official Chainlink social media channels, and sign up for our [developer newsletter](/resources/developer-communications). - -## Applying for a grant - -The [Chainlink grant program](https://chain.link/community/grants) encourages development of critical developer tooling, add high-quality data, and the launch key services around the Chainlink Network. Grant categories include community, integration, bug bounty, research, and social impact grants. If you have a great idea that fits into one of these categories, you can apply for a grant. If successful, you will receive the funding and support needed to successfully build and implement your idea. - -For more information about the grant program, go to the [Chainlink Grants web page](https://chain.link/community/grants). diff --git a/src/content/resources/hackathon-resources.mdx b/src/content/resources/hackathon-resources.mdx index ee7b09830df..15db5dd352e 100644 --- a/src/content/resources/hackathon-resources.mdx +++ b/src/content/resources/hackathon-resources.mdx @@ -57,7 +57,7 @@ If you are new to Smart Contracts, read the [Getting Started Guide](/getting-sta ### BUILD projects - [Source Network](https://source.network/) -- [Thirdfi](https://www.thirdfi.org/) +- [Thirdfi](https://data.thirdfi.org/) ## Join the community diff --git a/src/content/resources/link-token-contracts.mdx b/src/content/resources/link-token-contracts.mdx index 066e6cfeb7b..0e2f91a5367 100644 --- a/src/content/resources/link-token-contracts.mdx +++ b/src/content/resources/link-token-contracts.mdx @@ -128,6 +128,18 @@ Testnet ETH and LINK are available at [faucets.chain.link/arbitrum-sepolia](http | Decimals | 18 | | Network status | [arbiscan.freshstatus.io](https://arbiscan.freshstatus.io/) | +## Arc Network + +### Arc Network Testnet + +| Parameter | Value | +| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `5042002` | +| Address |
| +| Name | Chainlink Token on Arc Network Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Astar ### Astar Mainnet @@ -270,13 +282,13 @@ Testnet LINK are available at [faucets.chain.link/bitlayer-testnet](https://fauc ### Bittensor EVM Mainnet -| Parameter | Value | -| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chain ID | `964` | -| Address |
| -| Name | Chainlink Token on Bittensor EVM Mainnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `964` | +| Address |
| +| Name | Chainlink Token on Bittensor EVM Mainnet | +| Symbol | LINK | +| Decimals | 18 | ## Blast @@ -535,6 +547,18 @@ Testnet Native and LINK is available at [faucets.chain.link/corn-testnet](https: | Symbol | LINK | | Decimals | 18 | +## DogeOS + +### DogeOS Chikyu Testnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `6281971` | +| Address |
| +| Name | Chainlink Token on DogeOS Chikyu Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Ethereum ### Ethereum Mainnet @@ -580,6 +604,21 @@ Testnet ETH and LINK are available at [faucets.chain.link/holesky](https://fauce | Decimals | 18 | | Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | +### Ethereum Hoodi Testnet + +Testnet ETH is used to pay for transactions on Hoodi. + +Testnet ETH and LINK are available at [faucets.chain.link/hoodi](https://faucets.chain.link/hoodi). + +| Parameter | Value | +| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `560048` | +| Address |
| +| Name | Chainlink Token on Ethereum Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | + ## Etherlink ### Etherlink Mainnet @@ -770,6 +809,18 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## Henesys + +### Henesys Mainnet + +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `68414` | +| Address |
| +| Name | Chainlink Token on Nexon Henesys Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## HyperEVM ### HyperEVM Mainnet @@ -826,6 +877,28 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## Jovay + +### Jovay Mainnet + +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `5734951` | +| Address |
| +| Name | Chainlink Token on Jovay Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### Jovay Sepolia Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2019775` | +| Address |
| +| Name | Chainlink Token on Jovay Sepolia Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Kaia ### Kaia Mainnet @@ -866,8 +939,6 @@ ETH is used to pay for transactions on the Kroma mainnet. Testnet ETH is used to pay for transactions on the Kroma testnet. -Testnet Native and LINK are available at [faucets.chain.link/kroma-testnet](https://faucets.chain.link/kroma-testnet). - | Parameter | Value | | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ETH_CHAIN_ID` | `2358` | @@ -998,15 +1069,25 @@ Testnet Native and LINK are available at [faucets.chain.link/mantle-sepolia](htt | Symbol | LINK | | Decimals | 18 | -## MegaEth +## MegaETH -### MegaEth Testnet +### MegaETH Mainnet + +| Parameter | Value | +| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `4326` | +| Address |
| +| Name | Chainlink Token on MegaETH Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### MegaETH Testnet | Parameter | Value | | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Chain ID | `6342` | | Address |
| -| Name | Chainlink Token | +| Name | Chainlink Token on MegaETH Testnet | | Symbol | LINK | | Decimals | 18 | @@ -1213,6 +1294,28 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Decimals | 18 | | Network status | [moonscan.freshstatus.io](https://moonscan.freshstatus.io/) | +## Morph + +### Morph Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2818` | +| Address |
| +| Name | Chainlink Token on Morph Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### Morph Hoodi Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2910` | +| Address |
| +| Name | Chainlink Token on Morph Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Neo X ### Neo X Mainnet @@ -1235,18 +1338,6 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Symbol | LINK | | Decimals | 18 | -## Henesys - -### Henesys Mainnet - -| Parameter | Value | -| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chain ID | `68414` | -| Address |
| -| Name | Chainlink Token on Nexon Henesys Mainnet | -| Symbol | LINK | -| Decimals | 18 | - ## OPBNB ### OPBNB Mainnet @@ -1648,17 +1739,29 @@ S is used to pay for transactions on Sonic mainnet. | Symbol | LINK | | Decimals | 18 | -### Sonic Blaze Testnet +### Sonic Testnet -Testnet S is used to pay for transactions on Sonic Blaze testnet. +Testnet S is used to pay for transactions on Sonic Testnet. -| Parameter | Value | -| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ETH_CHAIN_ID` | `57054` | -| Address |
| -| Name | Chainlink Token on Sonice Blaze Testnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ETH_CHAIN_ID` | `14601` | +| Address |
| +| Name | Chainlink Token on Sonic Testnet | +| Symbol | LINK | +| Decimals | 18 | + +## Stable + +### Stable Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `988` | +| Address |
| +| Name | Chainlink Token on Stable Mainnet | +| Symbol | LINK | +| Decimals | 18 | ## Starknet @@ -1738,6 +1841,18 @@ Testnet S is used to pay for transactions on Sonic Blaze testnet. | Symbol | LINK | | Decimals | 18 | +## Tempo + +### Tempo Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `42429` | +| Address |
| +| Name | Chainlink Token on Tempo Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Treasure ### Treasure Mainnet @@ -1812,7 +1927,7 @@ Testnet Native and LINK are available at [faucets.chain.link/wemix-testnet](http | Symbol | LINK | | Decimals | 18 | -## World +## World Chain ### World Chain Mainnet @@ -1874,15 +1989,15 @@ Testnet ETH is used to pay for transactions on World Chain Sepolia. Testnet Nati | Symbol | LINK | | Decimals | 18 | -### X Layer Sepolia Testnet +### X Layer Testnet -| Parameter | Value | -| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chain ID | `195` | -| Address |
| -| Name | Chainlink Token on X Layer Sepolia Testnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `1952` | +| Address |
| +| Name | Chainlink Token on X Layer Testnet | +| Symbol | LINK | +| Decimals | 18 | ## Zircuit @@ -1902,8 +2017,6 @@ ETH is used to pay for transactions on the Zircuit mainnet. Testnet ETH is used to pay for transactions on the Zircuit testnet. -Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](https://faucets.chain.link/zircuit-sepolia). - | Parameter | Value | | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ETH_CHAIN_ID` | `48899` | @@ -1916,7 +2029,7 @@ Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](ht ### ZKsync Era Mainnet -ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://zksync.io/explore#bridges) to transfer ETH from Ethereum to ZKsync. +ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://docs.zksync.io/zksync-network/zksync-era/ecosystem/bridges) to transfer ETH from Ethereum to ZKsync. | Parameter | Value | | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/src/content/resources/llms-full.txt b/src/content/resources/llms-full.txt index e039241fa49..e657d295f0c 100644 --- a/src/content/resources/llms-full.txt +++ b/src/content/resources/llms-full.txt @@ -285,12 +285,6 @@ Chainlink runs hackathons multiple times per year and often sponsors other hacka To stay up to date on the hackathons that Chainlink is running or sponsoring, keep an eye out on the official Chainlink social media channels, and sign up for our [developer newsletter](/resources/developer-communications). -## Applying for a grant - -The [Chainlink grant program](https://chain.link/community/grants) encourages development of critical developer tooling, add high-quality data, and the launch key services around the Chainlink Network. Grant categories include community, integration, bug bounty, research, and social impact grants. If you have a great idea that fits into one of these categories, you can apply for a grant. If successful, you will receive the funding and support needed to successfully build and implement your idea. - -For more information about the grant program, go to the [Chainlink Grants web page](https://chain.link/community/grants). - --- # Install Frameworks @@ -697,7 +691,7 @@ If you are new to Smart Contracts, read the [Getting Started Guide](/getting-sta ### BUILD projects - [Source Network](https://source.network/) -- [Thirdfi](https://www.thirdfi.org/) +- [Thirdfi](https://data.thirdfi.org/) ## Join the community @@ -892,6 +886,18 @@ Testnet ETH and LINK are available at [faucets.chain.link/arbitrum-sepolia](http | Decimals | 18 | | Network status | [arbiscan.freshstatus.io](https://arbiscan.freshstatus.io/) | +## Arc Network + +### Arc Network Testnet + +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `5042002` | +| Address |
| +| Name | Chainlink Token on Arc Network Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Astar ### Astar Mainnet @@ -1034,13 +1040,13 @@ Testnet LINK are available at [faucets.chain.link/bitlayer-testnet](https://fauc ### Bittensor EVM Mainnet -| Parameter | Value | -| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Chain ID | `964` | -| Address |
| -| Name | Chainlink Token on Bittensor EVM Mainnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `964` | +| Address |
| +| Name | Chainlink Token on Bittensor EVM Mainnet | +| Symbol | LINK | +| Decimals | 18 | ## Blast @@ -1299,6 +1305,18 @@ Testnet Native and LINK is available at [faucets.chain.link/corn-testnet](https: | Symbol | LINK | | Decimals | 18 | +## DogeOS + +### DogeOS Chikyu Testnet + +| Parameter | Value | +| :-------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `6281971` | +| Address |
| +| Name | Chainlink Token on DogeOS Chikyu Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Ethereum ### Ethereum Mainnet @@ -1344,6 +1362,21 @@ Testnet ETH and LINK are available at [faucets.chain.link/holesky](https://fauce | Decimals | 18 | | Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | +### Ethereum Hoodi Testnet + +Testnet ETH is used to pay for transactions on Hoodi. + +Testnet ETH and LINK are available at [faucets.chain.link/hoodi](https://faucets.chain.link/hoodi). + +| Parameter | Value | +| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `560048` | +| Address |
| +| Name | Chainlink Token on Ethereum Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | + ## Etherlink ### Etherlink Mainnet @@ -1534,6 +1567,18 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## Henesys + +### Henesys Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `68414` | +| Address |
| +| Name | Chainlink Token on Nexon Henesys Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## HyperEVM ### HyperEVM Mainnet @@ -1590,6 +1635,28 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## Jovay + +### Jovay Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `5734951` | +| Address |
| +| Name | Chainlink Token on Jovay Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### Jovay Sepolia Testnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2019775` | +| Address |
| +| Name | Chainlink Token on Jovay Sepolia Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Kaia ### Kaia Mainnet @@ -1630,8 +1697,6 @@ ETH is used to pay for transactions on the Kroma mainnet. Testnet ETH is used to pay for transactions on the Kroma testnet. -Testnet Native and LINK are available at [faucets.chain.link/kroma-testnet](https://faucets.chain.link/kroma-testnet). - | Parameter | Value | | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ETH_CHAIN_ID` | `2358` | @@ -1762,15 +1827,25 @@ Testnet Native and LINK are available at [faucets.chain.link/mantle-sepolia](htt | Symbol | LINK | | Decimals | 18 | -## MegaEth +## MegaETH + +### MegaETH Mainnet + +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `4326` | +| Address |
| +| Name | Chainlink Token on MegaETH Mainnet | +| Symbol | LINK | +| Decimals | 18 | -### MegaEth Testnet +### MegaETH Testnet | Parameter | Value | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Chain ID | `6342` | | Address |
| -| Name | Chainlink Token | +| Name | Chainlink Token on MegaETH Testnet | | Symbol | LINK | | Decimals | 18 | @@ -1977,6 +2052,28 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Decimals | 18 | | Network status | [moonscan.freshstatus.io](https://moonscan.freshstatus.io/) | +## Morph + +### Morph Mainnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2818` | +| Address |
| +| Name | Chainlink Token on Morph Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### Morph Hoodi Testnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2910` | +| Address |
| +| Name | Chainlink Token on Morph Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Neo X ### Neo X Mainnet @@ -1999,18 +2096,6 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Symbol | LINK | | Decimals | 18 | -## Henesys - -### Henesys Mainnet - -| Parameter | Value | -| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Chain ID | `68414` | -| Address |
| -| Name | Chainlink Token on Nexon Henesys Mainnet | -| Symbol | LINK | -| Decimals | 18 | - ## OPBNB ### OPBNB Mainnet @@ -2413,17 +2498,29 @@ S is used to pay for transactions on Sonic mainnet. | Symbol | LINK | | Decimals | 18 | -### Sonic Blaze Testnet +### Sonic Testnet -Testnet S is used to pay for transactions on Sonic Blaze testnet. +Testnet S is used to pay for transactions on Sonic Testnet. -| Parameter | Value | -| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ETH_CHAIN_ID` | `57054` | -| Address |
| -| Name | Chainlink Token on Sonice Blaze Testnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ETH_CHAIN_ID` | `14601` | +| Address |
| +| Name | Chainlink Token on Sonic Testnet | +| Symbol | LINK | +| Decimals | 18 | + +## Stable + +### Stable Mainnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `988` | +| Address |
| +| Name | Chainlink Token on Stable Mainnet | +| Symbol | LINK | +| Decimals | 18 | ## Starknet @@ -2503,6 +2600,18 @@ Testnet S is used to pay for transactions on Sonic Blaze testnet. | Symbol | LINK | | Decimals | 18 | +## Tempo + +### Tempo Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `42429` | +| Address |
| +| Name | Chainlink Token on Tempo Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## Treasure ### Treasure Mainnet @@ -2577,7 +2686,7 @@ Testnet Native and LINK are available at [faucets.chain.link/wemix-testnet](http | Symbol | LINK | | Decimals | 18 | -## World +## World Chain ### World Chain Mainnet @@ -2639,15 +2748,15 @@ Testnet ETH is used to pay for transactions on World Chain Sepolia. Testnet Nati | Symbol | LINK | | Decimals | 18 | -### X Layer Sepolia Testnet +### X Layer Testnet -| Parameter | Value | -| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chain ID | `195` | -| Address |
| -| Name | Chainlink Token on X Layer Sepolia Testnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `1952` | +| Address |
| +| Name | Chainlink Token on X Layer Testnet | +| Symbol | LINK | +| Decimals | 18 | ## Zircuit @@ -2667,8 +2776,6 @@ ETH is used to pay for transactions on the Zircuit mainnet. Testnet ETH is used to pay for transactions on the Zircuit testnet. -Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](https://faucets.chain.link/zircuit-sepolia). - | Parameter | Value | | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `ETH_CHAIN_ID` | `48899` | @@ -2681,7 +2788,7 @@ Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](ht ### ZKsync Era Mainnet -ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://zksync.io/explore#bridges) to transfer ETH from Ethereum to ZKsync. +ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://docs.zksync.io/zksync-network/zksync-era/ecosystem/bridges) to transfer ETH from Ethereum to ZKsync. | Parameter | Value | | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | diff --git a/src/content/vrf/llms-full.txt b/src/content/vrf/llms-full.txt index 4b026ed98b3..86ee6c1fc8e 100644 --- a/src/content/vrf/llms-full.txt +++ b/src/content/vrf/llms-full.txt @@ -373,6 +373,182 @@ contract VRFD20 is VRFConsumerBaseV2Plus { ``` +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * @notice A Chainlink VRF consumer which uses randomness to mimic the rolling + * of a 20 sided dice + */ + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFD20 is VRFConsumerBaseV2Plus { + uint256 private constant ROLL_IN_PROGRESS = 42; + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/vrf/v2-5/supported-networks#configurations + address public vrfCoordinator = 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks#configurations + bytes32 public s_keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 40,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 40_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 1 random value in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 1; + + // map rollers to requestIds + mapping(uint256 => address) private s_rollers; + // map vrf results to rollers + mapping(address => uint256) private s_results; + + event DiceRolled(uint256 indexed requestId, address indexed roller); + event DiceLanded(uint256 indexed requestId, uint256 indexed result); + + /** + * @notice Constructor inherits VRFConsumerBaseV2Plus + * + * @dev NETWORK: Sepolia + * + * @param subscriptionId subscription ID that this consumer contract can use + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(vrfCoordinator) { + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * @dev Warning: if the VRF response is delayed, avoid calling requestRandomness repeatedly + * as that would give miners/VRF operators latitude about which VRF response arrives first. + * @dev You must review your implementation details with extreme care. + * + * @param roller address of the roller + */ + function rollDice( + address roller + ) public onlyOwner returns (uint256 requestId) { + require(s_results[roller] == 0, "Already rolled"); + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: s_keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes( + // Set nativePayment to true to pay for VRF requests with Sepolia ETH instead of LINK + VRFV2PlusClient.ExtraArgsV1({nativePayment: false}) + ) + }) + ); + + s_rollers[requestId] = roller; + s_results[roller] = ROLL_IN_PROGRESS; + emit DiceRolled(requestId, roller); + } + + /** + * @notice Callback function used by VRF Coordinator to return the random number to this contract. + * + * @dev Some action on the contract state should be taken here, like storing the result. + * @dev WARNING: take care to avoid having multiple VRF requests in flight if their order of arrival would result + * in contract states with different outcomes. Otherwise miners or the VRF operator would could take advantage + * by controlling the order. + * @dev The VRF Coordinator will only send this function verified responses, and the parent VRFConsumerBaseV2 + * contract ensures that this method only receives randomness from the designated VRFCoordinator. + * + * @param requestId uint256 + * @param randomWords uint256[] The random result returned by the oracle. + */ + function fulfillRandomWords( + uint256 requestId, + uint256[] calldata randomWords + ) internal override { + uint256 d20Value = (randomWords[0] % 20) + 1; + s_results[s_rollers[requestId]] = d20Value; + emit DiceLanded(requestId, d20Value); + } + + /** + * @notice Get the house assigned to the player once the address has rolled + * @param player address + * @return house as a string + */ + function house( + address player + ) public view returns (string memory) { + require(s_results[player] != 0, "Dice not rolled"); + require(s_results[player] != ROLL_IN_PROGRESS, "Roll in progress"); + return _getHouseName(s_results[player]); + } + + /** + * @notice Get the house name from the id + * @param id uint256 + * @return house name string + */ + function _getHouseName( + uint256 id + ) private pure returns (string memory) { + string[20] memory houseNames = [ + "Targaryen", + "Lannister", + "Stark", + "Tyrell", + "Baratheon", + "Martell", + "Tully", + "Bolton", + "Greyjoy", + "Arryn", + "Frey", + "Mormont", + "Tarley", + "Dayne", + "Umber", + "Valeryon", + "Manderly", + "Clegane", + "Glover", + "Karstark" + ]; + return houseNames[id - 1]; + } +} +``` + You have now completed all necessary functions to generate randomness and assign the user a *Game of Thrones* house. We've added a few helper functions in there to make using the contract easier and more flexible. You can deploy and interact with the complete contract in Remix. ## How do I deploy to testnet? @@ -473,6 +649,128 @@ If using subscriptions, [create and fund a new VRF v2.5 subscription](/vrf/v2-5/ For direct funding, deploy the [`DirectFundingConsumer`](/samples/VRF/v2-5/DirectFundingConsumer.sol) example: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + ### Update your code To modify your existing smart contract code to work with VRF v2.5, complete the following changes: @@ -486,6 +784,118 @@ The example `SubscriptionConsumer` contract shows the migration steps above, app Open the full example `SubscriptionConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + Compare the major changes between V2.5 and V2: @@ -495,6 +905,128 @@ The example `DirectFundingConsumer` contract shows the migration steps above, ap Open the full example `DirectFundingConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + Compare the major changes between V2.5 and V2: --- @@ -545,6 +1077,128 @@ If using subscriptions, [create and fund a new VRF v2.5 subscription](/vrf/v2-5/ For direct funding, deploy the [`DirectFundingConsumer`](/samples/VRF/v2-5/DirectFundingConsumer.sol) example: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + ### Update your code To modify your existing smart contract code to work with VRF v2.5, complete the following changes: @@ -556,8 +1210,242 @@ View example code for both VRF 2.5 subscription and direct funding: Open the full example `SubscriptionConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + Open the full example `DirectFundingConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + --- # Supported Networks @@ -1383,6 +2271,118 @@ Build and deploy the contract on Sepolia. 1. Open the [SubscriptionConsumer.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/v2-5/SubscriptionConsumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that relies on a subscription for funding. + pragma solidity ^0.8.20; + + import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; + import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `SubscriptionConsumer.sol` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Provider** environment, select the `SubscriptionConsumer` contract from the contract list, and specify your `subscriptionId` so the constructor can set it. @@ -1435,6 +2435,118 @@ You deployed a simple contract that can request and receive random values from C In this example, your MetaMask wallet is the subscription owner and you created a consuming contract to use that subscription. The consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Configuration](/vrf/v2-5/supported-networks) page. - `uint256 s_subscriptionId`: The subscription ID that this contract uses for funding requests. @@ -1506,8 +2618,113 @@ For local testing, use the default "Remix VM" environment. Open *VRFv2_5Consumer* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * @title The RandomNumberConsumerV2_5 contract + * @notice A contract that gets random values from Chainlink VRF V2_5 + */ +contract RandomNumberConsumerV2_5 is VRFConsumerBaseV2Plus { + // Your subscription ID. + uint256 immutable s_subscriptionId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 immutable s_keyHash; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 constant CALLBACK_GAS_LIMIT = 100_000; + + // The default is 3, but you can set this higher. + uint16 constant REQUEST_CONFIRMATIONS = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 constant NUM_WORDS = 2; + + uint256[] public s_randomWords; + uint256 public s_requestId; + + event ReturnedRandomness(uint256[] randomWords); + + /** + * @notice Constructor inherits VRFConsumerBaseV2Plus + * + * @param subscriptionId - the subscription ID that this contract uses for funding requests + * @param vrfCoordinator - coordinator, check https://docs.chain.link/vrf/v2-5/supported-networks + * @param keyHash - the gas lane to use, which specifies the maximum gas price to bump to + */ + constructor( + uint256 subscriptionId, + address vrfCoordinator, + bytes32 keyHash + ) VRFConsumerBaseV2Plus(vrfCoordinator) { + s_keyHash = keyHash; + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * Assumes the subscription is funded sufficiently; "Words" refers to unit of data in Computer Science + */ + function requestRandomWords() external onlyOwner { + // Will revert if subscription is not set and funded. + s_requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: s_keyHash, + subId: s_subscriptionId, + requestConfirmations: REQUEST_CONFIRMATIONS, + callbackGasLimit: CALLBACK_GAS_LIMIT, + numWords: NUM_WORDS, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})) + }) + ); + } + + /** + * @notice Callback function used by VRF Coordinator + * + * @param - id of the request + * @param randomWords - array of random results from VRF Coordinator + */ + function fulfillRandomWords( + uint256, + /* requestId */ + uint256[] calldata randomWords + ) internal override { + s_randomWords = randomWords; + emit ReturnedRandomness(randomWords); + } +} +``` + Open *VRFCoordinatorV2_5Mock* in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol"; +``` + On the *Solidity Compiler* tab, expand the *Advanced Configurations* section and check the *Enable optimization* box before you compile the *VRFCoordinatorV2_5Mock* contract: Your Remix IDE file explorer should display *VRFCoordinatorV2_5Mock.sol* and *VRFv2_5Consumer.sol*: @@ -1630,6 +2847,128 @@ Build and deploy the contract on Sepolia. 1. Open the [`DirectFundingConsumer.sol` contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/v2-5/DirectFundingConsumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that directly pays for each request. + pragma solidity ^0.8.20; + + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; + import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `DirectFundingConsumer` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Web3 Environment** and select the `DirectFundingConsumer` contract from the contract list. @@ -1670,6 +3009,128 @@ The deployed contract requests random values from Chainlink VRF, receives those In this example, the consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Supported networks](/vrf/v2-5/supported-networks) page. - `uint32 callbackGasLimit`: The limit for how much gas to use for the callback request to your contract's `fulfillRandomWords()` function. It must be less than the `maxGasLimit` limit on the coordinator contract minus the `wrapperGasOverhead`. See the [VRF v2.5 Direct funding limits](/vrf/v2-5/overview/direct-funding#limits) for more details. Adjust this value for larger requests depending on how your `fulfillRandomWords()` function processes and stores the received random values. If your `callbackGasLimit` is not sufficient, the callback will fail and your consuming contract is still charged for the work done to generate your requested random values. @@ -2096,6 +3557,71 @@ Note, the below values have to be configured correctly for VRF requests to work. testnet LINK](/resources/acquire-link) and [Fund your contract](/resources/fund-your-contract)**. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {VRFConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBase.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ +contract RandomNumberConsumer is VRFConsumerBase { + event RequestFulfilled(bytes32 requestId, uint256 randomness); + + bytes32 internal keyHash; + uint256 internal fee; + uint256 public randomResult; + + /** + * Constructor inherits VRFConsumerBase + * + * Network: Sepolia + * Chainlink VRF Coordinator address: 0x271682DEB8C4E0901D1a1550aD2e64D568E69909 + * LINK token address: 0x779877A7B0D9E8603169DdbD7836e478b4624789 + * Key Hash: 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c + */ + constructor() + VRFConsumerBase( + 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625, // VRF Coordinator + 0x779877A7B0D9E8603169DdbD7836e478b4624789 // LINK Token + ) + { + keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + fee = 0.1 * 10 ** 18; // 0.1 LINK (Varies by network) + } + + /** + * Requests randomness + */ + function getRandomNumber() public returns (bytes32 requestId) { + require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet"); + return requestRandomness(keyHash, fee); + } + + /** + * Callback function used by VRF Coordinator + */ + function fulfillRandomness( + bytes32 requestId, + uint256 randomness + ) internal override { + randomResult = randomness; + emit RequestFulfilled(requestId, randomness); + } + + // function withdrawLink() external {} - Implement a withdraw function to avoid locking your LINK in the contract +} +``` + @@ -2346,38 +3872,158 @@ function fulfillRandomWords( } ``` -You could also map the `requestId` to an index to keep track of the order in which a request was made. +You could also map the `requestId` to an index to keep track of the order in which a request was made. + + +```solidity +mapping(uint256 => uint256) s_requestIdToRequestIndex; +mapping(uint256 => uint256[]) public s_requestIndexToRandomWords; +uint256 public requestCounter; + +function requestRandomWords() external onlyOwner { + uint256 requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); + s_requestIdToRequestIndex[requestId] = requestCounter; + requestCounter += 1; +} + +function fulfillRandomWords( + uint256 requestId, + uint256[] memory randomWords + ) internal override { + uint256 requestNumber = s_requestIdToRequestIndex[requestId]; + s_requestIndexToRandomWords[requestNumber] = randomWords; +} +``` + +## Processing VRF responses through different execution paths + +If you want to process VRF responses depending on predetermined conditions, you can create an `enum`. When requesting for randomness, map each `requestId` to an enum. This way, you can handle different execution paths in `fulfillRandomWords`. See the following example: + +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +// It shows how to setup multiple execution paths for handling a response. +pragma solidity ^0.8.7; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2MultiplePaths is VRFConsumerBaseV2 { + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/docs/vrf/v2/supported-networks/#configurations + address vrfCoordinator = 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/supported-networks/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + uint32 callbackGasLimit = 100_000; + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; -```solidity -mapping(uint256 => uint256) s_requestIdToRequestIndex; -mapping(uint256 => uint256[]) public s_requestIndexToRandomWords; -uint256 public requestCounter; + // For this example, retrieve 1 random value in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 1; -function requestRandomWords() external onlyOwner { - uint256 requestId = COORDINATOR.requestRandomWords( - keyHash, - s_subscriptionId, - requestConfirmations, - callbackGasLimit, - numWords - ); - s_requestIdToRequestIndex[requestId] = requestCounter; - requestCounter += 1; -} + enum Variable { + A, + B, + C + } -function fulfillRandomWords( + uint256 public variableA; + uint256 public variableB; + uint256 public variableC; + + mapping(uint256 => Variable) public requests; + + // events + event FulfilledA(uint256 requestId, uint256 value); + event FulfilledB(uint256 requestId, uint256 value); + event FulfilledC(uint256 requestId, uint256 value); + + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + s_subscriptionId = subscriptionId; + } + + function updateVariable( + uint256 input + ) public { + uint256 requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + + if (input % 2 == 0) { + requests[requestId] = Variable.A; + } else if (input % 3 == 0) { + requests[requestId] = Variable.B; + } else { + requests[requestId] = Variable.C; + } + } + + function fulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) internal override { - uint256 requestNumber = s_requestIdToRequestIndex[requestId]; - s_requestIndexToRandomWords[requestNumber] = randomWords; -} -``` + Variable variable = requests[requestId]; + if (variable == Variable.A) { + fulfillA(requestId, randomWords[0]); + } else if (variable == Variable.B) { + fulfillB(requestId, randomWords[0]); + } else if (variable == Variable.C) { + fulfillC(requestId, randomWords[0]); + } + } -## Processing VRF responses through different execution paths + function fulfillA( + uint256 requestId, + uint256 randomWord + ) private { + // execution path A + variableA = randomWord; + emit FulfilledA(requestId, randomWord); + } -If you want to process VRF responses depending on predetermined conditions, you can create an `enum`. When requesting for randomness, map each `requestId` to an enum. This way, you can handle different execution paths in `fulfillRandomWords`. See the following example: + function fulfillB( + uint256 requestId, + uint256 randomWord + ) private { + // execution path B + variableB = randomWord; + emit FulfilledB(requestId, randomWord); + } + + function fulfillC( + uint256 requestId, + uint256 randomWord + ) private { + // execution path C + variableC = randomWord; + emit FulfilledC(requestId, randomWord); + } +} +``` --- @@ -2412,6 +4058,104 @@ Build and deploy the contract on Sepolia. 1. Open the [`VRFv2DirectFundingConsumer.sol` contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/VRFv2DirectFundingConsumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that directly pays for each request. + pragma solidity ^0.8.7; + + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + + import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + import {VRFV2WrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract VRFv2DirectFundingConsumer is VRFV2WrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 numWords = 2; + + // Address LINK - hardcoded for Sepolia + address linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address wrapperAddress = 0xab18414CD93297B0d12ac29E63Ca20f515b3DB46; + + constructor() ConfirmedOwner(msg.sender) VRFV2WrapperConsumerBase(linkAddress, wrapperAddress) {} + + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + requestId = requestRandomness(callbackGasLimit, requestConfirmations, numWords); + s_requests[requestId] = RequestStatus({ + paid: VRF_V2_WRAPPER.calculateRequestPrice(callbackGasLimit), randomWords: new uint256[](0), fulfilled: false + }); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `VRFv2DirectFundingConsumer` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Web3 Environment** and select the `VRFv2DirectFundingConsumer` contract from the contract list. @@ -2463,6 +4207,104 @@ The deployed contract requests random values from Chainlink VRF, receives those In this example, the consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.7; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2WrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2DirectFundingConsumer is VRFV2WrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 numWords = 2; + + // Address LINK - hardcoded for Sepolia + address linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address wrapperAddress = 0xab18414CD93297B0d12ac29E63Ca20f515b3DB46; + + constructor() ConfirmedOwner(msg.sender) VRFV2WrapperConsumerBase(linkAddress, wrapperAddress) {} + + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + requestId = requestRandomness(callbackGasLimit, requestConfirmations, numWords); + s_requests[requestId] = RequestStatus({ + paid: VRF_V2_WRAPPER.calculateRequestPrice(callbackGasLimit), randomWords: new uint256[](0), fulfilled: false + }); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Supported networks](/vrf/v2/direct-funding/supported-networks) page. - `uint32 callbackGasLimit`: The limit for how much gas to use for the callback request to your contract's `fulfillRandomWords()` function. It must be less than the `maxGasLimit` limit on the coordinator contract minus the `wrapperGasOverhead`. See the [VRF v2 Direct funding limits](/vrf/v2/direct-funding/#limits) for more details. Adjust this value for larger requests depending on how your `fulfillRandomWords()` function processes and stores the received random values. If your `callbackGasLimit` is not sufficient, the callback will fail and your consuming contract is still charged for the work done to generate your requested random values. @@ -2513,7 +4355,7 @@ This guide explains how to test Chainlink VRF v2 on a [Remix IDE](https://remix- Complete the following tasks to test your VRF v2 consumer locally: 1. Deploy the [VRFCoordinatorV2Mock](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol). This contract is a mock of the [VRFCoordinatorV2](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFCoordinatorV2.sol) contract. -2. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol) contract. +2. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/tests/MockV3Aggregator.sol) contract. 3. Deploy the [LinkToken](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/token/ERC677/LinkToken.sol) contract. 4. Deploy the [VRFV2Wrapper](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol) contract. 5. Call the VRFV2Wrapper [setConfig function](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol#L119) to set wrapper specific parameters. @@ -2550,14 +4392,142 @@ This guide will require you to finetune the gas limit when fulfilling requests. Open *VRFCoordinatorV2Mock* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol"; +``` + Open *MockV3Aggregator* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol"; +``` + Open *LinkToken* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@chainlink/contracts/src/v0.8/shared/token/ERC677/LinkToken.sol"; +``` + Open *VRFV2Wrapper* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.6; + +import "@chainlink/contracts/src/v0.8/vrf/VRFV2Wrapper.sol"; +``` + Open *RandomNumberDirectFundingConsumerV2* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.7; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {VRFV2WrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UNAUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract RandomNumberDirectFundingConsumerV2 is VRFV2WrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords, uint256 paid); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + error InsufficientFunds(uint256 balance, uint256 paid); + error RequestNotFound(uint256 requestId); + error LinkTransferError(address sender, address receiver, uint256 amount); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // configuration: https://docs.chain.link/vrf/v2/direct-funding/supported-networks#configurations + constructor( + address _linkAddress, + address _wrapperAddress + ) ConfirmedOwner(msg.sender) VRFV2WrapperConsumerBase(_linkAddress, _wrapperAddress) {} + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + // The default is 3, but you can set this higher. + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + function requestRandomWords( + uint32 _callbackGasLimit, + uint16 _requestConfirmations, + uint32 _numWords + ) external onlyOwner returns (uint256 requestId) { + requestId = requestRandomness(_callbackGasLimit, _requestConfirmations, _numWords); + uint256 paid = VRF_V2_WRAPPER.calculateRequestPrice(_callbackGasLimit); + uint256 balance = LINK.balanceOf(address(this)); + if (balance < paid) revert InsufficientFunds(balance, paid); + s_requests[requestId] = RequestStatus({paid: paid, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, _numWords, paid); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + RequestStatus storage request = s_requests[_requestId]; + if (request.paid == 0) revert RequestNotFound(_requestId); + request.fulfilled = true; + request.randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, request.paid); + } + + function getNumberOfRequests() external view returns (uint256) { + return requestIds.length; + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + RequestStatus memory request = s_requests[_requestId]; + if (request.paid == 0) revert RequestNotFound(_requestId); + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink( + address _receiver + ) public onlyOwner { + bool success = LINK.transfer(_receiver, LINK.balanceOf(address(this))); + if (!success) { + revert LinkTransferError(msg.sender, _receiver, LINK.balanceOf(address(this))); + } + } +} +``` + Your RemixIDE file explorer should display the opened contracts: ### Select the correct RemixIDE environment @@ -3423,6 +5393,181 @@ contract VRFD20 is VRFConsumerBaseV2 { ``` +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * @notice A Chainlink VRF consumer which uses randomness to mimic the rolling + * of a 20 sided dice + */ + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFD20 is VRFConsumerBaseV2 { + uint256 private constant ROLL_IN_PROGRESS = 42; + + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + address vrfCoordinator = 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 s_keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 40,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 40_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 1 random value in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 1; + address s_owner; + + // map rollers to requestIds + mapping(uint256 => address) private s_rollers; + // map vrf results to rollers + mapping(address => uint256) private s_results; + + event DiceRolled(uint256 indexed requestId, address indexed roller); + event DiceLanded(uint256 indexed requestId, uint256 indexed result); + + /** + * @notice Constructor inherits VRFConsumerBaseV2 + * + * @dev NETWORK: Sepolia + * + * @param subscriptionId subscription id that this consumer contract can use + */ + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + s_owner = msg.sender; + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * @dev Warning: if the VRF response is delayed, avoid calling requestRandomness repeatedly + * as that would give miners/VRF operators latitude about which VRF response arrives first. + * @dev You must review your implementation details with extreme care. + * + * @param roller address of the roller + */ + function rollDice( + address roller + ) public onlyOwner returns (uint256 requestId) { + require(s_results[roller] == 0, "Already rolled"); + // Will revert if subscription is not set and funded. + requestId = + COORDINATOR.requestRandomWords(s_keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + + s_rollers[requestId] = roller; + s_results[roller] = ROLL_IN_PROGRESS; + emit DiceRolled(requestId, roller); + } + + /** + * @notice Callback function used by VRF Coordinator to return the random number to this contract. + * + * @dev Some action on the contract state should be taken here, like storing the result. + * @dev WARNING: take care to avoid having multiple VRF requests in flight if their order of arrival would result + * in contract states with different outcomes. Otherwise miners or the VRF operator would could take advantage + * by controlling the order. + * @dev The VRF Coordinator will only send this function verified responses, and the parent VRFConsumerBaseV2 + * contract ensures that this method only receives randomness from the designated VRFCoordinator. + * + * @param requestId uint256 + * @param randomWords uint256[] The random result returned by the oracle. + */ + function fulfillRandomWords( + uint256 requestId, + uint256[] memory randomWords + ) internal override { + uint256 d20Value = (randomWords[0] % 20) + 1; + s_results[s_rollers[requestId]] = d20Value; + emit DiceLanded(requestId, d20Value); + } + + /** + * @notice Get the house assigned to the player once the address has rolled + * @param player address + * @return house as a string + */ + function house( + address player + ) public view returns (string memory) { + require(s_results[player] != 0, "Dice not rolled"); + require(s_results[player] != ROLL_IN_PROGRESS, "Roll in progress"); + return getHouseName(s_results[player]); + } + + /** + * @notice Get the house name from the id + * @param id uint256 + * @return house name string + */ + function getHouseName( + uint256 id + ) private pure returns (string memory) { + string[20] memory houseNames = [ + "Targaryen", + "Lannister", + "Stark", + "Tyrell", + "Baratheon", + "Martell", + "Tully", + "Bolton", + "Greyjoy", + "Arryn", + "Frey", + "Mormont", + "Tarley", + "Dayne", + "Umber", + "Valeryon", + "Manderly", + "Clegane", + "Glover", + "Karstark" + ]; + return houseNames[id - 1]; + } + + modifier onlyOwner() { + require(msg.sender == s_owner); + _; + } +} +``` + You have now completed all necessary functions to generate randomness and assign the user a *Game of Thrones* house. We've added a few helper functions in there to make using the contract easier and more flexible. You can deploy and interact with the complete contract in Remix. ## How do I deploy to testnet? @@ -3593,6 +5738,109 @@ Build and deploy the contract on Sepolia. 1. Open the [`VRFv2Consumer.sol` contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/VRFv2Consumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that relies on a subscription for funding. + pragma solidity ^0.8.7; + + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; + import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract VRFv2Consumer is VRFConsumerBaseV2, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + */ + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) ConfirmedOwner(msg.sender) { + COORDINATOR = VRFCoordinatorV2Interface(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625); + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `VRFv2Consumer.sol` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Provider** environment, select the `VRFv2Consumer` contract from the contract list, and specify your `subscriptionId` so the constructor can set it. @@ -3640,6 +5888,109 @@ You deployed a simple contract that can request and receive random values from C In this example, your MetaMask wallet is the subscription owner and you created a consuming contract to use that subscription. The consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.7; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2Consumer is VRFConsumerBaseV2, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + */ + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) ConfirmedOwner(msg.sender) { + COORDINATOR = VRFCoordinatorV2Interface(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625); + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Configuration](/vrf/v2/subscription/supported-networks) page. - `uint64 s_subscriptionId`: The subscription ID that this contract uses for funding requests. @@ -3714,6 +6065,137 @@ In this example, the contract operates as a subscription owner and can run funct Subscription owners and consumers do not have to be separate. This contract not only allows adding consumers with `addConsumer(address consumerAddress)` but can also act as a consumer by running its own `requestRandomWords()` function. This example contract includes a `createNewSubscription()` function in the `constructor()` that creates the subscription and adds itself as a consumer automatically when you deploy it. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that also owns and manages the subscription +pragma solidity ^0.8.7; + +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2SubscriptionManager is VRFConsumerBaseV2 { + VRFCoordinatorV2Interface COORDINATOR; + LinkTokenInterface LINKTOKEN; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + address vrfCoordinator = 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625; + + // Sepolia LINK token contract. For other networks, see + // https://docs.chain.link/docs/vrf-contracts/#configurations + address link_token_contract = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // A reasonable default is 100000, but this value could be different + // on other networks. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + // Storage parameters + uint256[] public s_randomWords; + uint256 public s_requestId; + uint64 public s_subscriptionId; + address s_owner; + + constructor() VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + LINKTOKEN = LinkTokenInterface(link_token_contract); + s_owner = msg.sender; + //Create a new subscription when you deploy the contract. + createNewSubscription(); + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() external onlyOwner { + // Will revert if subscription is not set and funded. + s_requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + } + + function fulfillRandomWords( + uint256, + /* requestId */ + uint256[] memory randomWords + ) internal override { + s_randomWords = randomWords; + } + + // Create a new subscription when the contract is initially deployed. + function createNewSubscription() private onlyOwner { + s_subscriptionId = COORDINATOR.createSubscription(); + // Add this contract as a consumer of its own subscription. + COORDINATOR.addConsumer(s_subscriptionId, address(this)); + } + + // Assumes this contract owns link. + // 1000000000000000000 = 1 LINK + function topUpSubscription( + uint256 amount + ) external onlyOwner { + LINKTOKEN.transferAndCall(address(COORDINATOR), amount, abi.encode(s_subscriptionId)); + } + + function addConsumer( + address consumerAddress + ) external onlyOwner { + // Add a consumer contract to the subscription. + COORDINATOR.addConsumer(s_subscriptionId, consumerAddress); + } + + function removeConsumer( + address consumerAddress + ) external onlyOwner { + // Remove a consumer contract from the subscription. + COORDINATOR.removeConsumer(s_subscriptionId, consumerAddress); + } + + function cancelSubscription( + address receivingWallet + ) external onlyOwner { + // Cancel the subscription and send the remaining LINK to a wallet address. + COORDINATOR.cancelSubscription(s_subscriptionId, receivingWallet); + s_subscriptionId = 0; + } + + // Transfer this contract's funds to an address. + // 1000000000000000000 = 1 LINK + function withdraw( + uint256 amount, + address to + ) external onlyOwner { + LINKTOKEN.transfer(to, amount); + } + + modifier onlyOwner() { + require(msg.sender == s_owner); + _; + } +} +``` + To use this contract, compile and deploy it in Remix. 1. Open the contract in [Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/VRFv2SubscriptionManager.sol). @@ -3750,6 +6232,27 @@ To use this contract, compile and deploy it in Remix. You can fund a subscription and request randomness in a single transaction. You must estimate how much the transaction might cost and determine the amount of funding to send to the subscription yourself. See the [Subscription billing](/vrf/v2/subscription/#subscription-limits) page to learn how to estimate request costs. +```sol +// Assumes this contract owns link +// You must estimate LINK cost yourself based on the gas lane and limits. +// 1_000_000_000_000_000_000 = 1 LINK +function fundAndRequestRandomWords(uint256 amount) external onlyOwner { + LINKTOKEN.transferAndCall( + address(COORDINATOR), + amount, + abi.encode(s_subscriptionId) + ); + // Will revert if subscription is not set and funded. + s_requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); +} +``` + Add this function to your contracts if you need to provide funding simultaneously with your requests. The `transferAndCall()` function sends LINK from your contract to the subscription, and the `requestRandomWords()` function requests the random words. Your contract still needs the `fulfillRandomWords()` callback function to receive the random values. --- @@ -3789,8 +6292,115 @@ Complete the following tasks to test your VRF v2 consumer locally: Open *VRFCoordinatorV2Mock* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol"; +``` + Open *VRFv2Consumer* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.7; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * @title The RandomNumberConsumerV2 contract + * @notice A contract that gets random values from Chainlink VRF V2 + */ +contract RandomNumberConsumerV2 is VRFConsumerBaseV2 { + VRFCoordinatorV2Interface immutable COORDINATOR; + + // Your subscription ID. + uint64 immutable s_subscriptionId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 immutable s_keyHash; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 constant CALLBACK_GAS_LIMIT = 100_000; + + // The default is 3, but you can set this higher. + uint16 constant REQUEST_CONFIRMATIONS = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 constant NUM_WORDS = 2; + + uint256[] public s_randomWords; + uint256 public s_requestId; + address s_owner; + + event ReturnedRandomness(uint256[] randomWords); + + /** + * @notice Constructor inherits VRFConsumerBaseV2 + * + * @param subscriptionId - the subscription ID that this contract uses for funding requests + * @param vrfCoordinator - coordinator, check https://docs.chain.link/docs/vrf-contracts/#configurations + * @param keyHash - the gas lane to use, which specifies the maximum gas price to bump to + */ + constructor( + uint64 subscriptionId, + address vrfCoordinator, + bytes32 keyHash + ) VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + s_keyHash = keyHash; + s_owner = msg.sender; + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * Assumes the subscription is funded sufficiently; "Words" refers to unit of data in Computer Science + */ + function requestRandomWords() external onlyOwner { + // Will revert if subscription is not set and funded. + s_requestId = + COORDINATOR.requestRandomWords(s_keyHash, s_subscriptionId, REQUEST_CONFIRMATIONS, CALLBACK_GAS_LIMIT, NUM_WORDS); + } + + /** + * @notice Callback function used by VRF Coordinator + * + * @param - id of the request + * @param randomWords - array of random results from VRF Coordinator + */ + function fulfillRandomWords( + uint256, + /* requestId */ + uint256[] memory randomWords + ) internal override { + s_randomWords = randomWords; + emit ReturnedRandomness(randomWords); + } + + modifier onlyOwner() { + require(msg.sender == s_owner); + _; + } +} +``` + Your RemixIDE file explorer should display *VRFCoordinatorV2Mock.sol* and *VRFv2Consumer.sol*: ### Deploy VRFCoordinatorV2Mock diff --git a/src/content/vrf/v2-5/supported-networks.mdx b/src/content/vrf/v2-5/supported-networks.mdx index be0b59fc33e..ff8ae743a54 100644 --- a/src/content/vrf/v2-5/supported-networks.mdx +++ b/src/content/vrf/v2-5/supported-networks.mdx @@ -215,7 +215,7 @@ Testnet LINK is available from https://faucets.chain.link/fuji | VRF Coordinator |
| | 2 gwei Key Hash | | | 30 gwei Key Hash | | -| Premium percentage
(paying with BASE) | 60 | +| Premium percentage
(paying with BASE Mainnet ETH) | 60 | | Premium percentage
(paying with LINK) | 50 | | Max Gas Limit | 2,500,000 | | Minimum Confirmations | 0 | @@ -230,7 +230,7 @@ Testnet LINK is available from https://faucets.chain.link/fuji | VRF Coordinator |
| | 2 gwei Key Hash | | | 30 gwei Key Hash | | | -| Premium percentage
(paying with BASE) | 60 | +| Premium percentage
(paying with BASE Mainnet ETH) | 60 | | Premium percentage
(paying with LINK) | 50 | | Minimum Confirmations | 0 | | Maximum Confirmations | 200 | diff --git a/src/content/vrf/v2/direct-funding/examples/test-locally.mdx b/src/content/vrf/v2/direct-funding/examples/test-locally.mdx index ee1aff0fdce..58db326b44f 100644 --- a/src/content/vrf/v2/direct-funding/examples/test-locally.mdx +++ b/src/content/vrf/v2/direct-funding/examples/test-locally.mdx @@ -27,7 +27,7 @@ This guide explains how to test Chainlink VRF v2 on a [Remix IDE](https://remix- Complete the following tasks to test your VRF v2 consumer locally: 1. Deploy the [VRFCoordinatorV2Mock](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol). This contract is a mock of the [VRFCoordinatorV2](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFCoordinatorV2.sol) contract. -1. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol) contract. +1. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/tests/MockV3Aggregator.sol) contract. 1. Deploy the [LinkToken](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/token/ERC677/LinkToken.sol) contract. 1. Deploy the [VRFV2Wrapper](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol) contract. 1. Call the VRFV2Wrapper [setConfig function](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol#L119) to set wrapper specific parameters. diff --git a/src/db/feedCategories.ts b/src/db/feedCategories.ts index b08864fb2c4..60003381a76 100644 --- a/src/db/feedCategories.ts +++ b/src/db/feedCategories.ts @@ -35,15 +35,23 @@ export const FEED_CATEGORY_CONFIG = { high: { key: "high", name: "High Market Risk", - icon: "🔴", + icon: "🟠", title: "High Market Risk - Feeds that deliver a heightened degree of some of the risk factors associated with Medium Market Risk Feeds, or a separate risk that makes the market price subject to uncertainty or volatile. In using a high market risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks.", link: "/data-feeds/selecting-data-feeds#-high-market-risk-feeds", }, + veryhigh: { + key: "veryhigh", + name: "Very High Market Risk", + icon: "🔴", + title: + "Very High Market Risk - Feeds with significant risk factors that require careful consideration. Users must thoroughly evaluate and understand all associated risks before use.", + link: "/data-feeds/selecting-data-feeds#-very-high-market-risk-feeds", + }, new: { key: "new", name: "New Token", - icon: "🟠", + icon: "🆕", title: "New Token - Tokens without the historical data required to implement a risk assessment framework may be launched in this category. Users must understand the additional market and volatility risks inherent with such assets. Users of New Token Feeds are responsible for independently verifying the liquidity and stability of the assets priced by feeds that they use.", link: "/data-feeds/selecting-data-feeds#-new-token-feeds", @@ -72,11 +80,12 @@ export type CategoryKey = keyof typeof FEED_CATEGORY_CONFIG Small helpers =========================== */ -const TABLE = "docs_feeds_risk" +const TABLE = "prod_feeds_risk_docs" const normalizeKey = (v?: string | null): CategoryKey | undefined => { if (!v) return undefined - const key = v.toLowerCase() as CategoryKey + // Handle "very high" from DB → "veryhigh" config key + const key = v.toLowerCase().replace(/\s+/g, "") as CategoryKey return key in FEED_CATEGORY_CONFIG ? key : undefined } diff --git a/src/db/supabase.ts b/src/db/supabase.ts index 5d62fb69d0a..206ce4b3c91 100644 --- a/src/db/supabase.ts +++ b/src/db/supabase.ts @@ -1,9 +1,10 @@ import { createClient } from "@supabase/supabase-js" +// Try PUBLIC_ prefixed vars first (needed for client-side/browser access in Astro) +// These work both locally and on Vercel when properly configured const supabaseUrl = import.meta.env.PUBLIC_SUPABASE_URL const supabaseKey = import.meta.env.PUBLIC_SUPABASE_ANON_KEY -// Export a function that safely creates the client export function getSupabaseClient() { if (!supabaseUrl || !supabaseKey) { return null @@ -11,5 +12,4 @@ export function getSupabaseClient() { return createClient(supabaseUrl, supabaseKey) } -// Export the client instance (may be null) export const supabase = getSupabaseClient() diff --git a/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx b/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx index 0ffd03021b7..e8ba23b8110 100644 --- a/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx +++ b/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx @@ -205,7 +205,7 @@ This tutorial implements production-grade cross-chain tokens using a three-termi | Terminal | Repository | Purpose | Commands | | -------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------- | -| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-base58-generator) | Generate governance transactions | `pnpm bs58` | +| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-bs58-generator) | Generate governance transactions | `pnpm bs58` | | **Terminal 2** | [Smart Contract Examples (Hardhat)](https://github.com/smartcontractkit/smart-contract-examples/tree/main/ccip/cct/hardhat) | Deploy EVM components | `npx hardhat` | | **Terminal 3** | [Solana Starter Kit](https://github.com/smartcontractkit/solana-starter-kit) | Test cross-chain transfers | `yarn` | diff --git a/src/features/chainlink-automation/common/ChainlinkAutomation.astro b/src/features/chainlink-automation/common/ChainlinkAutomation.astro index bea2da769b8..bf4bc6b154b 100644 --- a/src/features/chainlink-automation/common/ChainlinkAutomation.astro +++ b/src/features/chainlink-automation/common/ChainlinkAutomation.astro @@ -2,10 +2,11 @@ import StreamsLookupInterfaceComponent from "./StreamsLookupInterface.mdx" import ILogAutomationComponent from "./iLogAutomation.mdx" import DeprecationCalloutComponent from "./deprecation.mdx" +import CreCalloutComponent from "./cre-callout.mdx" export type Props = { section?: "ilogautomation" | "streamslookup" - callout?: "deprecation" + callout?: "deprecation" | "cre" } const { section, callout } = Astro.props as Props --- @@ -15,3 +16,5 @@ const { section, callout } = Astro.props as Props {section === "streamslookup" && } {callout === "deprecation" && } + +{callout === "cre" && } diff --git a/src/features/chainlink-automation/common/cre-callout.mdx b/src/features/chainlink-automation/common/cre-callout.mdx new file mode 100644 index 00000000000..63c3f2219d3 --- /dev/null +++ b/src/features/chainlink-automation/common/cre-callout.mdx @@ -0,0 +1,7 @@ +import { Aside } from "@components" + + diff --git a/src/features/chainlink-automation/components/NetworkIcons.tsx b/src/features/chainlink-automation/components/NetworkIcons.tsx index e8ba7419b95..52b60afa43c 100644 --- a/src/features/chainlink-automation/components/NetworkIcons.tsx +++ b/src/features/chainlink-automation/components/NetworkIcons.tsx @@ -1,6 +1,7 @@ /** @jsxImportSource preact */ import { useEffect } from "preact/compat" import { normalizeTechnologyName } from "@features/utils/index.ts" +import { getNetworkIconUrl } from "~/config/data/ccip/data.ts" // Component to add icons to network headings in the Automation supported-networks page export default function NetworkIcons() { @@ -42,13 +43,13 @@ export default function NetworkIcons() { // Get the normalized technology name for icon path const normalizedTech = normalizeTechnologyName(technology) - const iconPath = `/assets/chains/${normalizedTech}.svg` + const iconPath = getNetworkIconUrl(normalizedTech) console.log(`Adding icon for ${technology}, normalized to ${normalizedTech}, path: ${iconPath}`) // Create the icon element const icon = document.createElement("img") - icon.src = iconPath + icon.src = iconPath || "" icon.alt = `${technology} icon` icon.style.width = "24px" icon.style.height = "24px" diff --git a/src/features/chainlink-functions/common/ChainlinkFunctions.astro b/src/features/chainlink-functions/common/ChainlinkFunctions.astro index 89dc99c65d7..afd02141344 100644 --- a/src/features/chainlink-functions/common/ChainlinkFunctions.astro +++ b/src/features/chainlink-functions/common/ChainlinkFunctions.astro @@ -5,6 +5,7 @@ import CustomAutomatedFunctionsConsumerComponent from "./CustomAutomatedFunction import GuidesPrerequisitesComponent from "./GuidesPrerequisites.mdx" import GuidesWithAutomationPrerequisitesComponent from "./GuidesWithAutomationPrerequisites.mdx" import DenoImportNotesComponent from "./DenoImportNotes.mdx" +import CreCalloutComponent from "./cre-callout.mdx" export type Props = { section?: @@ -14,8 +15,9 @@ export type Props = { | "prerequisites-guides" | "prerequisites-guides-with-automation" | "deno-importe-notes" + callout?: "cre" } -const { section } = Astro.props as Props +const { section, callout } = Astro.props as Props --- {section === "functions-consumer" && } @@ -29,3 +31,5 @@ const { section } = Astro.props as Props {section === "prerequisites-guides-with-automation" && } {section === "deno-importe-notes" && } + +{callout === "cre" && } diff --git a/src/features/chainlink-functions/common/cre-callout.mdx b/src/features/chainlink-functions/common/cre-callout.mdx new file mode 100644 index 00000000000..3d34ef39ee5 --- /dev/null +++ b/src/features/chainlink-functions/common/cre-callout.mdx @@ -0,0 +1,7 @@ +import { Aside } from "@components" + + diff --git a/src/features/chainlink-functions/components/NetworkIcons.tsx b/src/features/chainlink-functions/components/NetworkIcons.tsx index 3942514c5f4..03184e362ae 100644 --- a/src/features/chainlink-functions/components/NetworkIcons.tsx +++ b/src/features/chainlink-functions/components/NetworkIcons.tsx @@ -1,6 +1,7 @@ /** @jsxImportSource preact */ import { useEffect } from "preact/compat" import { normalizeTechnologyName } from "@features/utils/index.ts" +import { getNetworkIconUrl } from "~/config/data/ccip/data.ts" // List of valid network names that should have icons const VALID_NETWORKS = ["Arbitrum", "Avalanche", "BASE", "Celo", "Ethereum", "OP", "Polygon", "Soneium", "ZKSync"] @@ -30,11 +31,11 @@ export default function NetworkIcons() { // Get the normalized technology name for the icon path const normalizedTech = normalizeTechnologyName(technology) - const iconPath = `/assets/chains/${normalizedTech}.svg` + const iconPath = getNetworkIconUrl(normalizedTech) // Create the icon element const icon = document.createElement("img") - icon.src = iconPath + icon.src = iconPath || "" icon.alt = `${technology} icon` icon.style.width = "24px" icon.style.height = "24px" diff --git a/src/features/data-streams/common/MarketEventsTabs.astro b/src/features/data-streams/common/MarketEventsTabs.astro new file mode 100644 index 00000000000..25fa87baa76 --- /dev/null +++ b/src/features/data-streams/common/MarketEventsTabs.astro @@ -0,0 +1,20 @@ +--- +import { PageTabs } from "@components" + +const marketEventsPages = [ + { + name: "Standard (v8)", + url: "/data-streams/rwa-streams/handling-market-events", + }, + { + name: "Advanced (v11)", + url: "/data-streams/rwa-streams/handling-market-events-v11", + }, +] +--- + + diff --git a/src/features/data-streams/common/ReportSchemaTabs.astro b/src/features/data-streams/common/ReportSchemaTabs.astro index 60d2d5349fe..d3b6101ffe7 100644 --- a/src/features/data-streams/common/ReportSchemaTabs.astro +++ b/src/features/data-streams/common/ReportSchemaTabs.astro @@ -31,7 +31,7 @@ const allReportSchemaPages = [ url: "/data-streams/reference/report-schema-v11", }, { - name: "NAV (v9)", + name: "SmartData (v9)", url: "/data-streams/reference/report-schema-v9", }, { diff --git a/src/features/data/api/backend.ts b/src/features/data/api/backend.ts index fb3dc24aa13..c4ee9a320bf 100644 --- a/src/features/data/api/backend.ts +++ b/src/features/data/api/backend.ts @@ -2,14 +2,17 @@ import EleventyFetch from "@11ty/eleventy-fetch" import { ChainMetadata, mergeWithMVRFeeds } from "./index.ts" import { Chain, POR_MVR_FEEDS_URL } from "../chains.ts" -export const getServerSideChainMetadata = async (chains: Chain[]): Promise> => { +export const getServerSideChainMetadata = async ( + chains: Chain[], + skipCache = false +): Promise> => { const cache = {} for (const chain of chains) { const requests = chain.networks.map((nw) => nw?.rddUrl ? EleventyFetch(nw?.rddUrl, { - duration: "1d", // save for 1 day + duration: skipCache ? "0s" : "1d", // No cache if skipCache is true type: "json", // we'll parse JSON for you }).then((metadata) => ({ ...nw, @@ -26,7 +29,7 @@ export const getServerSideChainMetadata = async (chains: Chain[]): Promise = { label: string @@ -59,10 +62,19 @@ const feedTypeFilterOptions: FilterOption[] = [ { label: "Forex Streams", value: "forex" }, ] +const tradingHoursFilterOptions: FilterOption[] = [ + { label: "All Time Segments", value: "all" }, + { label: "Regular Hours", value: "regular" }, + { label: "Extended Hours", value: "extended" }, + { label: "Overnight Hours", value: "overnight" }, +] + const isSchemaFilterValue = (value: unknown): value is SchemaFilterValue => value === "all" || value === "v8" || value === "v11" const isStreamsRwaFeedTypeValue = (value: unknown): value is StreamsRwaFeedTypeValue => value === "all" || value === "datalink" || value === "equities" || value === "forex" +const isTradingHoursFilterValue = (value: unknown): value is TradingHoursFilterValue => + value === "all" || value === "regular" || value === "extended" || value === "overnight" const FilterDropdown = ({ label, @@ -122,6 +134,8 @@ export const FeedList = ({ initialCache, allowNetworkTableExpansion = false, defaultNetworkTableExpanded = false, + force24x5Only = false, + tokenizedEquityProvider, }: { initialNetwork: string dataFeedType: DataFeedType @@ -129,6 +143,8 @@ export const FeedList = ({ initialCache?: Record allowNetworkTableExpansion?: boolean defaultNetworkTableExpanded?: boolean + force24x5Only?: boolean + tokenizedEquityProvider?: string }) => { const chains = ecosystem === "deprecating" ? ALL_CHAINS : CHAINS const isStreams = @@ -259,10 +275,16 @@ export const FeedList = ({ }, []) // Regular query string states - const [searchValue, setSearchValue] = useQueryString("search", "") - const [testnetSearchValue, setTestnetSearchValue] = useQueryString("testnetSearch", "") - const [selectedFeedCategories, setSelectedFeedCategories] = useQueryString("categories", []) - const [currentPage, setCurrentPage] = useQueryString("page", "1") + const [searchValue, setSearchValue] = useQueryString("search") + const [testnetSearchValue, setTestnetSearchValue] = useQueryString("testnetSearch") + const [selectedFeedCategoriesRaw, setSelectedFeedCategories] = useQueryString("categories") + // Ensure categories is always an array + const selectedFeedCategories = Array.isArray(selectedFeedCategoriesRaw) + ? selectedFeedCategoriesRaw + : selectedFeedCategoriesRaw + ? [selectedFeedCategoriesRaw] + : [] + const [currentPage, setCurrentPage] = useQueryString("page") // Initialize all other states const [showCategoriesDropdown, setShowCategoriesDropdown] = useState(false) @@ -282,12 +304,43 @@ export const FeedList = ({ const setTestnetStreamCategoryFilter = (next: StreamsRwaFeedTypeValue) => { setTestnetStreamCategoryFilterParam(next === "all" ? [] : next) } - const [showExtraDetails, setShowExtraDetails] = useState(false) + + // Checkbox states backed by URL params + const [showDetailsParam, setShowDetailsParam] = useQueryString("showDetails") + const showExtraDetails = showDetailsParam === "true" + const setShowExtraDetails = (value: boolean) => { + setShowDetailsParam(value ? "true" : "") + updateUrlClean({ showDetails: value || undefined }) + } + + const [showSvrParam, setShowSvrParam] = useQueryString("showSvr") + const showOnlySVR = showSvrParam === "true" + const setShowOnlySVR = (value: boolean) => { + setShowSvrParam(value ? "true" : "") + updateUrlClean({ showSvr: value || undefined }) + if (value) paginate(1) + } + + // MVR and DEX filters are not in URL (too specialized) const [showOnlyMVRFeeds, setShowOnlyMVRFeeds] = useState(false) const [showOnlyMVRFeedsTestnet, setShowOnlyMVRFeedsTestnet] = useState(false) - const [showOnlySVR, setShowOnlySVR] = useState(false) const [showOnlyDEXFeeds, setShowOnlyDEXFeeds] = useState(false) const [showOnlyDEXFeedsTestnet, setShowOnlyDEXFeedsTestnet] = useState(false) + const [show24x5FeedsParam, setShow24x5FeedsParam] = useQueryString("show24x5") + const show24x5Feeds = force24x5Only || show24x5FeedsParam === "true" + const setShow24x5Feeds = (value: boolean) => { + if (!force24x5Only) { + setShow24x5FeedsParam(value ? "true" : []) + } + } + const [tradingHoursFilterParam, setTradingHoursFilterParam] = useQueryString("tradingHours") + const tradingHoursFilter = + typeof tradingHoursFilterParam === "string" && isTradingHoursFilterValue(tradingHoursFilterParam) + ? tradingHoursFilterParam + : "all" + const setTradingHoursFilter = (next: TradingHoursFilterValue) => { + setTradingHoursFilterParam(next === "all" ? [] : next) + } const [rwaSchemaFilterParam, setRwaSchemaFilterParam] = useQueryString("schema") const rwaSchemaFilter = typeof rwaSchemaFilterParam === "string" && isSchemaFilterValue(rwaSchemaFilterParam) ? rwaSchemaFilterParam : "all" @@ -302,6 +355,21 @@ export const FeedList = ({ const setTestnetRwaSchemaFilter = (next: SchemaFilterValue) => { setTestnetRwaSchemaFilterParam(next === "all" ? [] : next) } + const [show24x5FeedsTestnetParam, setShow24x5FeedsTestnetParam] = useQueryString("testnetShow24x5") + const show24x5FeedsTestnet = force24x5Only || show24x5FeedsTestnetParam === "true" + const setShow24x5FeedsTestnet = (value: boolean) => { + if (!force24x5Only) { + setShow24x5FeedsTestnetParam(value ? "true" : []) + } + } + const [testnetTradingHoursFilterParam, setTestnetTradingHoursFilterParam] = useQueryString("testnetTradingHours") + const testnetTradingHoursFilter = + typeof testnetTradingHoursFilterParam === "string" && isTradingHoursFilterValue(testnetTradingHoursFilterParam) + ? testnetTradingHoursFilterParam + : "all" + const setTestnetTradingHoursFilter = (next: TradingHoursFilterValue) => { + setTestnetTradingHoursFilterParam(next === "all" ? [] : next) + } const [openDropdownId, setOpenDropdownId] = useState(null) const handleDropdownToggle = (dropdownId: string, isOpen: boolean) => { setOpenDropdownId((current) => { @@ -312,17 +380,26 @@ export const FeedList = ({ }) } const closeAllDropdowns = () => setOpenDropdownId(null) - const paginate = (pageNumber) => setCurrentPage(String(pageNumber)) - // Disable pagination for deprecating feeds by using a very high page size - const addrPerPage = ecosystem === "deprecating" ? 10000 : 8 - const lastAddr = Number(currentPage) * addrPerPage + const paginate = (pageNumber) => { + const pageStr = String(pageNumber) + setCurrentPage(pageStr) + updateUrlClean({ page: pageNumber === 1 ? undefined : pageNumber }) + } + const addrPerPage = ecosystem === "deprecating" && isStreams ? 10 : ecosystem === "deprecating" ? 10000 : 8 + const currentPageNum = Number(currentPage) || 1 + const lastAddr = currentPageNum * addrPerPage const firstAddr = lastAddr - addrPerPage // Pagination for testnet table - const [testnetCurrentPage, setTestnetCurrentPage] = useQueryString("testnetPage", "1") - const testnetPaginate = (pageNumber) => setTestnetCurrentPage(String(pageNumber)) - const testnetAddrPerPage = ecosystem === "deprecating" ? 10000 : 8 - const testnetLastAddr = Number(testnetCurrentPage) * testnetAddrPerPage + const [testnetCurrentPage, setTestnetCurrentPage] = useQueryString("testnetPage") + const testnetPaginate = (pageNumber) => { + const pageStr = String(pageNumber) + setTestnetCurrentPage(pageStr) + updateUrlClean({ testnetPage: pageNumber === 1 ? undefined : pageNumber }) + } + const testnetAddrPerPage = ecosystem === "deprecating" && isStreams ? 10 : ecosystem === "deprecating" ? 10000 : 8 + const testnetPageNum = Number(testnetCurrentPage) || 1 + const testnetLastAddr = testnetPageNum * testnetAddrPerPage const testnetFirstAddr = testnetLastAddr - testnetAddrPerPage // Dynamic feed categories loaded from Supabase @@ -330,6 +407,7 @@ export const FeedList = ({ { key: "low", name: "Low Market Risk" }, { key: "medium", name: "Medium Market Risk" }, { key: "high", name: "High Market Risk" }, + { key: "veryhigh", name: "Very High Market Risk" }, { key: "custom", name: "Custom" }, { key: "new", name: "New Token" }, { key: "deprecating", name: "Deprecating" }, @@ -355,7 +433,20 @@ export const FeedList = ({ const [streamsChain] = useState(initialNetwork) const activeChain = isStreams ? streamsChain : currentNetwork - // Find the selected chain from available chains + // Filter chains by dataFeedType tag to get only chains that support this feed type + const filteredChainsByTag = useMemo(() => { + return chains.filter((chain) => { + if (dataFeedType.includes("streams")) return chain.tags?.includes("streams") ?? false + if (dataFeedType === "smartdata") return chain.tags?.includes("smartData") ?? false + if (dataFeedType === "rates") return chain.tags?.includes("rates") ?? false + if (dataFeedType === "usGovernmentMacroeconomicData") + return chain.tags?.includes("usGovernmentMacroeconomicData") ?? false + if (dataFeedType === "tokenizedEquity") return chain.tags?.includes("tokenizedEquity") ?? false + return chain.tags?.includes("default") ?? false + }) + }, [chains, dataFeedType]) + + // Find the selected chain from available chains (filtered by dataFeedType) const selectedChain = useMemo(() => { // During SSR, try to find the chain from URL param if activeChain is not available if (!activeChain) { @@ -364,21 +455,21 @@ export const FeedList = ({ const urlParams = new URLSearchParams(window.location.search) const networkParam = urlParams.get("network") if (networkParam) { - const foundFromUrl = chains.find((c) => c.page === networkParam) + const foundFromUrl = filteredChainsByTag.find((c) => c.page === networkParam) if (foundFromUrl) { return foundFromUrl } } } - return chains[0] // fallback only if no activeChain + return filteredChainsByTag[0] || chains[0] // fallback to first filtered chain } - const foundChain = chains.find((c) => c.page === activeChain) + const foundChain = filteredChainsByTag.find((c) => c.page === activeChain) if (!foundChain) { - return chains[0] + return filteredChainsByTag[0] || chains[0] } return foundChain - }, [activeChain, chains]) + }, [activeChain, filteredChainsByTag, chains]) const chainMetadata = useGetChainMetadata(selectedChain, initialCache && initialCache[selectedChain.page]) const wrapperRef = useRef(null) @@ -500,56 +591,54 @@ export const FeedList = ({ function handleNetworkSelect(chain: Chain) { closeAllDropdowns() if (!isStreams) { - const params = new URLSearchParams(window.location.search) - params.set("network", chain.page) - // Clear hash when changing networks - const newUrl = window.location.pathname + "?" + params.toString() - window.history.replaceState({ path: newUrl }, "", newUrl) setCurrentNetwork(chain.page) + // Clear all filters and pagination when switching networks + setSearchValue("") + setTestnetSearchValue("") + setSelectedFeedCategories([]) + setCurrentPage("") + setTestnetCurrentPage("") + setShowOnlyMVRFeeds(false) + setShowOnlyMVRFeedsTestnet(false) + // Update URL with just the network (and networkType if not mainnet) + const params = new URLSearchParams(window.location.search) + const networkType = params.get("networkType") + updateUrlClean({ + network: chain.page, + networkType: networkType === "testnet" ? "testnet" : undefined, + search: undefined, + testnetSearch: undefined, + page: undefined, + testnetPage: undefined, + }) } - setSearchValue("") - setSelectedFeedCategories([]) - setCurrentPage("1") - setShowOnlyMVRFeeds(false) - setShowOnlyMVRFeedsTestnet(false) } // Network type change handler for testnet/mainnet switching function handleNetworkTypeChange(networkType: "mainnet" | "testnet") { closeAllDropdowns() - // Update the selected network type setSelectedNetworkType(networkType) - // Update URL parameters to reflect network type state - if (typeof window !== "undefined") { - const params = new URLSearchParams(window.location.search) - - if (networkType === "testnet") { - // Set networkType parameter to testnet - params.set("networkType", "testnet") - // Ensure testnetPage is set (default to 1 if not present) - if (!params.get("testnetPage")) { - params.set("testnetPage", "1") - } - } else { - // Remove testnet-specific parameters when switching to mainnet - params.delete("networkType") - params.delete("testnetSearch") - // Keep testnetPage for potential future navigation - } - - const newUrl = window.location.pathname + "?" + params.toString() - window.history.replaceState({ path: newUrl }, "", newUrl) - } - // Reset filters and pagination when switching network types setSearchValue("") setTestnetSearchValue("") setSelectedFeedCategories([]) - setCurrentPage("1") - setTestnetCurrentPage("1") + setCurrentPage("") + setTestnetCurrentPage("") setShowOnlyMVRFeeds(false) setShowOnlyMVRFeedsTestnet(false) + + // Update URL with clean params + const params = new URLSearchParams(window.location.search) + const network = params.get("network") + updateUrlClean({ + network: network || undefined, + networkType: networkType === "testnet" ? "testnet" : undefined, + search: undefined, + testnetSearch: undefined, + page: undefined, + testnetPage: undefined, + }) } const handleCategorySelection = (category) => { @@ -567,18 +656,14 @@ export const FeedList = ({ } useEffect(() => { + // Clean up empty search params if (searchValue === "") { - const searchParams = new URLSearchParams(window.location.search) - searchParams.delete("search") - const hashFragment = window.location.hash - const newUrl = window.location.pathname + "?" + searchParams.toString() + hashFragment - window.history.replaceState({ path: newUrl }, "", newUrl) - const inputElement = document.getElementById("search") as HTMLInputElement - if (inputElement) { - inputElement.placeholder = "Search" - } + updateUrlClean({ search: undefined }) } - }, [chainMetadata.processedData, searchValue]) + if (testnetSearchValue === "") { + updateUrlClean({ testnetSearch: undefined }) + } + }, [searchValue, testnetSearchValue]) const useOutsideAlerter = (ref: RefObject) => { useEffect(() => { @@ -606,24 +691,35 @@ export const FeedList = ({ const networkTypes = { mainnet: false, testnet: false } // Filter networks by feed type - const filteredNetworks = chainMetadata.processedData.networks.filter((network) => { - if (isDeprecating) { - let foundDeprecated = false - network.metadata?.forEach((feed: any) => { - if (feed.feedCategory === "deprecating") { - foundDeprecated = true - } - }) - return foundDeprecated - } + const filteredNetworks = chainMetadata.processedData.networks + .filter((network) => { + if (isDeprecating) { + let foundDeprecated = false + network.metadata?.forEach((feed: any) => { + if (feed.feedCategory === "deprecating") { + foundDeprecated = true + } + }) + // A deprecating network is relevant only if it still has at least one non-hidden deprecating feed + if (!foundDeprecated) return false + const hasVisible = network.metadata?.some( + (feed: any) => feed.feedCategory === "deprecating" && !feed.docs?.hidden + ) + return !!hasVisible + } - if (isStreams) return network.tags?.includes("streams") - if (isSmartData) return network.tags?.includes("smartData") - if (isRates) return network.tags?.includes("rates") - if (isUSGovernmentMacroeconomicData) return network.tags?.includes("usGovernmentMacroeconomicData") + if (isStreams) return network.tags?.includes("streams") + if (isSmartData) return network.tags?.includes("smartData") + if (isRates) return network.tags?.includes("rates") + if (isUSGovernmentMacroeconomicData) return network.tags?.includes("usGovernmentMacroeconomicData") - return true - }) + return true + }) + .filter((network) => { + // Ensure the network has at least one visible feed for the current dataFeedType + const feeds = network.metadata || [] + return feeds.some((feed: any) => isFeedVisible(feed, dataFeedType, ecosystem, { tokenizedEquityProvider })) + }) // Check available network types filteredNetworks.forEach((network) => { @@ -689,7 +785,7 @@ export const FeedList = ({ dataFeedType === "streamsCrypto" ? "Mainnet Crypto Streams" : dataFeedType === "streamsNav" - ? "Mainnet NAV Streams" + ? "Mainnet SmartData Streams" : dataFeedType === "streamsExRate" ? "Mainnet Exchange Rate Streams" : dataFeedType === "streamsBacked" @@ -699,7 +795,7 @@ export const FeedList = ({ dataFeedType === "streamsCrypto" ? "Testnet Crypto Streams" : dataFeedType === "streamsNav" - ? "Testnet NAV Streams" + ? "Testnet SmartData Streams" : dataFeedType === "streamsExRate" ? "Testnet Exchange Rate Streams" : dataFeedType === "streamsBacked" @@ -732,6 +828,199 @@ export const FeedList = ({ dataFeedType === "streamsExRate" || dataFeedType === "streamsBacked" ) { + // For deprecating streams, show two separate tables: mainnet and testnet + if (isDeprecating) { + const mainnetDeprecatingStreams: any[] = [] + const testnetDeprecatingStreams: any[] = [] + + if (initialCache) { + Object.values(initialCache).forEach((chainData: any) => { + // Only check Arbitrum chains for streams + if (chainData.page === "arbitrum") { + chainData.networks?.forEach((network: any) => { + network.metadata?.forEach((item: any) => { + // Only include items that are actual streams (have verifier contract type and feedId) + // and have a shutdown date + if (item.contractType === "verifier" && item.feedId && item.docs?.shutdownDate) { + const streamWithNetwork = { + ...item, + networkName: network.name, + } + if (network.networkType === "mainnet") { + mainnetDeprecatingStreams.push(streamWithNetwork) + } else if (network.networkType === "testnet") { + testnetDeprecatingStreams.push(streamWithNetwork) + } + } + }) + }) + } + }) + } + + // Sort alphabetically by asset name or product name + const sortStreams = (streams: any[]) => { + return streams.sort((a, b) => { + const nameA = (a.assetName || a.docs?.clicProductName || "").toUpperCase() + const nameB = (b.assetName || b.docs?.clicProductName || "").toUpperCase() + return nameA.localeCompare(nameB) + }) + } + + sortStreams(mainnetDeprecatingStreams) + sortStreams(testnetDeprecatingStreams) + + // Apply search filter for mainnet + const filteredMainnetStreams = mainnetDeprecatingStreams.filter((stream) => { + if (!searchValue || typeof searchValue !== "string") return true + const searchLower = searchValue.toLowerCase() + return ( + stream.feedId?.toLowerCase().includes(searchLower) || + stream.assetName?.toLowerCase().includes(searchLower) || + stream.feedType?.toLowerCase().includes(searchLower) || + stream.networkName?.toLowerCase().includes(searchLower) || + stream.docs?.clicProductName?.toLowerCase().includes(searchLower) + ) + }) + + // Apply search filter for testnet + const filteredTestnetStreams = testnetDeprecatingStreams.filter((stream) => { + if (!testnetSearchValue || typeof testnetSearchValue !== "string") return true + const searchLower = testnetSearchValue.toLowerCase() + return ( + stream.feedId?.toLowerCase().includes(searchLower) || + stream.assetName?.toLowerCase().includes(searchLower) || + stream.feedType?.toLowerCase().includes(searchLower) || + stream.networkName?.toLowerCase().includes(searchLower) || + stream.docs?.clicProductName?.toLowerCase().includes(searchLower) + ) + }) + + // Calculate mainnet pagination + const paginatedMainnetStreams = filteredMainnetStreams.slice(firstAddr, lastAddr) + + // Calculate testnet pagination + const paginatedTestnetStreams = filteredTestnetStreams.slice(testnetFirstAddr, testnetLastAddr) + + return ( + <> + {chainMetadata.loading && !chainMetadata.processedData && !initialCache &&

Loading...

} + {chainMetadata.error &&

There was an error loading the streams...

} + + +
+ { + setSearchValue((event.target as HTMLInputElement).value) + setCurrentPage("1") + }} + /> +
+ {filteredMainnetStreams.length > 0 ? ( + <> +
+ + + + {paginatedMainnetStreams.map((stream, index) => ( + + ))} + +
+
+ {filteredMainnetStreams.length > addrPerPage && ( +
+ +

+ {firstAddr + 1}- + {lastAddr > filteredMainnetStreams.length ? filteredMainnetStreams.length : lastAddr} of{" "} + {filteredMainnetStreams.length} +

+ +
+ )} + + ) : ( +

No mainnet deprecating streams found.

+ )} +
+ + +
+ { + setTestnetSearchValue((event.target as HTMLInputElement).value) + setTestnetCurrentPage("1") + }} + /> +
+ {filteredTestnetStreams.length > 0 ? ( + <> +
+ + + + {paginatedTestnetStreams.map((stream, index) => ( + + ))} + +
+
+ {filteredTestnetStreams.length > testnetAddrPerPage && ( +
+ +

+ {testnetFirstAddr + 1}- + {testnetLastAddr > filteredTestnetStreams.length + ? filteredTestnetStreams.length + : testnetLastAddr}{" "} + of {filteredTestnetStreams.length} +

+ +
+ )} + + ) : ( +

No testnet deprecating streams found.

+ )} +
+ + ) + } + + // Regular streams view (non-deprecating) const mainnetFeeds: ChainNetwork[] = [] const testnetFeeds: ChainNetwork[] = [] @@ -747,20 +1036,24 @@ export const FeedList = ({ return ( <> - {allowNetworkTableExpansion ? ( -
- -
- ) : ( - - - + {!isDeprecating && ( + <> + {allowNetworkTableExpansion ? ( +
+ +
+ ) : ( + + + + )} + )} - handleDropdownToggle("main-schema", isOpen)} - onClose={closeAllDropdowns} - label="Filter schema" - options={schemaFilterOptions} - value={rwaSchemaFilter} - groupId="schema-main" - onSelect={(next) => { - setRwaSchemaFilter(next) - setCurrentPage("1") - }} - /> - handleDropdownToggle("main-feed-type", isOpen)} - onClose={closeAllDropdowns} - label="Filter category" - options={feedTypeFilterOptions} - value={streamCategoryFilter} - groupId="feed-type-main" - onSelect={(next) => { - setStreamCategoryFilter(next) - setCurrentPage("1") - }} - /> - {(searchValue || rwaSchemaFilter !== "all" || streamCategoryFilter !== "all") && ( + {!show24x5Feeds && ( + <> + handleDropdownToggle("main-schema", isOpen)} + onClose={closeAllDropdowns} + label="Filter schema" + options={schemaFilterOptions} + value={rwaSchemaFilter} + groupId="schema-main" + onSelect={(next) => { + setRwaSchemaFilter(next) + setCurrentPage("1") + }} + /> + handleDropdownToggle("main-feed-type", isOpen)} + onClose={closeAllDropdowns} + label="Filter category" + options={feedTypeFilterOptions} + value={streamCategoryFilter} + groupId="feed-type-main" + onSelect={(next) => { + setStreamCategoryFilter(next) + setCurrentPage("1") + }} + /> + + )} + {!force24x5Only && ( +
+ +
+ )} + {show24x5Feeds && ( + handleDropdownToggle("main-trading-hours", isOpen)} + onClose={closeAllDropdowns} + label="Time segment" + options={tradingHoursFilterOptions} + value={tradingHoursFilter} + groupId="trading-hours-main" + onSelect={(next) => { + setTradingHoursFilter(next) + setCurrentPage("1") + }} + /> + )} + {(searchValue || rwaSchemaFilter !== "all" || streamCategoryFilter !== "all" || show24x5Feeds) && ( - - {metadata.proxyAddress ?? metadata.transmissionsAccount} - - + {isTokenizedEquityFeed ? ( + // Tokenized equity feeds show a contact email instead of proxy address + + Contact us:{" "} + + {TOKENIZED_EQUITY_CONTACT_EMAIL} + + + ) : ( +
+ + + {metadata.proxyAddress ?? metadata.transmissionsAccount} + +
+ )} {metadata.assetName && ( @@ -336,31 +380,43 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d {isAaveSVR(metadata) ? "AAVE SVR Proxy:" : "SVR Proxy:"}
- - - {metadata.secondaryProxyAddress} - + {isTokenizedEquityFeed ? ( + // Tokenized equity feeds show a contact email instead of SVR proxy address + + Contact us:{" "} + + {TOKENIZED_EQUITY_CONTACT_EMAIL} + + + ) : ( + <> + + + {metadata.secondaryProxyAddress} + + + )}
- {isAaveSVR(metadata) && ( + {isAaveSVR(metadata) && !isTokenizedEquityFeed && (
⚠️ Aave Dedicated Feed: This SVR proxy feed is dedicated exclusively for use by the Aave protocol. Learn more about{" "} @@ -370,7 +426,7 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d .
)} - {isSharedSVR(metadata) && ( + {isSharedSVR(metadata) && !isTokenizedEquityFeed && (
🔗 SVR Feed: This SVR proxy feed is usable by any protocol. Learn more about{" "} @@ -408,19 +464,9 @@ const SmartDataTr = ({ network, metadata, showExtraDetails, batchedCategoryData // Only show MVR badge if explicitly flagged as MVR const finalIsMVRFeed = isMVRFlagSet && hasDecoding - // Resolve final category from batch (fallback to metadata) - const contractAddress = metadata.contractAddress || metadata.proxyAddress - const networkIdentifier = getNetworkIdentifier(network) - let finalTier = - contractAddress && batchedCategoryData?.size - ? (getFeedCategoryFromBatch(batchedCategoryData, contractAddress, networkIdentifier, metadata.feedCategory) - ?.final ?? metadata.feedCategory) - : metadata.feedCategory - - // Override with deprecating category if feed has shutdown date - if (metadata.docs?.shutdownDate) { - finalTier = "deprecating" - } + // Use the pre-computed finalCategory from enriched metadata + // (already includes deprecating status and Supabase risk tier) + const finalTier = metadata.finalCategory || metadata.feedCategory return (
{network.mainnet?.label} + {network.mainnet?.label} + {network.mainnet?.note && ( +
+ )} +
{network.isSolana ? ( <> @@ -767,7 +821,15 @@ export const StreamsNetworkAddressesTable = ({ )} {network.testnet?.label} + {network.testnet?.label} + {network.testnet?.note && ( +
+ )} +
{network.isSolana ? ( <> @@ -841,7 +903,7 @@ export const StreamsNetworkAddressesTable = ({ ) } -const StreamsTHead = () => ( +export const StreamsTHead = () => (
Stream
-
- {metadata.pair[0]}/{metadata.pair[1]} - {metadata.feedType === "Crypto-DEX" && ( - - DEX State Price - - )} -
- {metadata.docs.shutdownDate && ( -
-
- Deprecating: -
- {metadata.docs.shutdownDate} -
- )} -
-
- {metadata.feedId} - -
-
-
- {isMainnet && metadata.docs.clicProductName && metadata.feedType !== "Tokenized Equities" && ( -
-
- Full name: -
-
{metadata.docs.clicProductName}
-
- )} - {metadata.assetName && ( -
-
- Asset name: -
-
{metadata.assetName}
-
- )} - {metadata.docs.assetClass ? ( -
-
- Asset class: -
-
- {metadata.docs.assetClass} - {metadata.docs.assetSubClass && - metadata.docs.assetSubClass !== "Crypto" && - metadata.docs.assetSubClass !== "Equities" - ? " - " + metadata.docs.assetSubClass - : ""} -
-
- ) : null} - {metadata.docs.marketHours ? ( -
-
- Market hours: -
-
- - {metadata.docs.marketHours} - -
-
- ) : null} - {streamsCategoryMap[metadata.feedCategory] ? ( - - ) : null} - {metadata.decimals ? ( -
-
- Decimals: -
-
{metadata.decimals}
-
- ) : null} +export const StreamsTr = ({ metadata, isMainnet }) => { + // Determine if stream is deprecating + const isDeprecating = !!metadata.docs?.shutdownDate + + // Temporary calculated stream detection until proper metadata tagging is implemented + // TODO: Replace with metadata.docs.isCalculated or similar once available + const isCalculatedStream = + metadata.docs?.productTypeCode === "ExRate" && + metadata.docs?.attributeType === "ExchangeRate" && + metadata.docs?.assetClass === "Tokenized Debt" + + return ( +
+
+ {metadata.pair[0]}/{metadata.pair[1]} {metadata.feedType === "Crypto-DEX" && ( -
-
- Report Schema: -
-
- - Report Schema v3 (Crypto DEX) - -
-
- )} - {metadata.feedType === "Crypto" && metadata.docs?.productTypeCode !== "ExRate" && ( -
-
- Report Schema: -
-
- - Report Schema v3 (Crypto) - -
-
- )} - {(metadata.feedType === "Equities" || metadata.feedType === "Forex") && metadata.docs?.schema !== "v11" && ( -
-
- Report Schema: -
-
- - Report Schema v8 (RWA) - -
-
- )} - {metadata.docs?.productTypeCode === "ExRate" && ( -
-
- Report Schema: -
-
- - Report Schema v7 (Redemption Rates) - -
-
- )} - {metadata.feedType === "Net Asset Value" && ( -
-
- Report Schema: -
-
- - Report Schema v9 (NAV) - -
-
- )} - {metadata.feedType === "Tokenized Equities" && ( -
-
- Report Schema: -
-
- - Report Schema v10 (Tokenized Assets) - -
-
+ + DEX State Price + )} - {metadata.docs?.schema === "v11" && ( -
-
- Report Schema: -
-
- - RWA Advanced (v11) - -
-
+ {isCalculatedStream && ( + + Calculated + )} - -
-
+
+ {metadata.feedId} + +
+
+
+ {isMainnet && metadata.docs.clicProductName && metadata.feedType !== "Tokenized Equities" && ( +
+
+ Full name: +
+
{metadata.docs.clicProductName}
+
+ )} + {metadata.assetName && ( +
+
+ Asset name: +
+
{metadata.assetName}
+
+ )} + {metadata.docs.assetClass ? ( +
+
+ Asset class: +
+
+ {metadata.docs.assetClass} + {metadata.docs.assetSubClass && + metadata.docs.assetSubClass !== "Crypto" && + metadata.docs.assetSubClass !== "Equities" + ? " - " + metadata.docs.assetSubClass + : ""} +
+
+ ) : null} + {(() => { + const assetSubClass = (metadata.docs as any)?.assetSubClass + const clicProductName = (metadata.docs as any)?.clicProductName || "" + + // Determine the trading hours type from either assetSubClass or clicProductName + let hoursType = "" + let timeRange = "" + + if ( + assetSubClass === "Regular Hours" || + (clicProductName.includes("RegularHours") && + !clicProductName.includes("ExtendedHours") && + !clicProductName.includes("OvernightHours")) + ) { + hoursType = "Regular Hours" + timeRange = "9:30am–4:00pm Mon–Fri" + } else if (assetSubClass === "Extended Hours" || clicProductName.includes("ExtendedHours")) { + hoursType = "Extended Hours" + timeRange = "4:00am–9:30am & 4:00pm–8:00pm Mon–Fri" + } else if (assetSubClass === "Overnight Hours" || clicProductName.includes("OvernightHours")) { + hoursType = "Overnight Hours" + timeRange = "8:00pm–4:00am Sun evening–Fri morning" + } + + if (hoursType) { + return ( +
+
+ Trading hours: +
+
+ + {hoursType} + {" "} + — {timeRange} ET +
+
+ ) + } + return null + })()} + {metadata.docs.marketHours ? ( +
+
+ Market hours: +
+
+ + {metadata.docs.marketHours} + +
+
+ ) : null} + {streamsCategoryMap[metadata.feedCategory] ? ( + + ) : null} + {metadata.decimals ? ( +
+
+ Decimals: +
+
{metadata.decimals}
+
+ ) : null} + {metadata.feedType === "Crypto-DEX" && ( +
+
+ Report Schema: +
+
+ + Report Schema v3 (Crypto DEX) + +
+
+ )} + {metadata.feedType === "Crypto" && metadata.docs?.productTypeCode !== "ExRate" && ( +
+
+ Report Schema: +
+
+ + Report Schema v3 (Crypto) + +
+
+ )} + {(() => { + const schemaVersion = getSchemaVersion(metadata) + const feedType = metadata.feedType || metadata.docs?.feedType + + // RWA streams (Equities, Forex, Datalink) - v8 or v11 + if (feedType === "Equities" || feedType === "Forex" || feedType === "Datalink") { + if (schemaVersion === "v11") { + return ( +
+
+ Report Schema: +
+
+ + Report Schema v11 (RWA Advanced) + +
+
+ ) + } else if (schemaVersion === "v8") { + return ( +
+
+ Report Schema: +
+
+ + Report Schema v8 (RWA Standard) + +
+
+ ) + } + } + + // Exchange Rate streams + if (metadata.docs?.productTypeCode === "ExRate") { + return ( +
+
+ Report Schema: +
+
+ + Report Schema v7 (Redemption Rates) + +
+
+ ) + } + + // NAV streams + if (feedType === "Net Asset Value") { + return ( +
+
+ Report Schema: +
+
+ + Report Schema v9 (NAV) + +
+
+ ) + } + + // Tokenized Equities streams + if (feedType === "Tokenized Equities") { + return ( +
+
+ Report Schema: +
+
+ + Report Schema v10 (Tokenized Assets) + +
+
+ ) + } + + return null + })()} +
+
+