diff --git a/.env.example b/.env.example index c91f7e7ae73..6dc6cf23d5e 100644 --- a/.env.example +++ b/.env.example @@ -3,3 +3,5 @@ ALGOLIA_WRITE_API_KEY= ALGOLIA_INDEX_NAME=docs-test PUBLIC_ALGOLIA_SEARCH_APP_ID= PUBLIC_ALGOLIA_SEARCH_PUBLIC_API_KEY= +CCIP_GRAPHQL_ENDPOINT= +CCIP_GRAPHQL_API_KEY= diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c661cdf34c5..07909e2567a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -103,6 +103,16 @@ updates: - "@types/*" - "@rollup/plugin-yaml" + # GraphQL + graphql: + patterns: + - "graphql" + - "graphql-request" + - "@graphql-codegen*" + - "@graphql-typed-document-node*" + - "lru-cache" + - "p-limit" + # Documentation & API documentation: patterns: diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index b6d478963a2..37910bc5d9d 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-04-05T21:08:13Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -14,17 +14,25 @@ "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", "arbitrum-ada-usd-premium-prod", "arbitrum-adbe-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-adi-usd-streams-cexprice-mainnet-production", "arbitrum-aero-usd-refprice-mainnet-production", "arbitrum-aevo-usd-premium-prod-v03", "arbitrum-ageth-eth-exchange-rate", @@ -32,15 +40,24 @@ "arbitrum-ai-usd-premium-prod-v03", "arbitrum-ai16z-usd-premium-prod-v03", "arbitrum-ai16z-usd-streams-dexprice-mainnet-production", + "arbitrum-aiq-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-aiq-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-aiq-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-aixbt-usd-refprice-mainnet-production", "arbitrum-algo-usd-refprice-ds-premium-global-003-prod", "arbitrum-alp-sol-streams-exchangerate-mainnet-production", "arbitrum-alp-usd-streams-exchangerate-mainnet-production", "arbitrum-alpaca-usd-refprice-mainnet-production", "arbitrum-alt-usd-refprice-ds-premium-global-003-prod", + "arbitrum-amd-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-amd-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-amd-usd-streams-regularhoursequityprice-mainnet-production", "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 +75,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 +88,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", @@ -78,6 +98,9 @@ "arbitrum-axp-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-axs-usd", "arbitrum-axs-usd-premium-prod", + "arbitrum-baba-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-baba-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-baba-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-bac-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-bal-usd", "arbitrum-bal-usd-refprice-mainnet-production", @@ -94,24 +117,37 @@ "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", "arbitrum-bonk-usd-premium-prod", + "arbitrum-botz-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-botz-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-botz-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-brett-usd-premium-prod-v03", "arbitrum-brkb-usd-streams-equityprice-timestamped-mainnet-production", "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-bynd-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-bynd-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-bynd-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-c98-usd-premium-prod-v03", "arbitrum-cad-usd", "arbitrum-cake-usd", @@ -121,6 +157,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 +167,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 +179,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", @@ -146,18 +190,30 @@ "arbitrum-crv-usd", "arbitrum-crv-usd-premium-prod", "arbitrum-crvusd-usd", + "arbitrum-crwv-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-crwv-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-crwv-usd-streams-regularhoursequityprice-mainnet-production", "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-dejaaa-usd-streams-smartdata-navlink-mainnet-production", + "arbitrum-dejtrsy-usd-streams-smartdata-navlink-mainnet-production", "arbitrum-deusd-usd", + "arbitrum-dia-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-dia-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-dia-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-dodo-usd", "arbitrum-dodo-usd-refprice-mainnet-production", "arbitrum-doge-usd", @@ -172,6 +228,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,14 +242,22 @@ "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-ewj-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-ewj-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-ewj-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-ezeth-eth", "arbitrum-ezeth-eth-exchange-rate", "arbitrum-ezeth-eth-exrate-mainnet-production", @@ -200,6 +265,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,9 +278,12 @@ "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", + "arbitrum-frxusd-usd-streams-dexprice-mainnet-production", "arbitrum-fxs-usd", "arbitrum-fxs-usd-premium-prod-v03", "arbitrum-gala-usd-premium-prod-v03", @@ -225,6 +294,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 +310,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 +328,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", @@ -265,12 +341,18 @@ "arbitrum-huma-usd-refprice-mainnet-production", "arbitrum-hype-usd", "arbitrum-hype-usd-refprice-mainnet-production", + "arbitrum-iau-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-iau-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-iau-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-ibit-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-ibm-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-ibtc-por", "arbitrum-icp-usd-premium-prod", "arbitrum-id-usd-premium-prod-v03", "arbitrum-idr-usdt-datalink-cexprice-mainnet-production", + "arbitrum-iemg-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-iemg-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-iemg-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-ilv-usd-premium-prod", "arbitrum-imx-usd-refprice-ds-premium-global-003-prod", "arbitrum-ineth-eth-exchange-rate", @@ -279,6 +361,9 @@ "arbitrum-inj-usd-premium-prod", "arbitrum-insteth-eth-exchange-rate", "arbitrum-intc-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-intc-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-intc-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-intc-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-intu-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-io-usd-premium-prod-v03", "arbitrum-iota-usd-refprice-mainnet-production", @@ -287,6 +372,9 @@ "arbitrum-ip-usd-refprice-mainnet-production", "arbitrum-iq-usd-premium-prod-v03", "arbitrum-ivv-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-iwm-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-iwm-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-iwm-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-jasmy-usd-refprice-mainnet-production", "arbitrum-jitosol-usd-refprice-mainnet-production", "arbitrum-jlp-usd-refprice-mainnet-production", @@ -302,9 +390,11 @@ "arbitrum-kaia-usd-refprice-mainnet-production", "arbitrum-kaito-usd-refprice-mainnet-production", "arbitrum-kas-usd-refprice-mainnet-production", + "arbitrum-kat-usd-streams-cexprice-mainnet-production", "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", @@ -312,6 +402,9 @@ "arbitrum-ksm-usd-refprice-mainnet-production", "arbitrum-kta-usd-streams-dexprice-mainnet-production", "arbitrum-kudai-usd-refprice-mainnet-production", + "arbitrum-kweb-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-kweb-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-kweb-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-lbtc-btc", "arbitrum-lbtc-btc-streams-exrate-mainnet-production", "arbitrum-lbtc-usd-refprice-mainnet-production", @@ -322,7 +415,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,11 +429,16 @@ "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", "arbitrum-magic-usd", "arbitrum-magic-usd-refprice-mainnet-production", + "arbitrum-mags-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-mags-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-mags-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-mana-usd-premium-prod", "arbitrum-manta-usd-premium-prod-v03", "arbitrum-mask-usd-refprice-mainnet-production", @@ -350,8 +451,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,20 +470,38 @@ "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-mu-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-mu-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-mu-usd-streams-regularhoursequityprice-mainnet-production", + "arbitrum-musd-usd-streams-dexprice-mainnet-production", "arbitrum-mvi-usd", "arbitrum-myx-usd-streams-cexprice-mainnet-production", + "arbitrum-nbis-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-nbis-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-nbis-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-near-usd", "arbitrum-near-usd-premium-prod", "arbitrum-neiroeth-usd-refprice-mainnet-production", @@ -388,10 +511,17 @@ "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-nx8-nav-smartdata-netassetvalue-mainnet-production", "arbitrum-nzd-usd-refprice-timestamped-mainnet-production", "arbitrum-okb-usd-streams-cexprice-mainnet-production", + "arbitrum-oklo-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-oklo-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-oklo-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-om-usd-refprice-mainnet-production", "arbitrum-omg-usd-refprice-mainnet-production", "arbitrum-omni-usd-premium-prod-v03", @@ -400,6 +530,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 +553,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 +571,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,11 +590,19 @@ "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", + "arbitrum-rgti-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-rgti-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-rgti-usd-streams-regularhoursequityprice-mainnet-production", + "arbitrum-rklb-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-rklb-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-rklb-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-rlp-usd-exchange-rate", "arbitrum-rlp-usd-streams-exchangerate-mainnet-production", + "arbitrum-rlusd-usd", "arbitrum-ron-usd", "arbitrum-rose-usd-refprice-mainnet-production", "arbitrum-rpl-usd", @@ -471,12 +620,17 @@ "arbitrum-sand-usd-premium-prod", "arbitrum-saros-usd-refprice-mainnet-production", "arbitrum-sats-usd-premium-prod", + "arbitrum-savusd-avusd-exchange-rate", "arbitrum-sbet-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-schh-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-schh-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-schh-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-scr-usd-premium-prod-v03", "arbitrum-sdeusd-deusd-exrate-mainnet-production", "arbitrum-sei-usd", "arbitrum-sei-usd-premium-prod", "arbitrum-sek-usd", + "arbitrum-sent-usd-streams-cexprice-mainnet-production", "arbitrum-sfrax-frax exchange rate", "arbitrum-sfrxETH-frxETH", "arbitrum-sgd-usd", @@ -484,17 +638,29 @@ "arbitrum-shib-usd", "arbitrum-shib-usd-premium-prod", "arbitrum-skl-usd-refprice-mainnet-production", + "arbitrum-skr-usd-streams-cexprice-mainnet-production", "arbitrum-sky-usd-refprice-mainnet-production", + "arbitrum-slv-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-slv-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-slv-usd-streams-regularhoursequityprice-mainnet-production", + "arbitrum-sndk-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-sndk-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-sndk-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-snx-usd", "arbitrum-snx-usd-premium-prod", "arbitrum-sol-usd", "arbitrum-sol-usd-premium-prod", "arbitrum-solvbtc-btc", + "arbitrum-solvbtc-btc-exchange-rate", + "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", @@ -506,6 +672,8 @@ "arbitrum-stg-usd", "arbitrum-stg-usd-premium-prod-v03", "arbitrum-storj-usd-refprice-mainnet-production", + "arbitrum-strc-usd-streams-equityprice-mainnet-production", + "arbitrum-strcx-usd-datalink-totalreturnmultiplier-mainnet-production", "arbitrum-strk-usd-refprice-ds-premium-global-003-prod", "arbitrum-stx-usd", "arbitrum-stx-usd-premium-prod", @@ -522,6 +690,7 @@ "arbitrum-susdu-usdu-streams-exchangerate-mainnet-production", "arbitrum-sushi-usd", "arbitrum-sushi-usd-refprice-mainnet-production", + "arbitrum-sweth-eth", "arbitrum-sweth-eth exchange rate", "arbitrum-syn-usd-refprice-mainnet-production", "arbitrum-syrup-usd-refprice-mainnet-production", @@ -538,6 +707,10 @@ "arbitrum-theta-usd-refprice-mainnet-production", "arbitrum-tia-usd", "arbitrum-tia-usd-premium-prod", + "arbitrum-tkalshi-nav-smartdata-aum-netassetvalue-mainnet-production", + "arbitrum-tlt-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-tlt-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-tlt-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-tmus-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-tnsr-usd-refprice-mainnet-production", "arbitrum-token-usd-premium-prod-v03", @@ -545,16 +718,26 @@ "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-tsm-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-tsm-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-tsm-usd-streams-regularhoursequityprice-mainnet-production", + "arbitrum-tspacex-nav-smartdata-aum-netassetvalue-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 +746,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 +756,9 @@ "arbitrum-unibtc-btc-streams-exchangerate-mainnet-production", "arbitrum-unieth-eth-exchange-rate", "arbitrum-unp-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-usat-usd-streams-cexprice-mainnet-production", + "arbitrum-uscc-nav-smartdata-netassetvalue-mainnet-production", + "arbitrum-usd-ars-streams-forexprice-timestamped-mainnet-production", "arbitrum-usd-cad-refprice-timestamped-mainnet-production", "arbitrum-usd-cad-rwa-prod-v04", "arbitrum-usd-chf-refprice-timestamped-mainnet-production", @@ -585,22 +774,36 @@ "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-usdg-usd-streams-cexprice-mainnet-production", + "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-usdu-nav-smartdata-netassetvalue-mainnet-production", + "arbitrum-uso-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-uso-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-uso-usd-streams-regularhoursequityprice-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-usx-usd-streams-redemptionrate-mainnet-production", "arbitrum-v-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-vea-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-vet-usd-premium-prod", @@ -611,6 +814,9 @@ "arbitrum-vtv-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-vvv-usd-refprice-mainnet-production", "arbitrum-vxx-usd-streams-equityprice-timestamped-mainnet-production", + "arbitrum-vxx-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-vxx-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-vxx-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-vyusd-usd-exchange-rate", "arbitrum-vz-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-wal-usd-refprice-mainnet-production", @@ -625,6 +831,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 +845,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", @@ -654,6 +862,9 @@ "arbitrum-xaut-usd-refprice-mainnet-production", "arbitrum-xdc-usd-refprice-mainnet-production", "arbitrum-xlm-usd-premium-prod", + "arbitrum-xlre-usd-streams-extendedhoursequityprice-mainnet-production", + "arbitrum-xlre-usd-streams-overnighthoursequityprice-mainnet-production", + "arbitrum-xlre-usd-streams-regularhoursequityprice-mainnet-production", "arbitrum-xmr-usd-refprice-mainnet-production", "arbitrum-xom-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-xpl-usd", @@ -674,9 +885,11 @@ "arbitrum-yneth-eth-exchange-rate", "arbitrum-ynethx-eth-exchange-rate", "arbitrum-yusd-usd-exchange-rate", + "arbitrum-zama-usd-streams-cexprice-mainnet-production", "arbitrum-zar-usd", "arbitrum-zbtc-por", "arbitrum-zbtc-usd-refprice-mainnet-production", + "arbitrum-zec-usd", "arbitrum-zec-usd-refprice-ds-premium-global-003-prod", "arbitrum-zerebro-usd-premium-prod-v03", "arbitrum-zeta-usd-refprice-mainnet-production", @@ -720,6 +933,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 +964,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 +990,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 +1004,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 +1013,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", @@ -813,13 +1031,17 @@ "base-degen-usd", "base-doge-usd", "base-dola-usd", + "base-edge-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", @@ -860,8 +1082,10 @@ "base-real-gdp-percentage", "base-reth-eth", "base-reth-eth-exchange-rate", + "base-rlusd-usd", "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 +1115,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,7 +1142,9 @@ "base-wrseth-eth-exchange-rate", "base-wsteth-eth", "base-wsteth-steth exchangerate", + "base-wsteth-steth-exchange-rate-svr", "base-wstusr-stusr-exchange-rate", + "base-xag-usd", "base-xau-usd", "base-xrp-usd", "base-xsolvbtc-nav", @@ -929,8 +1160,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 +1175,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 +1202,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 +1213,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 +1241,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", @@ -1025,11 +1272,13 @@ "bnb-chain-real-final-sales-to-private-domestic-purchasers-percentage", "bnb-chain-real-gdp-level", "bnb-chain-real-gdp-percentage", + "bnb-chain-rlp-usd-exchange-rate", "bnb-chain-savbtc-avbtc-exchange-rate", "bnb-chain-savusd-avusd-exchange-rate", "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 +1289,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,19 +1331,24 @@ "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", "bnb-chain-xag-usd", "bnb-chain-xau-usd", + "bnb-chain-xaum-reference-rate", "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 +1357,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 +1420,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", @@ -1166,8 +1436,10 @@ "ethereum-ape-eth", "ethereum-ape-usd", "ethereum-arb-usd", + "ethereum-ars-usd", "ethereum-ath-usd", "ethereum-aud-usd", + "ethereum-ausd-usd", "ethereum-avail-usd", "ethereum-avax-usd", "ethereum-badger-eth", @@ -1176,13 +1448,17 @@ "ethereum-bat-eth", "ethereum-bgbtc-por", "ethereum-bnb-usd", + "ethereum-brl-usd", "ethereum-btc-eth", "ethereum-btc-usd", "ethereum-btc-usd-shared-svr", "ethereum-btc-usd-svr", + "ethereum-btcy-nav", + "ethereum-c1usd-por", "ethereum-c3m-eur", "ethereum-cad-usd", "ethereum-calc-xsushi-eth", + "ethereum-calculated-ethplus-usd", "ethereum-cashplus-nav", "ethereum-cbbtc-por", "ethereum-cbbtc-usd", @@ -1192,11 +1468,14 @@ "ethereum-comp-eth", "ethereum-comp-usd", "ethereum-comp-usd-shared-svr", + "ethereum-crclon-usd-shared-svr", "ethereum-crdt-nav", + "ethereum-crdyx-nav", "ethereum-crv-eth", "ethereum-crv-usd", "ethereum-crvusd-usd", "ethereum-cspx-usd", + "ethereum-cusdo-usd", "ethereum-cvx-eth", "ethereum-cvx-usd", "ethereum-dai-eth", @@ -1219,6 +1498,7 @@ "ethereum-eurc-usd", "ethereum-eutbl-nav", "ethereum-ezeth-eth", + "ethereum-ezeth-por", "ethereum-fbtc-btc-exchange-rate", "ethereum-fbtc-por", "ethereum-fdusd-usd", @@ -1230,6 +1510,7 @@ "ethereum-fxs-usd", "ethereum-gbp-usd", "ethereum-gho-usd", + "ethereum-googl-usd-kalman-24-5", "ethereum-grt-eth", "ethereum-grt-usd", "ethereum-hbtc-por", @@ -1237,7 +1518,11 @@ "ethereum-ib01-usd", "ethereum-ibta-usd", "ethereum-imx-usd", + "ethereum-jaaa-nav-v2", "ethereum-jpy-usd", + "ethereum-jtrsy-nav-v2", + "ethereum-kag-por", + "ethereum-kau-por", "ethereum-knc-eth", "ethereum-knc-usd", "ethereum-krw-usd", @@ -1247,6 +1532,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", @@ -1266,6 +1552,7 @@ "ethereum-musd-usd", "ethereum-neiro-usd", "ethereum-nexus-weth-por", + "ethereum-nvda-usd-kalman-24-5", "ethereum-nzd-usd", "ethereum-oeth-eth", "ethereum-ousdt-usd", @@ -1274,10 +1561,14 @@ "ethereum-pce-price-index-percentage", "ethereum-perp-eth", "ethereum-php-usd", + "ethereum-pmusd-usd-exchange-rate", "ethereum-pufeth-eth", "ethereum-pumpbtc-btc-exchange-rate", "ethereum-pumpbtc-por", "ethereum-pyusd-usd", + "ethereum-qqq-usd-kalman-24-5", + "ethereum-qqqon-usd-calculated-kalman-shared-svr", + "ethereum-qqqon-usd-shared-svr", "ethereum-rdnt-usd", "ethereum-real-final-sales-to-private-domestic-purchasers-level", "ethereum-real-final-sales-to-private-domestic-purchasers-percentage", @@ -1292,6 +1583,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", @@ -1304,6 +1597,9 @@ "ethereum-solvbtc-por", "ethereum-solvbtc.bbn-solvbtc-exchange-rate", "ethereum-spell-usd", + "ethereum-spy-usd-kalman-24-5", + "ethereum-spyon-usd-calculated-kalman-shared-svr", + "ethereum-spyon-usd-shared-svr", "ethereum-stbt-por", "ethereum-stbtc-btc-exchange-rate", "ethereum-stbtc-por", @@ -1311,6 +1607,8 @@ "ethereum-steth-por", "ethereum-steth-usd", "ethereum-stg-usd", + "ethereum-stgld-tgld-exchange-rate", + "ethereum-strc-usd", "ethereum-susd1+-usd1-exchange-rate", "ethereum-susdd-usdd-exchange-rate", "ethereum-susde-usd", @@ -1320,13 +1618,18 @@ "ethereum-swell-eth", "ethereum-swell-eth-por", "ethereum-swell-restaked-eth-por", + "ethereum-sweth-eth", "ethereum-sxt-usd", "ethereum-tao-usd", "ethereum-tbtc-usd", "ethereum-teth-wsteth-exchange-rate", "ethereum-tfbill-nav", + "ethereum-treasuryplus-nav", "ethereum-trump-usd", "ethereum-try-usd", + "ethereum-tsla-usd-kalman-24-5", + "ethereum-tslaon-usd-calculated-kalman-shared-svr", + "ethereum-tslaon-usd-shared-svr", "ethereum-tusd-eth", "ethereum-tusd-por", "ethereum-tusd-usd", @@ -1354,6 +1657,8 @@ "ethereum-usdt-usd", "ethereum-usdt-usd-shared-svr", "ethereum-usdt-usd-svr", + "ethereum-usdtb-usd", + "ethereum-uspc-nav", "ethereum-usr-usd", "ethereum-ustb-aum", "ethereum-ustb-nav", @@ -1364,6 +1669,7 @@ "ethereum-wbtc-por", "ethereum-weeth-eth", "ethereum-wlfi-usd", + "ethereum-wtgxx-nav-24h", "ethereum-xag-usd", "ethereum-xau-usd", "ethereum-xcn-usd", @@ -1372,6 +1678,7 @@ "ethereum-yfi-eth", "ethereum-yfi-usd", "ethereum-zbu-usd", + "ethereum-zec-usd", "ethereum-zrx-eth", "ethereum-zrx-usd", "fantom-aave-usd", @@ -1460,29 +1767,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 +1825,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 +1839,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 +1871,42 @@ "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-glv-usd", + "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-steth-eth", + "megaeth-susde-usd", + "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 +1915,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 +1950,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 +1981,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", @@ -1689,6 +2051,7 @@ "optimism-teth-wsteth-exchange-rate", "optimism-tia-usd", "optimism-trx-usd", + "optimism-uma-usd", "optimism-uni-usd", "optimism-unibtc-btc-exchange-rate", "optimism-usd1-usd", @@ -1701,10 +2064,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", @@ -1745,6 +2110,7 @@ "plasma-plusd-usdt-exchange-rate", "plasma-rlp-usd", "plasma-savusd-avusd-exchange-rate", + "plasma-snusd-nusd-exchange-rate", "plasma-splusd-plusd-exchange-rate", "plasma-susdai-usd", "plasma-susdai-usdai", @@ -1776,6 +2142,7 @@ "polygon-aave-eth", "polygon-aave-usd", "polygon-ada-usd", + "polygon-ageur-usd", "polygon-alcx-usd", "polygon-algo-usd", "polygon-amzn-usd", @@ -1841,6 +2208,7 @@ "polygon-grt-usd", "polygon-hbar-usd", "polygon-icp-usd", + "polygon-idr-usd", "polygon-ils-usd", "polygon-ilv-eth", "polygon-inr-usd", @@ -1868,6 +2236,7 @@ "polygon-pln-usd", "polygon-qnt-usd", "polygon-quick-usd", + "polygon-rcusd+-nav", "polygon-rdnt-usd", "polygon-ryt-nav", "polygon-ryt-polygon", @@ -1918,13 +2287,16 @@ "polygon-yeth-eth-exchange-rate", "polygon-yfi-eth", "polygon-yfi-usd", + "polygon-zar-usd", "polygon-zec-usd", "polygonkatana-ausd-usd", + "polygonkatana-avkat-kat-exchange-rate", "polygonkatana-btc-usd", "polygonkatana-dola-usd", "polygonkatana-eth-usd", "polygonkatana-jitosol-sol", "polygonkatana-jitosol-usd", + "polygonkatana-kat-usd", "polygonkatana-lbtc-btc", "polygonkatana-lbtc-usd", "polygonkatana-link-usd", @@ -1932,7 +2304,9 @@ "polygonkatana-pol-usd", "polygonkatana-sfrxusd-frxusd-exchange-rate", "polygonkatana-sfrxusd-usd", + "polygonkatana-siusd-usd-exchange-rate", "polygonkatana-sol-usd", + "polygonkatana-susda-usda-exchange-rate", "polygonkatana-sushi-usd", "polygonkatana-usdc-usd", "polygonkatana-usds-usd", @@ -1979,6 +2353,7 @@ "scroll-dai-usd", "scroll-doge-usd", "scroll-eth-usd", + "scroll-eurc-usd", "scroll-ezeth-eth", "scroll-link-eth", "scroll-link-usd", @@ -2013,6 +2388,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 +2397,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", @@ -2078,6 +2457,7 @@ "sonic-usd1-usd", "sonic-usdc-usd", "sonic-usdt-usd", + "sonic-ussd-usd", "sonic-vyusd-usd-exchange-rate", "sonic-wans-ans-exchange-rate", "sonic-wbtc-usd", @@ -2090,6 +2470,7 @@ "sonic-ybtc-btc", "sonic-yeth-eth", "sonic-yusd-usd-exchange-rate", + "sonic-zar-usd", "starknet-btc-usd", "starknet-dai-usd", "starknet-eth-usd", @@ -2102,18 +2483,33 @@ "tron-btc-usd", "tron-btt-usd", "tron-eth-usd", + "tron-htx-usd", "tron-jst-usd", "tron-ltc-usd", "tron-nft-usd", "tron-strx-trx-exchcange-rate", "tron-sun-usd", + "tron-susdd-usdd-exchange-rate-vpn", "tron-trx-usd", "tron-tusd-usd", "tron-usd1-usd", "tron-usdc-usd", "tron-usdd-usd", + "tron-usdd-usdc-exchange-rate", + "tron-usdd-usdt-exchange-rate", "tron-usdt-usd", + "tron-wbtc-usd", "tron-win-usd", + "unichain-btc-usd-svr", + "unichain-eth-usd-svr", + "unichain-ezeth-eth-exchange-rate", + "unichain-link-usd", + "unichain-rseth-eth-exchange-rate", + "unichain-uni-usd-svr", + "unichain-usdc-usd", + "unichain-usdc-usd-svr", + "unichain-weeth-eeth-exchange-rate", + "unichain-wsteth-steth-exchange-rate", "xlayer-btc-usd", "xlayer-dai-usd", "xlayer-eth-usd", @@ -2122,6 +2518,7 @@ "xlayer-gho-usd", "xlayer-link-usd", "xlayer-okb-usd", + "xlayer-sol-usd", "xlayer-susde-usd", "xlayer-susde-usde-exchange-rate", "xlayer-syrupusdc-usdc-exchange-rate", diff --git a/.github/scripts/data/detect-data.sh b/.github/scripts/data/detect-data.sh index d48e3f7c068..ef4b9dce650 100755 --- a/.github/scripts/data/detect-data.sh +++ b/.github/scripts/data/detect-data.sh @@ -154,11 +154,12 @@ node < { const baseLower = i.baseAsset.toLowerCase(); return { @@ -187,6 +189,13 @@ node < { + // Deduplicate by URL — equity streams have multiple hour-variant feeds + // (regular/overnight/extended) that now each produce distinct URLs, but + // guard against any edge cases where URL generation still produces duplicates. + if (seen.has(t.url)) return false; + seen.add(t.url); + return true; }).sort((a, b) => a.assetName.localeCompare(b.assetName)); } diff --git a/.github/workflows/chainlink-automation-config.yml b/.github/workflows/chainlink-automation-config.yml index 7094367496a..94ccd602919 100644 --- a/.github/workflows/chainlink-automation-config.yml +++ b/.github/workflows/chainlink-automation-config.yml @@ -35,7 +35,7 @@ jobs: - if: ${{ steps.compare_configs.outputs.createPR }} id: chainlink_automation_config_pr name: Create pull request - uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: branch: 'chainlink_automation_config/pr-${{ steps.compare_configs.outputs.timestamp }}' commit-message: 'chainlink automation config updated' diff --git a/.github/workflows/chains-metadata.yml b/.github/workflows/chains-metadata.yml index fb275bf0813..f9cb97ab9fd 100644 --- a/.github/workflows/chains-metadata.yml +++ b/.github/workflows/chains-metadata.yml @@ -35,7 +35,7 @@ jobs: - if: ${{ steps.compare_chains.outputs.createPR }} id: chains_metadata_pr name: Create pull request - uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: branch: 'chains_metadata/pr-${{ steps.compare_chains.outputs.timestamp }}' commit-message: 'chains metadata updated' diff --git a/.github/workflows/detect-new-data.yml b/.github/workflows/detect-new-data.yml index 9bc9e924316..90ad076486e 100644 --- a/.github/workflows/detect-new-data.yml +++ b/.github/workflows/detect-new-data.yml @@ -81,7 +81,7 @@ jobs: # Step 3: Restore cached node_modules from setup job - name: Restore node_modules - uses: actions/cache@v4 + uses: actions/cache@v4 with: path: | node_modules @@ -135,7 +135,7 @@ jobs: # Step 10: Create a pull request if new data items were found - name: Commit & Create Pull Request if: steps.detect_data.outputs.new_data_found == 'true' - uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: "Data: Update changelog for new data items" @@ -152,7 +152,7 @@ jobs: # Step 11: Upload artifacts for debugging and record-keeping - name: Capture output artifacts if: always() - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: data-detection-${{ github.run_id }} path: | diff --git a/.github/workflows/detect-new-tokens.yml b/.github/workflows/detect-new-tokens.yml index 5cae81f718e..5b56c7a5e2e 100644 --- a/.github/workflows/detect-new-tokens.yml +++ b/.github/workflows/detect-new-tokens.yml @@ -143,7 +143,7 @@ jobs: # Create PR for new tokens - name: Create PR with new token information if: steps.check_tokens.outputs.new_tokens_found == 'true' - uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: "CCT: Update changelog with new tokens" @@ -160,7 +160,7 @@ jobs: # Capture output artifacts (always runs, even if previous steps failed) - name: Capture output files if: always() - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: token-detection-artifacts-${{ github.run_id }} path: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c7c86de98a9..d4da920c256 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,6 +8,7 @@ concurrency: env: FOUNDRY_PROFILE: ci + NODE_VERSION: '22' # Set default permissions as restrictive as possible permissions: @@ -16,6 +17,39 @@ permissions: checks: write # Required for test results jobs: + # Detect which file groups changed so downstream jobs can skip themselves + changes: + runs-on: ubuntu-latest + outputs: + solidity: ${{ steps.filter.outputs.solidity }} + typescript: ${{ steps.filter.outputs.typescript }} + content: ${{ steps.filter.outputs.content }} + any_non_solidity: ${{ steps.filter.outputs.any_non_solidity }} + steps: + - uses: actions/checkout@v6 + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + id: filter + with: + filters: | + solidity: + - 'public/samples/**/*.sol' + - 'foundry.toml' + typescript: + - '**/*.ts' + - '**/*.tsx' + - '**/*.astro' + - 'tsconfig*.json' + content: + - 'src/content/**' + - 'src/components/**' + - 'src/pages/**' + - 'src/layouts/**' + - 'astro.config.*' + any_non_solidity: + - '**' + - '!public/samples/**/*.sol' + - '!foundry.toml' + # Setup job to install and cache dependencies setup: runs-on: ubuntu-latest @@ -26,7 +60,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' @@ -46,7 +80,8 @@ jobs: # Job 1: Check Solidity Compilation and Solhint solidity: - needs: setup + needs: [setup, changes] + if: needs.changes.outputs.solidity == 'true' runs-on: ubuntu-latest steps: - name: Checkout Repo @@ -55,12 +90,12 @@ 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' - name: Install Foundry - uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5 + uses: foundry-rs/foundry-toolchain@8789b3e21e6c11b2697f5eb56eddae542f746c10 # v1.5 with: version: stable cache: false @@ -93,7 +128,8 @@ jobs: # Job 2: Check ESLint eslint: - needs: setup + needs: [setup, changes] + if: needs.changes.outputs.any_non_solidity == 'true' runs-on: ubuntu-latest steps: - name: Checkout Repo @@ -102,7 +138,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' @@ -132,8 +168,11 @@ jobs: # Job 3: Check Internal Links linkcheck-internal: - needs: setup + needs: [setup, changes] + if: needs.changes.outputs.content == 'true' runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout Repo uses: actions/checkout@v6 @@ -141,7 +180,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' @@ -158,13 +197,27 @@ jobs: echo "node_modules not found, installing dependencies..." npm ci --prefer-offline --no-audit fi + + - name: Build Site + run: npm run build + env: + NODE_OPTIONS: '--max-old-space-size=8192' - name: Check Internal Links - run: npm run linkcheck-internal + uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 + with: + args: >- + --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: - needs: [setup] + needs: [setup, changes] + if: needs.changes.outputs.typescript == 'true' runs-on: ubuntu-latest steps: - name: Checkout Repo @@ -173,7 +226,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' @@ -203,21 +256,18 @@ jobs: # Job 5: Run Jest Tests jest: - needs: [setup] + needs: [setup, changes] + if: needs.changes.outputs.typescript == 'true' 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' @@ -240,8 +290,41 @@ jobs: - name: Upload Test Coverage if: always() - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 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 + retention-days: 30 + + # Job 6: Validate LLM files are present and well-formed + validate-llms: + needs: [setup, changes] + if: needs.changes.outputs.content == 'true' + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + + - name: Restore node_modules + uses: actions/cache/restore@v4 + continue-on-error: true + with: + path: node_modules + key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }} + + - name: Ensure Dependencies + run: | + if [ ! -d "node_modules" ]; then + echo "node_modules not found, installing dependencies..." + npm ci --prefer-offline --no-audit + fi + + - name: Validate LLM files + run: npm run check:llms \ 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/.husky/pre-commit b/.husky/pre-commit index 6b636e2c0ce..84cb5d88f02 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1,4 @@ npx lint-staged +npm run generate:llms +git add 'src/content/**/llms-full*.txt' 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/codegen.ts b/codegen.ts new file mode 100644 index 00000000000..9b93ee4f875 --- /dev/null +++ b/codegen.ts @@ -0,0 +1,41 @@ +import type { CodegenConfig } from "@graphql-codegen/cli" +import dotenv from "dotenv" + +dotenv.config() + +const GRAPHQL_API_URL = process.env.CCIP_GRAPHQL_ENDPOINT +const GRAPHQL_AUTH_TOKEN = process.env.CCIP_GRAPHQL_API_KEY + +if (!GRAPHQL_API_URL) { + throw new Error("CCIP_GRAPHQL_ENDPOINT is not defined in .env") +} + +if (!GRAPHQL_AUTH_TOKEN) { + throw new Error("CCIP_GRAPHQL_API_KEY is not defined in .env") +} + +const config: CodegenConfig = { + schema: { + [GRAPHQL_API_URL]: { + headers: { + Authorization: `${GRAPHQL_AUTH_TOKEN}`, + }, + }, + }, + documents: ["./src/lib/ccip/graphql/queries/**/*.ts"], + emitLegacyCommonJSImports: false, + generates: { + "./src/lib/ccip/graphql/__generated__/": { + preset: "client", + presetConfig: { + gqlTagName: "gql", + }, + }, + "./src/lib/ccip/graphql/schema.graphql.json": { + plugins: ["introspection"], + }, + }, + ignoreNoDocuments: true, +} + +export default config 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..3382cefc90c 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,9 +30,15 @@ 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", }, transformIgnorePatterns: ["/node_modules/(?!.*\\.mjs$)"], - testPathIgnorePatterns: ["/node_modules/", "src/tests/chain-api.test.ts"], + testPathIgnorePatterns: [ + "/node_modules/", + "\\.vercel/", + "src/tests/chain-api.test.ts", + "src/tests/chain-identifier-service.test.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..953cb072089 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,18 +10,16 @@ "license": "ISC", "dependencies": { "@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", - "@astrojs/partytown": "^2.1.4", + "@astro-community/astro-embed-youtube": "^0.5.10", + "@astrojs/mdx": "^4.3.14", + "@astrojs/partytown": "^2.1.6", "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", + "@astrojs/sitemap": "^3.7.2", "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.2.11", - "@chainlink/blocks": "^1.3.1", + "@chainlink/blocks": "^1.3.4", "@chainlink/cl-search-frontend": "^0.12.1", "@chainlink/components": "^0.4.18", "@chainlink/contracts": "1.5.0", @@ -31,57 +29,66 @@ "@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", + "@openzeppelin/contracts": "5.6.1", + "@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.101.1", + "astro": "^5.18.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", + "fuse.js": "^7.3.0", "github-slugger": "^2.0.0", - "lodash": "^4.17.21", + "graphql": "^16.13.2", + "graphql-request": "^7.4.0", + "lodash": "^4.18.1", + "lru-cache": "^11.3.3", "marked": "^15.0.12", "nanostores": "^0.11.4", + "next": "14.2.35", + "p-limit": "^7.3.0", "pino": "^9.14.0", - "preact": "^10.27.2", - "react-instantsearch": "^7.20.0", + "preact": "^10.29.1", + "react-instantsearch": "^7.29.0", "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.32.2", + "swagger-ui-react": "^5.32.2", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.1", + "@graphql-codegen/cli": "^6.2.1", + "@graphql-codegen/client-preset": "^5.2.4", + "@graphql-codegen/introspection": "^5.0.1", "@jest/globals": "^29.7.0", "@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.24", + "@types/node": "^20.19.39", "@types/node-fetch": "^2.6.13", - "@types/prismjs": "^1.26.5", - "@types/react": "^19.2.7", + "@types/prismjs": "^1.26.6", + "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/swagger-ui-dist": "^3.30.6", "@types/swagger-ui-react": "^5.18.0", @@ -92,31 +99,28 @@ "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.88.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.2.1", "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.9", "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 +152,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.16.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.16.1.tgz", + "integrity": "sha512-Xxk4l00pYI+jE0PNw8y0MvsQWh5278WRtZQav8/BMMi3HKi2xmeuqe11WJ3y8/6nuBHdv39w76OpJb09TMfAVQ==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.50.1.tgz", + "integrity": "sha512-4peZlPXMwTOey9q1rQKMdCnwZb/E95/1e+7KujXpLLSh0FawJzg//U2NM+r4AiJy4+naT2MTBhj0K30yshnVTA==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.50.1.tgz", + "integrity": "sha512-i+aWHHG8NZvGFHtPeMZkxL2Loc6Fm7iaRo15lYSMx8gFL+at9vgdWxhka7mD1fqxkrxXsQstUBCIsSY8FvkEOw==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.50.1.tgz", + "integrity": "sha512-Hw52Fwapyk/7hMSV/fI4+s3H9MGZEUcRh4VphyXLAk2oLYdndVUkc6KBi0zwHSzwPAr+ZBwFPe2x6naUt9mZGw==", "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.50.1.tgz", + "integrity": "sha512-Bn/wtwhJ7p1OD/6pY+Zzn+zlu2N/SJnH46md/PAbvqIzmjVuwjNwD4y0vV5Ov8naeukXdd7UU9v550+v8+mtlg==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.50.1.tgz", + "integrity": "sha512-0V4Tu0RWR8YxkgI9EPVOZHGE4K5pEIhkLNN0CTkP/rnPsqaaSQpNMYW3/mGWdiKOWbX0iVmwLB9QESk3H0jS5g==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.50.1.tgz", + "integrity": "sha512-jofcWNYMXJDDr87Z2eivlWY6o71Zn7F7aOvQCXSDAo9QTlyf7BhXEsZymLUvF0O1yU9Q9wvrjAWn8uVHYnAvgw==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.50.1.tgz", + "integrity": "sha512-OteRb8WubcmEvU0YlMJwCXs3Q6xrdkb0v50/qZBJP1TF0CvujFZQM++9BjEkTER/Jr9wbPHvjSFKnbMta0b4dQ==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "engines": { "node": ">= 14.0.0" @@ -330,84 +279,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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.50.1.tgz", + "integrity": "sha512-0GmfSgDQK6oiIVXnJvGxtNFOfosBspRTR7csCOYCTL1P8QtxX2vDCIKwTM7xdSAEbJaZ43QlWg25q0Qdsndz8Q==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.50.1.tgz", + "integrity": "sha512-ySuigKEe4YjYV3si8NVk9BHQpFj/1B+ON7DhhvTvbrZJseHQQloxzq0yHwKmznSdlO6C956fx4pcfOKkZClsyg==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.50.1.tgz", + "integrity": "sha512-Cp8T/B0gVmjFlzzp6eP47hwKh5FGyeqQp1N48/ANDdvdiQkPqLyFHQVDwLBH0LddfIPQE+yqmZIgmKc82haF4A==", "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.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.50.1.tgz", + "integrity": "sha512-XKdGGLikfrlK66ZSXh/vWcXZZ8Vg3byDFbJD8pwEvN1FoBRGxhxya476IY2ohoTymLa4qB5LBRlIa+2TLHx3Uw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.50.1.tgz", + "integrity": "sha512-mBAU6WyVsDwhHyGM+nodt1/oebHxgvuLlOAoMGbj/1i6LygDHZWDgL1t5JEs37x9Aywv7ZGhqbM1GsfZ54sU6g==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.50.1" }, "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.50.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.50.1.tgz", + "integrity": "sha512-qmo1LXrNKLHvJE6mdQbLnsZAoZvj7VyF2ft4xmbSGWI2WWm87fx/CjUX4kEExt4y0a6T6nEts6ofpUfH5TEE1A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.50.1" }, "engines": { "node": ">= 14.0.0" @@ -479,47 +428,6 @@ "openapi-types": ">=7" } }, - "node_modules/@apollo/client": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.14.0.tgz", - "integrity": "sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "@wry/caches": "^1.0.0", - "@wry/equality": "^0.5.6", - "@wry/trie": "^0.5.0", - "graphql-tag": "^2.12.6", - "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.18.0", - "prop-types": "^15.7.2", - "rehackt": "^0.1.0", - "symbol-observable": "^4.0.0", - "ts-invariant": "^0.10.3", - "tslib": "^2.3.0", - "zen-observable-ts": "^1.2.5" - }, - "peerDependencies": { - "graphql": "^15.0.0 || ^16.0.0", - "graphql-ws": "^5.5.5 || ^6.0.3", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", - "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" - }, - "peerDependenciesMeta": { - "graphql-ws": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "subscriptions-transport-ws": { - "optional": true - } - } - }, "node_modules/@arbitrum/nitro-contracts": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@arbitrum/nitro-contracts/-/nitro-contracts-3.0.0.tgz", @@ -546,16 +454,35 @@ "integrity": "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==", "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==", + "node_modules/@ardatan/relay-compiler": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-13.0.1.tgz", + "integrity": "sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg==", + "dev": true, "license": "MIT", "dependencies": { - "lite-youtube-embed": "^0.3.4" + "@babel/runtime": "^7.29.2", + "immutable": "^5.1.5", + "invariant": "^2.2.4" }, "peerDependencies": { - "astro": "^2.0.0 || ^3.0.0-beta || ^4.0.0-beta || ^5.0.0-beta" + "graphql": "*" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@astro-community/astro-embed-youtube": { + "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" } }, "node_modules/@astrojs/compiler": { @@ -565,24 +492,24 @@ "license": "MIT" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", - "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", "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.11", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz", + "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.7.5", + "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "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 +517,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.21.0", + "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", @@ -600,12 +527,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.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", "license": "MIT", "dependencies": { - "@astrojs/markdown-remark": "6.3.9", + "@astrojs/markdown-remark": "6.3.11", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", @@ -627,12 +554,12 @@ } }, "node_modules/@astrojs/partytown": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@astrojs/partytown/-/partytown-2.1.4.tgz", - "integrity": "sha512-loUrAu0cGYFDC6dHVRiomdsBJ41VjDYXPA+B3Br51V5hENFgDSOLju86OIj1TvBACcsB22UQV7BlppODDG5gig==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@astrojs/partytown/-/partytown-2.1.6.tgz", + "integrity": "sha512-pS95OSnPkSmuOHzwLXCea8p4P8bqmA2fm3BUBW6/egzSTaWYte/Gp1jiAoPmCZ6FV7jGx4GHduO2CUltUXc3Og==", "license": "MIT", "dependencies": { - "@qwik.dev/partytown": "^0.11.0", + "@qwik.dev/partytown": "^0.11.2", "mrmime": "^2.0.1" } }, @@ -687,21 +614,29 @@ } }, "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.2", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.2.tgz", + "integrity": "sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==", "license": "MIT", "dependencies": { - "sitemap": "^8.0.0", + "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", - "zod": "^3.25.76" + "zod": "^4.3.6" + } + }, + "node_modules/@astrojs/sitemap/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/@astrojs/tailwind": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-6.0.2.tgz", "integrity": "sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==", - "license": "MIT", "dependencies": { "autoprefixer": "^10.4.21", "postcss": "^8.5.3", @@ -713,9 +648,9 @@ } }, "node_modules/@astrojs/tailwind/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "funding": [ { "type": "opencollective", @@ -730,7 +665,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -798,12 +732,12 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -812,29 +746,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -851,13 +785,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -879,12 +813,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -894,6 +828,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -904,27 +847,27 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -934,9 +877,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -970,25 +913,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1048,6 +991,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", @@ -1285,52 +1244,52 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", - "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", + "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.48.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -1358,9 +1317,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1379,21 +1338,21 @@ "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" } }, "node_modules/@chainlink/blocks": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@chainlink/blocks/-/blocks-1.3.1.tgz", - "integrity": "sha512-0Px46fJA7aIm7cFuF/6CgV1ZSbkNKfe+QBA0XO7j9Ld8cevlIF/r4GsqR5zDbSaHPejvRloMQJVZoBsU9qINnA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@chainlink/blocks/-/blocks-1.3.4.tgz", + "integrity": "sha512-lIMa+TLYbrNkKnaXCMvE5oCRBFgXZxnHO7jRkzbZFRQgJAEsD0SjuILDDmi6b0yw2ZPIvvoF7Zk0Dd0GaF2SuA==", "license": "ISC", "dependencies": { "@floating-ui/react": "0.22.2", @@ -1820,9 +1779,9 @@ } }, "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.7", @@ -1844,108 +1803,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", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/@chainlink/blocks/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@chainlink/cl-search-frontend": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@chainlink/cl-search-frontend/-/cl-search-frontend-0.12.1.tgz", @@ -1997,42 +1854,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", @@ -2049,80 +1870,43 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/sha2": "^5.8.0" - } - }, - "node_modules/@chainlink/components/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/@chainlink/components/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, "node_modules/@chainlink/contracts": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-1.5.0.tgz", "integrity": "sha512-1fGJwjvivqAxvVOTqZUEXGR54CATtg0vjcXgSIk4Cfoad2nUhSG/qaWHXjLg1CkNTeOoteoxGQcpP/HiA5HsUA==", + "license": "BUSL-1.1", "dependencies": { "@arbitrum/nitro-contracts": "3.0.0", "@changesets/cli": "^2.29.6", @@ -3023,6 +2807,21 @@ "@ethersproject/wordlists": "5.8.0" } }, + "node_modules/@chainlink/contracts-1.4.0/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@chainlink/contracts-1.4.0/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -3951,10 +3750,26 @@ "@ethersproject/wordlists": "5.8.0" } }, + "node_modules/@chainlink/contracts-ccip/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@chainlink/contracts-ccip/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4118,8 +3933,8 @@ }, "node_modules/@chainlink/contracts/node_modules/@ethersproject/basex": { "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", + "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", "funding": [ { "type": "individual", @@ -4133,7 +3948,8 @@ "license": "MIT", "peer": true, "dependencies": { - "@ethersproject/logger": "^5.8.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, "node_modules/@chainlink/contracts/node_modules/@ethersproject/bignumber": { @@ -4157,6 +3973,25 @@ "bn.js": "^5.2.1" } }, + "node_modules/@chainlink/contracts/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/node_modules/@ethersproject/constants": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", @@ -4316,6 +4151,22 @@ "js-sha3": "0.8.0" } }, + "node_modules/@chainlink/contracts/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/node_modules/@ethersproject/networks": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", @@ -4335,6 +4186,46 @@ "@ethersproject/logger": "^5.8.0" } }, + "node_modules/@chainlink/contracts/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/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/node_modules/@ethersproject/providers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", @@ -4415,6 +4306,28 @@ "@ethersproject/logger": "^5.8.0" } }, + "node_modules/@chainlink/contracts/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/node_modules/@ethersproject/signing-key": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", @@ -4737,108 +4650,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", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/@chainlink/design-system/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@chainlink/local": { "version": "0.2.7-beta", "resolved": "https://registry.npmjs.org/@chainlink/local/-/local-0.2.7-beta.tgz", @@ -5364,6 +5175,21 @@ "changeset": "bin.js" } }, + "node_modules/@changesets/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@changesets/cli/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -5628,6 +5454,50 @@ "tslib": "^2.4.0" } }, + "node_modules/@envelop/core": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.1.tgz", + "integrity": "sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@envelop/types": "^5.2.1", + "@whatwg-node/promise-helpers": "^1.2.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", + "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -6362,9 +6232,9 @@ } }, "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==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -6375,8 +6245,9 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.8.0" + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { @@ -6453,6 +6324,73 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "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/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "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/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" + }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", @@ -6474,9 +6412,9 @@ } }, "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==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "funding": [ { "type": "individual", @@ -6486,7 +6424,8 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "license": "MIT" }, "node_modules/@ethersproject/networks": { "version": "5.7.1", @@ -6508,9 +6447,9 @@ } }, "node_modules/@ethersproject/pbkdf2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", - "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "funding": [ { "type": "individual", @@ -6521,16 +6460,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/sha2": "^5.8.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.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==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -6541,8 +6480,9 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.8.0" + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { @@ -6645,9 +6585,9 @@ } }, "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==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -6658,9 +6598,10 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", "hash.js": "1.1.7" } }, @@ -6688,6 +6629,30 @@ "hash.js": "1.1.7" } }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "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/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, "node_modules/@ethersproject/strings": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", @@ -6736,6 +6701,60 @@ "@ethersproject/signing-key": "^5.7.0" } }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "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/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "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/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, "node_modules/@ethersproject/web": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", @@ -6759,23 +6778,53 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "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/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "dev": true, + "license": "MIT" + }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/react": { @@ -6807,247 +6856,1335 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.1.tgz", - "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==", + "node_modules/@graphql-codegen/add": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-6.0.0.tgz", + "integrity": "sha512-biFdaURX0KTwEJPQ1wkT6BRgNasqgQ5KbCI1a3zwtLtO7XTo7/vKITPylmiU27K5DSOWYnY/1jfSqUAEBuhZrQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, "peerDependencies": { - "react-hook-form": "^7.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@graphql-codegen/add/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "license": "0BSD" + }, + "node_modules/@graphql-codegen/cli": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-6.2.1.tgz", + "integrity": "sha512-E1B+5nBda2l89Pci5M0HcEj2Hmx2yhORFX+1T3rmwpQjdOiulo+h9JifWxKomUpjfbmU1YkBSd47CCGLFPU10A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^5.2.4", + "@graphql-codegen/core": "^5.0.1", + "@graphql-codegen/plugin-helpers": "^6.2.0", + "@graphql-tools/apollo-engine-loader": "^8.0.28", + "@graphql-tools/code-file-loader": "^8.1.28", + "@graphql-tools/git-loader": "^8.0.32", + "@graphql-tools/github-loader": "^9.0.6", + "@graphql-tools/graphql-file-loader": "^8.1.11", + "@graphql-tools/json-file-loader": "^8.0.26", + "@graphql-tools/load": "^8.1.8", + "@graphql-tools/merge": "^9.0.6", + "@graphql-tools/url-loader": "^9.0.6", + "@graphql-tools/utils": "^11.0.0", + "@inquirer/prompts": "^7.8.2", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "cosmiconfig": "^9.0.0", + "debounce": "^2.0.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.1.6", + "is-glob": "^4.0.1", + "jiti": "^2.3.0", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^9.0.0", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" }, "engines": { - "node": ">=10.10.0" + "node": ">=16" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@graphql-codegen/cli/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=12.22" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@humanwhocodes/momoa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", - "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "node_modules/@graphql-codegen/cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@graphql-codegen/cli/node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", - "optional": true, + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, "engines": { - "node": ">=18" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@graphql-codegen/cli/node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/d-fischer" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@graphql-codegen/cli/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-codegen/cli/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@graphql-codegen/cli/node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@graphql-codegen/cli/node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@graphql-codegen/cli/node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@graphql-codegen/cli/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@graphql-codegen/client-preset": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-5.2.4.tgz", + "integrity": "sha512-k4f9CoepkVznXRReCHBVnG/FeQVQgIOhgtkaJ6I9FcQRzUkrm9ASmQjOdNdMlZt0DHTU4nbVxIBGZW7gk1RavA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^6.0.0", + "@graphql-codegen/gql-tag-operations": "5.1.4", + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-codegen/typed-document-node": "^6.1.7", + "@graphql-codegen/typescript": "^5.0.9", + "@graphql-codegen/typescript-operations": "^5.0.9", + "@graphql-codegen/visitor-plugin-common": "^6.2.4", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^11.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } } }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@graphql-codegen/client-preset/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-5.0.1.tgz", + "integrity": "sha512-eQD7aXpKkKvaydMv5Bu0FnKCPnNMAhZ3vZW+K4Rl9IAC2w5PDv9lJhs3YTWM9W58zNOZpGQGT2F0ekS3QNIiKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^11.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@graphql-codegen/core/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-5.1.4.tgz", + "integrity": "sha512-tDj/0a1U7rDH3PQgLeA+PlgBNb593MIJ43oAOKMRgJPwIQ9T7p2oqBRLxwfFZFTDLwnwsGZ7xIKqIcGgyAIj5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-codegen/visitor-plugin-common": "^6.2.4", + "@graphql-tools/utils": "^11.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "node_modules/@graphql-codegen/gql-tag-operations/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/introspection": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/introspection/-/introspection-5.0.1.tgz", + "integrity": "sha512-dX6U8o0Sddhuw491e5DTE1Vf8h4SN+8bldQ+XcK6imS7eVqduond1uZjLNgFejQFWfd7x0KWldKqyy/9Ilwtlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-codegen/visitor-plugin-common": "^6.2.4", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/introspection/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-6.2.1.tgz", + "integrity": "sha512-shRr26TfVZ6KFBjzRYUj02gLNh6yaECz9gTGgI6riANw5sSH9PONwTsBRYkEgU+6IXiL7VQeCumahvxSGFbRlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-5.0.1.tgz", + "integrity": "sha512-svLffXddnXxq1qFXQqqh+zYrxdiMnIKm+CXCUv0MYhLh0R4L5vpnaTzIUCk3icHNNXhKRm2uBD70+K8VY0xiCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-tools/utils": "^11.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-6.1.7.tgz", + "integrity": "sha512-VLL9hB+YPigc/W2QYCkSNMZrkKv42nTchb9mJ0h5VY98YmW/zWb6NeYM80iHSpk8ZvHsuUT5geA53/s1phO2NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-codegen/visitor-plugin-common": "^6.2.4", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typescript": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-5.0.9.tgz", + "integrity": "sha512-YlIZ4nqdFdzr5vxuNtQtZnnMYuZ5cLYB2HaGhGI2zvqHxCmkBjIRpu/5sfccawKy23wetV+aoWvoNqxGKIryig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-codegen/schema-ast": "^5.0.1", + "@graphql-codegen/visitor-plugin-common": "^6.2.4", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-5.0.9.tgz", + "integrity": "sha512-jJFdJKMS5Cqisb5QMi7xXHPsJH9yHBMYOxBc8laFkFjHk/AOqJK90qCKbO9lwwTMPZUDe6N/HslmA0ax4J0zsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-codegen/typescript": "^5.0.9", + "@graphql-codegen/visitor-plugin-common": "^6.2.4", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/typescript-operations/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typescript/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-6.2.4.tgz", + "integrity": "sha512-iwiVCc7Mv8/XAa3K35AdFQ9chJSDv/gYEnBeQFF/Sq/W8EyJoHypOGOTTLk7OSrWO4xea65ggv0e7fGt7rPJjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.1", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.1.1", + "@graphql-tools/utils": "^11.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^1.0.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-hive/signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", + "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.29", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.29.tgz", + "integrity": "sha512-437JW84ueB9lmEwiAAWww7pBC6uyHVmh64hXErWumXVh9FIjTtUdRNvDn5AayWEhYKri/zu19z6znUdtNuqyjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.1", + "@whatwg-node/fetch": "^0.10.13", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.8.tgz", + "integrity": "sha512-Kobt37qrVTFhX4HUK5/vPgMXFw/5f97AzmAlfmDBSRh/GnoAmLKCb48FrEI3gdeIwZB2fEhVHJyDqsojldnLQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute/node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.31", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.31.tgz", + "integrity": "sha512-YHDcfcRp2mkL1HCfD2Udn199JcSJYARZyFfFlTqPq7ZVuJ72Zsa8bF/yE6D5plPMsXFa1hQF3iQvJhPsMcjf4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.30", + "@graphql-tools/utils": "^11.0.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.13.tgz", + "integrity": "sha512-Aei3SI5HezLt7kKQNbX/GrZv5c5YibdbP0N6BvuEWQYG+lpRO3RRX2fZ+g+KshJOGuTJQFK1umIjki++vKoJ+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^10.0.8", + "@graphql-tools/executor": "^1.4.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate/node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.2.tgz", + "integrity": "sha512-V7QaW/59Dml7DK0MApMP/Z+qx2qkQ0inGJGi/n1JwBHRZehXTKDNKO7OFRA0h6V1w2afmcVso2GFwlDnPyusGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.1", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", + "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.4.0", + "@graphql-tools/utils": "^11.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.5.tgz", + "integrity": "sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isows": "^1.0.7", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.2.1.tgz", + "integrity": "sha512-53i0TYO0cznIlZDJcnq4gQ6SOZ8efGgCDV33MYh6oqEapcp36tCMEVnVGVxcX5qRRyNHkqTY6hkA+/AyK9kicQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^2.0.0", + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.3.2", + "meros": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.27.tgz", + "integrity": "sha512-tz0K8U9VKr9G/murdPpsARM2SxrXKtaKHaFoAZQoxHpWgbTdoGgJoyT5AoY6MZkgLRi5g24X0iZOLVtYlwy/nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.1", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.20.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws/node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.35", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.35.tgz", + "integrity": "sha512-KcZcy4h80f+PoULl7TFBUzO+9o71weTFnD0mNS2OpLh7JfKRnqZKBgeawn+G5iOu5EWTFBFwMgvauzVsHC6PcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.30", + "@graphql-tools/utils": "^11.0.1", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.1.1.tgz", + "integrity": "sha512-2xq2vCcGoCfuCqmZw48CRbb3AD6iDlAtk3ce1keimXru7h/81UhPS+8DB1m2fUlhhAAA31R8wFkawnxlFu7MFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-http": "^3.2.1", + "@graphql-tools/graphql-tag-pluck": "^8.3.30", + "@graphql-tools/utils": "^11.0.1", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.1.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.13.tgz", + "integrity": "sha512-Su9RIYUrQ9yoKioObS5yNkGuOqwSIZVK79mre9ji+s3zr7UQepoKkuns6NrtmMcD1vUJyayzvr9YTaiLRbZGQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/import": "^7.1.13", + "@graphql-tools/utils": "^11.0.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.30", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.30.tgz", + "integrity": "sha512-pit39s4+sLC5i6GOFpPieo917Qjq02JyDxrr6CSi0cBpRGYf9T1/HGdi3D/SfoOkuZWcQgnNnnGrLoDDmBGVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.6", + "@babel/parser": "^7.29.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^11.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.1.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.13.tgz", + "integrity": "sha512-7leXxlZqVylYL2nvmcF3jUQuH3piT0unBpbPQ3F7r5UM0rehkgEcXxTeR8hZ3aQDeMVyaTli9bJjFTFErldYRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.1", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.27.tgz", + "integrity": "sha512-iOMleQVqNOLDslrE1eLXFJ/z7uSBHd7kM6M+vpS3CvON2nccBK0NIMkdy0385m1LCHyfBKds/rsjMnGmjdXIhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.9.tgz", + "integrity": "sha512-BXaghzA0KVRvDjAlhEb26OwtmLYsSqs29nVyubIRfRy28ysdzEH+9HkYgQHmorJN+QPBbh9Gdg8nsGKeTPBpLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/schema": "^10.0.32", + "@graphql-tools/utils": "^11.0.1", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/load/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.1.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.8.tgz", + "integrity": "sha512-25V7WDrODo1cPrmuUCrqf5qlMA4a/Ow4aHaqJ1MnTUaluwsV3UiqzCHWux3HSLb0H63mkoZiuOrU5xJhxRcoCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.3.tgz", + "integrity": "sha512-Vzh5QORIqX0KtwxgNepl/T16a85Br7YbOxxxmnyVpS7yza9vBjkrERbvAwADcYyPH7kyShmH1Gu5+88+vCVhuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ardatan/relay-compiler": "^13.0.1", + "@graphql-tools/utils": "^11.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.32", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.32.tgz", + "integrity": "sha512-kJ1Qn20MPnlaEVH37639E6rzQ1tEtr6XTUhNdR4EKydl+FijtLhWX2WLZbGnvrYuG8XUcMxsZU9mRRYYNvK02w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.1.8", + "@graphql-tools/utils": "^11.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.1.tgz", + "integrity": "sha512-mLrUnyjPbYrwbCs2GqVXB4CPGZye4aOzJlLOYNctKm3QvGaMSmEwsAVJjpuG8D+ky/1OwCklqgo2KBj3TgYoSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^3.1.4", + "@graphql-tools/executor-http": "^3.2.1", + "@graphql-tools/executor-legacy-ws": "^1.1.27", + "@graphql-tools/utils": "^11.0.1", + "@graphql-tools/wrap": "^11.1.1", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0", + "ws": "^8.20.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.1.tgz", + "integrity": "sha512-pNyCOb95ab/z3zkkiPwIPYxigX7IcpyFVcgD1XACDEvg/7yGnKCESx3k/XHEeneKYx/aWKGzEh/uuf6M6Q8HOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.13.tgz", + "integrity": "sha512-oWdhddkcFy9vKjvAZiw7oH/1mrgg0uMpwdeFeFt7S/MlLiySx+Vuk7kjARktjUBl+yAMt9q1/BADnoT+5vH0hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^12.0.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.1.tgz", + "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==", + "license": "MIT", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -7171,188 +8308,563 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8987,9 +10499,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 +10555,27 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "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 +10589,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9091,7 +10605,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9108,7 +10621,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9125,7 +10637,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9142,7 +10653,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9159,7 +10669,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9176,7 +10685,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9193,7 +10701,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9210,7 +10717,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -9299,19 +10805,10 @@ "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", - "integrity": "sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.6.1.tgz", + "integrity": "sha512-Ly6SlsVJ3mj+b18W3R8gNufB7dTICT105fJhodGAGgyC2oqnBAhqSiNDJ8V8DLY05cCz81GLI0CU5vNYA1EC/w==", "license": "MIT" }, "node_modules/@openzeppelin/contracts-4.7.3": { @@ -9362,9 +10859,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.19.1.tgz", + "integrity": "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==", "cpu": [ "arm" ], @@ -9376,9 +10873,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.19.1.tgz", + "integrity": "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==", "cpu": [ "arm64" ], @@ -9390,9 +10887,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.19.1.tgz", + "integrity": "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==", "cpu": [ "arm64" ], @@ -9404,9 +10901,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.19.1.tgz", + "integrity": "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==", "cpu": [ "x64" ], @@ -9418,9 +10915,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.19.1.tgz", + "integrity": "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==", "cpu": [ "x64" ], @@ -9432,9 +10929,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.19.1.tgz", + "integrity": "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==", "cpu": [ "arm" ], @@ -9446,9 +10943,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.19.1.tgz", + "integrity": "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==", "cpu": [ "arm" ], @@ -9460,9 +10957,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.19.1.tgz", + "integrity": "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==", "cpu": [ "arm64" ], @@ -9474,9 +10971,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.19.1.tgz", + "integrity": "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==", "cpu": [ "arm64" ], @@ -9488,9 +10985,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.19.1.tgz", + "integrity": "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==", "cpu": [ "ppc64" ], @@ -9502,9 +10999,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.19.1.tgz", + "integrity": "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==", "cpu": [ "riscv64" ], @@ -9516,9 +11013,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.19.1.tgz", + "integrity": "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==", "cpu": [ "riscv64" ], @@ -9530,9 +11027,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.19.1.tgz", + "integrity": "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==", "cpu": [ "s390x" ], @@ -9544,9 +11041,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.19.1.tgz", + "integrity": "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==", "cpu": [ "x64" ], @@ -9558,9 +11055,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.19.1.tgz", + "integrity": "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==", "cpu": [ "x64" ], @@ -9571,10 +11068,24 @@ "linux" ] }, + "node_modules/@oxc-resolver/binding-openharmony-arm64": { + "version": "11.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.19.1.tgz", + "integrity": "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==", + "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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.19.1.tgz", + "integrity": "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==", "cpu": [ "wasm32" ], @@ -9582,16 +11093,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.7" + "@napi-rs/wasm-runtime": "^1.1.1" }, "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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.19.1.tgz", + "integrity": "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==", "cpu": [ "arm64" ], @@ -9603,9 +11114,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.19.1.tgz", + "integrity": "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==", "cpu": [ "ia32" ], @@ -9617,9 +11128,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.19.1", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.19.1.tgz", + "integrity": "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==", "cpu": [ "x64" ], @@ -9788,18 +11299,6 @@ "vite": ">=2.0.0" } }, - "node_modules/@prettier/sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@prettier/sync/-/sync-0.3.0.tgz", - "integrity": "sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw==", - "dev": true, - "funding": { - "url": "https://github.com/prettier/prettier-synchronized?sponsor=1" - }, - "peerDependencies": { - "prettier": "^3.0.0" - } - }, "node_modules/@project-serum/anchor": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.26.0.tgz", @@ -12007,12 +13506,12 @@ } }, "node_modules/@radix-ui/react-select/node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", @@ -14083,6 +15582,13 @@ "license": "MIT", "peer": true }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz", + "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -14571,60 +16077,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 +16797,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 +16959,7 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.1", + "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, @@ -15426,6 +17079,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 +17191,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 +17202,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 +17226,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 +17253,7 @@ }, "peerDependencies": { "@types/react": "^19.1.1", - "react": "^19.1.1" + "react": "^19.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -15612,9 +17273,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 +17335,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 +17917,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 +17944,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 +17954,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 +18035,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 +18163,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 +18183,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 +18485,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 +19402,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.101.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.101.1.tgz", + "integrity": "sha512-Kd0Wey+RkFHgyVep7adS6UOE2pN6MJ3mZ32PAXSvfw6IjUkFRC7IQpdZZjUOcUe5pXr1ejufCRgF6lsGINe4Tw==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -17496,9 +19415,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.101.1", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.101.1.tgz", + "integrity": "sha512-OZWU7YtaG+NNNFZK8p/FuJ6gpq7pFyrG2fLOopP73HAIDHDGpOttPJapvO8ADu3RkqfQfkwrB354vPkSBbZ20A==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -17507,10 +19426,16 @@ "node": ">=20.0.0" } }, + "node_modules/@supabase/phoenix": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.0.tgz", + "integrity": "sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==", + "license": "MIT" + }, "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.101.1", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.101.1.tgz", + "integrity": "sha512-UW1RajH5jbZoK+ldAJ1I6VZ+HWwZ2oaKjEQ6Gn+AQ67CHQVxGl8wNQoLYyumbyaExm41I+wn7arulcY1eHeZJw==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -17520,12 +19445,12 @@ } }, "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.101.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.101.1.tgz", + "integrity": "sha512-Oa6dno0OB9I+hv5do5zsZHbFu41ViZnE9IWjmkeeF/8fPmB5fWoHGqeTYEC3/0DAgtpUoFJa4FpvzFH0SBHo1Q==", "license": "MIT", "dependencies": { - "@types/phoenix": "^1.6.6", + "@supabase/phoenix": "^0.4.0", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" @@ -17535,11 +19460,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.101.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.101.1.tgz", + "integrity": "sha512-WhTaUOBgeEvnKLy95Cdlp6+D5igSF/65yC727w1olxbet5nzUvMlajKUWyzNtQu2efrz2cQ7FcdVBdQqgT9YKQ==", "license": "MIT", "dependencies": { + "iceberg-js": "^0.8.1", "tslib": "2.8.1" }, "engines": { @@ -17547,16 +19473,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.101.1", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.101.1.tgz", + "integrity": "sha512-Jnhm3LfuACwjIzvk2pfUbGQn7pa7hi6MFzfSyPrRYWVCCu69RPLCFyHSBl7HSBwadbQ3UZOznnD3gPca3ePrRA==", "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.101.1", + "@supabase/functions-js": "2.101.1", + "@supabase/postgrest-js": "2.101.1", + "@supabase/realtime-js": "2.101.1", + "@supabase/storage-js": "2.101.1" }, "engines": { "node": ">=20.0.0" @@ -17619,13 +19545,13 @@ } }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-rc.3.tgz", - "integrity": "sha512-lGxvtanmQYqepjVWwPROR/97BIP3sUtwzoHbMSMag2/C3+Un8p6Xz8+I+1sPG2UOBlvDsQe3Di0hlSET7EFwAQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.8.0.tgz", + "integrity": "sha512-cpYLFeXusH9kN1ekaTbb9rG8HYFYtqZeiAAB4WaA1YmMkzf5bHSKqsrMFVKwupwdKTxxkmmlsLqGjy1HOIxFlQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.0.0-rc.3", + "@swagger-api/apidom-error": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17633,14 +19559,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-rc.3.tgz", - "integrity": "sha512-cRf+HzoXl3iDPc7alVxdPbLb1TqRePqsxI0id2KaB8HYbyxTUy3ygqY/jmxGtfAAK0Ba85Bw8j4N0crw23vLTg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.8.0.tgz", + "integrity": "sha512-iJavkTVvf5iRMYG0W5XPM33A6BypWvEVrnXfl0hiUL7AEV1ZcDLjyxvmS4CqYdaB4oiSVpClMlJZZqUI1yt0rg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", + "@swagger-api/apidom-ast": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -17650,37 +19576,37 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-rc.3.tgz", - "integrity": "sha512-E9WsxzR9wwD4+1zmZm9PVvxXBAYxMtGJjpRYR/FthvxhIwx+Vsey2h5k7FPS8yJsawIrdGPQtdiFMLPvnQXUFg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.8.0.tgz", + "integrity": "sha512-Bbqr15CpSbexdQYr4Z7sI6UGQw650nDrynQkGXu7NEWO/kGM43RexvkrIGHfOLlf4gA71qRO630KYe+/+b62/Q==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-rc.3.tgz", - "integrity": "sha512-cj83L5ntai/RJcZV0++lQiCHPWE6lTy62bGC2lQ0yi/kyCc+Ig+Sn08qpiLSrkQ4OooK85X+wgAy6pMK+Vt/8Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.8.0.tgz", + "integrity": "sha512-r00Tl0MDdiKowH6xSzVAdwGnNIQ7uFPfxFJHcDnA/lZ8S1mUTHToaoq3ZiEtErdkM4Qvb6r2kUo7gjuX4cyZvA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", "@swaggerexpert/json-pointer": "^2.10.1" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-rc.3.tgz", - "integrity": "sha512-JB06VDEKPvyOcJ9qIJmr2vI2FSWjdZh+BiRExZPW4tv/mTvdOxt1n38WA+mKzfFHQuoTR4ork/wR481CjAfGGQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.8.0.tgz", + "integrity": "sha512-3jFySxvBDnsPg7B4hPGqWmlRm2o6mOViyKWKXT2cHixjPP7ZxvCaj8bdSQhmOaZrdgMM+9JUXpY8yZz6UdNrig==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17688,15 +19614,15 @@ } }, "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-rc.3.tgz", - "integrity": "sha512-Um0MGGsGLQWvnASDoguSuE5X/NpS/9RlXlOHHG5nqzG2cdTlifRcN5tiz7H997162+ahEsD5aHD6tUKWOPCLtQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.8.0.tgz", + "integrity": "sha512-CQ2+FbsZgcBcEY9PSfqvG1vRDSUjj+wfILGbhd9/EitF6E1hdur+ahUNPObW8qBHN/nOvo+cRtoGMTP1ZB8i3Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17704,15 +19630,31 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-rc.3.tgz", - "integrity": "sha512-UFmnbvEsN7jVvS/8V7X37UPvn8uxdqYBhDzdPSivjxpu/5Ag5Q1P2gHJnO6K2EfTCFL4S1qDObW2TUFdV1b6pg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.8.0.tgz", + "integrity": "sha512-COFbS2FoUOIUEz7+Sq9NHwsidBPZ0aqQu3/TXID2O+kx4MfZmnGrpuJliwYeB73gkI4o2JhT28fB1Jb+pmul7Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.8.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-asyncapi-3": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.8.0.tgz", + "integrity": "sha512-kC6mxmh+x+qpyZvxAA2C0BURUtnCVpNRvcjrnzMEShA4mderW+e6uD6rtmr3DxbBt+BGIQE9eXtCOW1q+aPOUQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17720,15 +19662,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-rc.3.tgz", - "integrity": "sha512-fxQo/GK5NGdx4gN2snj4DpBcDc8bORLehTUqcwp33ikJ2PGugtpV3IQrBjxSWP05PyLOZAMpq1SM9gkCPgZNRA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.8.0.tgz", + "integrity": "sha512-ipyiN63PpMccMpC6K95yl0MZOjFGMlCGtphKE9j1W2Hj8Poxirdlo8NpYOioqC2uJlEwb+fm0Ue2ysFdFkG0Ng==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17736,15 +19678,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-rc.3.tgz", - "integrity": "sha512-iDPbua9HajFwkH9vFUIbkmKVI/VXKuV9G+jLGkyBlF/Zu++1Rv6CstBt+F9CgNThSUqkKt3YA9Rcd82uh1+HnQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.8.0.tgz", + "integrity": "sha512-v1RdzxUcGv6RtXYLKd5qh8asPWzSrbDkEwHgV0JitzwQd8sd0Vu3ey8JaIuG3ZTsndS7qHOQG9Xdu+rqtjEXxQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17752,14 +19694,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-rc.3.tgz", - "integrity": "sha512-8lft8qCo/KAHqiUpfwUMifP9JDhuhXKMNYSSahP2SN0PnbujoS1h3DOXtpR9/+0N6fKPUT8I6GLEwgq8TX2yvA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.8.0.tgz", + "integrity": "sha512-UOvfkK2Dl158IZ2wCYcE1z2YcPZDPKMe6U0OdwBoftM8sWd19GU6a6jyUw2AKSofCdmPWEIRvZNYHvDcue1cbA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-rc.3", - "@swagger-api/apidom-core": "^1.0.0-rc.3", + "@swagger-api/apidom-ast": "^1.8.0", + "@swagger-api/apidom-core": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17767,15 +19709,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-rc.3.tgz", - "integrity": "sha512-IDC+98ur+7L3YaZZnnCytx9+cihElj24CcjX/X2mOBqOTaAwZ/Exb7LiBnvUswV1lOE2X2CX4donRemjk+e32Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.8.0.tgz", + "integrity": "sha512-RlO/P8VpQ55hhrP4MMf9wyiBWBbrEnEhN1MtTIyF/P04+WxRBPCOVmAFiCJ9DAI6ppJIU+PBn/5wF7mpUCmA6Q==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17783,15 +19725,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-rc.3.tgz", - "integrity": "sha512-P0dk9WhH7CINBCh1u8GfcQFycrZcw3qCXug0w6M0wiSrjqZv+Mv/AI68dc0Rb+Dzshe4aZy0bZFjAQb3NHfrSg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.8.0.tgz", + "integrity": "sha512-RDY2TxaJ/wCUBDq9ZqLM8E9Ub4kSyJ5USqjp5HsgRkYOkXKZzXKnEDwtTz2ZO4s+9ocjQMMEtWNvpCHYTR/JFA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17799,16 +19741,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-rc.3.tgz", - "integrity": "sha512-zwriSfjG+qiPWBHLZRyfdZa305xrB24aZjiAY8r2ikZsdQhC/WHI+e6YqeVCkJwkLzA/oZgrlmyci0mvtkFDQA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.8.0.tgz", + "integrity": "sha512-9GZDWZc28RcpuinZjSnK7L6TVKtBYKb3n0SGqITKfNp2CRKcEwIeyenQjiES4/lwcT3VYIROByG89+6KHX6p2w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17816,15 +19758,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-rc.3.tgz", - "integrity": "sha512-RCufXt7ja7fqFS/EqWOMZ54J4uEnqPQkCXMwwCqUrFHXQ7nGN1J9nmwj2hFQUFYraajmtnk2dNByO46+XefV1w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.8.0.tgz", + "integrity": "sha512-c1OcjKo/WDd13b08WW1ENm2tArYJunO2SsRnqhg//Z6UOJl+5q4ykIWi96zx/yxh6+kPFVCylU5Mxl+eNW35ng==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17832,17 +19774,36 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-rc.3.tgz", - "integrity": "sha512-Nc28G/ikbypcXVricv8+PGEGXKAmOwZjkBxB3wN5D4+D0+AiUy1lV07Z7+xFWdql65Y5WWxxfU2/Ej01Bnqt4Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.8.0.tgz", + "integrity": "sha512-l19IeQG8I2i3510jNd7OO99f1hqV6zlVkHNKgLSsjufMjIP30p8iJ1tz6QPoVxC5S8ZRCijEUCo0rsyVpITV0g==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.8.0", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-json-pointer": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.8.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-openapi-3-2": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.8.0.tgz", + "integrity": "sha512-RJqLKqXV1x9N358PXzD5tIS3fhGVP1axIZBXFfV3pI/1QFprUq0qjxU0yyW26BRsP81ZXHY/41WIwBPmeDLJXA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-rc.3", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-json-pointer": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.3", + "@swagger-api/apidom-ast": "^1.8.0", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-json-pointer": "^1.8.0", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17850,112 +19811,144 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-rc.3.tgz", - "integrity": "sha512-ZXKuMd6nqBrpCqTJmbd2pS46ZmL8bIra1KqWVjcvkA/E032nmgDeaT78Cf0Ulha6j+CAzcwL0AnR7GrtFpSfSw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.8.0.tgz", + "integrity": "sha512-gFvwDoMOLHsWGCQk+zuA9bBR76jNhNaUlhElnvAARllYosmwuYNh0AnLfXCs2+r8j6Oy0WxZs/cIsRmspiDtTQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-api-design-systems": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-rc.3.tgz", - "integrity": "sha512-Qg1yTPPzGF3EhlqcxIZeDVBxxvZzylGM6CTHg5cltGOSoFQ7+NJFE9Ktvk0gbVaFUyElFduCno9FvIfzxPlj8g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.8.0.tgz", + "integrity": "sha512-DgeQibnf0j9A22XsaMDl+JNrrP3TJYODh4+YNkKPds6m7rBYv89wloC7cNs2fFZphY87sfhF3B2Bckp3CeR7IQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-api-design-systems": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-rc.3.tgz", - "integrity": "sha512-T7MbfTSDqdHgSr+cSC6gcGIsiwK3NXmdo28ZUv6LWsgcWDj2zw2Jie+7rXQaDN3JFEL34M/BIcMLyvrG7gYN/Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.8.0.tgz", + "integrity": "sha512-a10UIWrV3GTOqugX83qvWZR/UjwQJffrVQ6OdD27GkhwXk0+58As551Hu5NW1W/BIgHHKlhsAmgndgE/jlz4Jg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-rc.3.tgz", - "integrity": "sha512-mUmxQVXPoemP2ak/77g/o8kpP2DNd1EDjteuyGHyw1EHk/t4xYPAP05rQ2DfIQ5yVHmxBKRDQ15kfVNEpfUfYQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.8.0.tgz", + "integrity": "sha512-eK7XRuGMxQKI3R13IWki1IRzoJ6kYTkOrg9bRGaw2JmsgHHFeXVBbYTABRDsYRLe0kG7LU4Kk8OaKSqmq/IuZw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-rc.3.tgz", - "integrity": "sha512-K2BaslenC4ouPyzOQSB7wQPSsIGKGIj4VfP4M9y3fJaX9dIi+z3kzYQV7NFhZHAnq6pVybIDA44FLHF/WLCxUg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.8.0.tgz", + "integrity": "sha512-YqcrODYnlsPBghJL6hlCMVhqdjHhCresL6SpO55eoYvFJGABtl+wgYjVN5Ddug9PAw/25c9vLpth4sYb0m9+oQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-3": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.8.0.tgz", + "integrity": "sha512-3oKgsXR/UmFwSXDsmM6eNObLy93VJZethhzp3bCC/Br83w8V/tkBNIXcWZs0xx2crqYDnROr20jy4Qtq6SqoCw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-asyncapi-3": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-rc.3.tgz", - "integrity": "sha512-xJezoi5d+RtV7sG9VRcfpbLlJwaR6GoJr2S8lbsnMUkk/B2vZGdRbA2Fc67REQIJTEfxXcU8T3+5m8j0WrG9Xw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.8.0.tgz", + "integrity": "sha512-HvK2+6dlD2Q7SMHbgsFXGpDL5uiCxu4N8oOXVuy1OeapoQRxzB0LZae/rKrXj/YDITc1xQ9cbQyTsEM+Hfa2bA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.8.0.tgz", + "integrity": "sha512-ekIRVp20kntmCabQKmsEoXp6LVAqCf1MJRU94tx+n9NfAL68OVYF/47qxP5IXRyPSapa18oAAUDm09qfAg/8Uw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-asyncapi-3": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-rc.3.tgz", - "integrity": "sha512-Y0dfIYvQE+OLjormlx6RjmA6ymNA6+nkqJC/6qkFt+4fSjfOiXwbOOnfZp9pJXb2ssmDDdrPTFc3ninx5k7jNw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.8.0.tgz", + "integrity": "sha512-hlbtGgsnLumr5LHTxuJrc6d2uDGtbhEikVQGF7UHL2rMMmPBGCIASC1HbdmkFohXFf5I80s7TuMEnelvvGwxIQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-rc.3", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", + "@swagger-api/apidom-ast": "^1.8.0", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -17965,112 +19958,144 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-rc.3.tgz", - "integrity": "sha512-yaMS11FZVJLF062s+dch1kmUvBqdIS6mwAg/4XUL7XwSYat6pnV2ONCqdcUO9JSc9KJMZQiVAZjAZSj096ssNg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.8.0.tgz", + "integrity": "sha512-MnuhZKGzQC/MnLADuLyWZnpAcc5Vw9UoUctEkVovADSMfuHKDHg3sCNc2cB1cOB+BjWrWU4L/Vys8TUfS4866g==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-rc.3.tgz", - "integrity": "sha512-5OdImG3eEgYpFvSo0EiZVvJJahk+f6cm5WZNn9lVdRlmxmtpzKM3UNfIYcBgVcAcLvfi8g6G7xRzD1DshaS8sw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.8.0.tgz", + "integrity": "sha512-mjhDbnW2MkgZ5C2iJgMPZvvOL3MLYkwwwwjGekiCo0IjcWMBUdJ6ArOS3zOjQ5NMbKu1XbYmt4/D53fFLIFcwA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-rc.3.tgz", - "integrity": "sha512-UWlH29DOqKfHF2zwv7r5b7pgrc7Yxdus7FjYWA8p8yoIB02xDwHBaH4KhccIAXkm1qNMo+4TwSKFvO/boE8LMA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.8.0.tgz", + "integrity": "sha512-nA9AQuGsd1YqZ9QG8CRW0f4YHU9ryY+uU8nevprSiRuAi1FQJPrS30eUgnEs7x1Em7QKU43QmSZmWYpyJCdQZA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-2": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.8.0.tgz", + "integrity": "sha512-FC/Ktls4mNKY2MtHNmpPHXk5c6sD21dcaHmGGQH+wdovBlei3/xCiWOjYeT+Pr6A1mvMIG5cRhBjra3l5Jdhgw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-rc.3.tgz", - "integrity": "sha512-kSWzmalm98ScImQHHtpTBDAIEzLsfE24Pe1IIJP1TaI2rk1AuxzaCsqMl6NQIlnIEawghPOXlG0hLsgtswn/Jg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.8.0.tgz", + "integrity": "sha512-GAc2Ckr5FXvNm8Deh/NnUdQzcqhns/hxysYI9tikhxc14y1rytzmX81ATpVnKouHkZqXXNgDYhoFVG5+QFJYdg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-rc.3.tgz", - "integrity": "sha512-IRxjOgmGpaA1ay/NITOqk3TKTXnGiJtNP8KsPm//i+HkGcg87lZEvRDflB2Z70aRofKncXM2rCMAEqFqV7A9ug==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.8.0.tgz", + "integrity": "sha512-f9AFCXgdqA1xbUrTCcQ0NqarQqBhpw79M5rmhu5R51pHtaVx9N+FxlHMqGYsdL9/Opq3eKtsd0in0JBC77qZEQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-rc.3.tgz", - "integrity": "sha512-uvDMPiKt7uZSAOUVe+q/AygTFXw1odxxu5mi5voQM3/0KbR/vlt8f1dO9sQkys+G6ped2nL4r8B0p6bXR8uAMQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.8.0.tgz", + "integrity": "sha512-zmWJAspilTYZm6ZtpQJ65U1S+d+wOk6Wwi3TJkRmNDIygmY3jrBEpS65Lrc6D/Mk1bwsKyZN095cXAxCPajt8g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.8.0.tgz", + "integrity": "sha512-V6Q48ihqpX/IJ98MF9DUpwhGUzN+ZKLQEQm8M7He51geAsKillxDSHOFltdH38BCGW+CpbkEWnWRmzgV4ehjIA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.3", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-rc.3.tgz", - "integrity": "sha512-IiLIw74NRpRwi2YkV1hzmHC5JvvAm/TdeVYZoYK0QxeT2Ozr6MvhnUnRFjjSL3wcmku9+rLz2d8EGL2kO46qRA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.8.0.tgz", + "integrity": "sha512-uUhXEXwK4G3cVO52cTzoJG6Sbke8pgEFXHK+LMIXTZ0zb3gVfGD4N9bDyGB8Uibr41fK3DjUycIx5x9ZsR8l+Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-rc.3", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", + "@swagger-api/apidom-ast": "^1.8.0", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", @@ -18112,63 +20137,79 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-rc.3.tgz", - "integrity": "sha512-xZ9B6lGpdlHGSZGEhYe/MAyULCN4d+w4LKK5P1C/i6W6AU4iDEMjMjSawRV9ptJcObnu9ArEe92rgI7XS6s0TQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.8.0.tgz", + "integrity": "sha512-TnNqXiWMXgzS3uDm8KYdgJ+O+w2TAcGrQpmdQot2XlDw5pxxzmH22A0xgdmvv/XYB9BBMBPzmxaI/MPiF9i8kg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-rc.3", - "@swagger-api/apidom-error": "^1.0.0-rc.3", + "@swagger-api/apidom-core": "^1.8.0", + "@swagger-api/apidom-error": "^1.8.0", "@types/ramda": "~0.30.0", "axios": "^1.12.2", - "minimatch": "^7.4.3", - "process": "^0.11.10", + "minimatch": "^10.2.1", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-json-pointer": "^1.0.0-rc.0", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-rc.0", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-rc.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-rc.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-rc.0" + "@swagger-api/apidom-json-pointer": "^1.8.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.8.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.8.0", + "@swagger-api/apidom-ns-openapi-2": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.8.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.8.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.8.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.8.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.8.0", + "@swagger-api/apidom-parser-adapter-json": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.8.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.8.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.8.0" + } + }, + "node_modules/@swagger-api/apidom-reference/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@swagger-api/apidom-reference/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "license": "ISC", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -18202,13 +20243,12 @@ "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", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -18401,15 +20441,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 +20528,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.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", "license": "MIT" }, "node_modules/@types/mdast": { @@ -18533,9 +20564,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.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -18558,22 +20589,16 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "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==", - "license": "MIT" - }, "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", "license": "MIT" }, "node_modules/@types/ramda": { @@ -18586,9 +20611,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.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -19502,6 +21527,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 +21551,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", @@ -19595,48 +21666,61 @@ "node": ">=16" } }, - "node_modules/@wry/caches": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", - "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/@wry/context": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", - "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", + "node_modules/@whatwg-node/fetch": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz", + "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@whatwg-node/node-fetch": "^0.8.3", + "urlpattern-polyfill": "^10.0.0" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/@wry/equality": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", - "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", + "node_modules/@whatwg-node/node-fetch": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.5.tgz", + "integrity": "sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/@wry/trie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", - "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "tslib": "^2.6.3" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -19761,28 +21845,10 @@ "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", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -19812,45 +21878,45 @@ } }, "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", "dev": true, "license": "MIT", "peerDependencies": { - "ajv": ">=5.0.0" + "ajv": "^8.0.1" } }, "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.50.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.50.1.tgz", + "integrity": "sha512-/bwdue1/8LWELn/DBalGRfuLsXBLXULJo/yOeavJtDu8rBwxIzC6/Rz9Jg19S21VkJvRuZO1k8CZXBMS73mYbA==", "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.16.1", + "@algolia/client-abtesting": "5.50.1", + "@algolia/client-analytics": "5.50.1", + "@algolia/client-common": "5.50.1", + "@algolia/client-insights": "5.50.1", + "@algolia/client-personalization": "5.50.1", + "@algolia/client-query-suggestions": "5.50.1", + "@algolia/client-search": "5.50.1", + "@algolia/ingestion": "1.50.1", + "@algolia/monitoring": "1.50.1", + "@algolia/recommend": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" }, "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.28.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.1.tgz", + "integrity": "sha512-6iXpbkkrAI5HFpCWXlNmIDSBuoN/U1XnEvb2yJAoWfqrZ+DrybI7MQ5P5mthFaprmocq+zbi6HxnR28xnZAYBw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -19968,16 +22034,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 +22290,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.18.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.1.tgz", + "integrity": "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", - "@astrojs/internal-helpers": "0.7.5", - "@astrojs/markdown-remark": "6.3.9", + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/markdown-remark": "6.3.11", "@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 +22309,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", + "esbuild": "^0.27.3", "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 +22333,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 +22356,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": { @@ -20319,6 +22375,422 @@ "sharp": "^0.34.0" } }, + "node_modules/astro/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/astro/node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -20348,15 +22820,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/" @@ -20377,18 +22849,53 @@ "node": ">=8" } }, + "node_modules/astro/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/astro/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "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" - }, "node_modules/astro/node_modules/p-limit": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", @@ -20433,9 +22940,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 +22958,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 +22983,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 +23004,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", @@ -20618,6 +23125,19 @@ "node": ">=8.0.0" } }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/autolinker": { "version": "3.16.2", "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", @@ -20628,9 +23148,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "funding": [ { "type": "opencollective", @@ -20645,12 +23165,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -20680,13 +23198,13 @@ } }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -20869,12 +23387,15 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.31", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", - "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", + "version": "2.10.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.16.tgz", + "integrity": "sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/bcp-47-match": { @@ -21070,19 +23591,10 @@ "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", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -21099,11 +23611,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -21184,9 +23696,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 +23745,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" }, @@ -21333,6 +23844,17 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -21355,9 +23877,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001757", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", - "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", "funding": [ { "type": "opencollective", @@ -21374,6 +23896,18 @@ ], "license": "CC-BY-4.0" }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -21427,6 +23961,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -21741,12 +24315,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/client-only": { "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", @@ -21764,7 +24347,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -21778,15 +24360,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -21796,7 +24376,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21811,7 +24390,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -21824,15 +24402,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", @@ -21934,6 +24503,16 @@ "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "license": "ISC" }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -21993,6 +24572,18 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -22000,12 +24591,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": { @@ -22024,9 +24619,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", - "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", + "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -22082,6 +24677,19 @@ "node-fetch": "^2.7.0" } }, + "node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -22221,6 +24829,16 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -22291,6 +24909,19 @@ "node": "*" } }, + "node_modules/debounce": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", + "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -22506,6 +25137,16 @@ "node": ">= 0.8" } }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -22586,9 +25227,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 +25245,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 +25252,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" @@ -22749,9 +25384,9 @@ } }, "node_modules/dompurify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", - "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -22839,9 +25474,9 @@ "peer": true }, "node_modules/electron-to-chromium": { - "version": "1.5.260", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz", - "integrity": "sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==", + "version": "1.5.334", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz", + "integrity": "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==", "license": "ISC" }, "node_modules/elliptic": { @@ -22930,6 +25565,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -23559,14 +26204,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 +26752,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 +26861,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 +27003,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" }, @@ -24523,6 +27159,30 @@ "walk-up-path": "^4.0.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -24662,22 +27322,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 +27367,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": { @@ -24814,16 +27468,28 @@ "node": ">=18.3.0" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -24911,6 +27577,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fuse.js": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.3.0.tgz", + "integrity": "sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -24940,9 +27619,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "license": "MIT", "engines": { "node": ">=18" @@ -25231,18 +27910,103 @@ "license": "MIT" }, "node_modules/graphql": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", - "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", - "peer": true, + "version": "16.13.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, + "node_modules/graphql-config": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.6.tgz", + "integrity": "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^9.0.0", + "@graphql-tools/utils": "^11.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^2.0.0", + "minimatch": "^10.0.0", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/graphql-config/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/graphql-config/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graphql-request": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-7.4.0.tgz", + "integrity": "sha512-xfr+zFb/QYbs4l4ty0dltqiXIp07U6sl+tOKAb0t50/EnQek6CVVBLjETXi+FghElytvgaAWtIOt3EV7zLzIAQ==", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0" + }, + "peerDependencies": { + "graphql": "14 - 16" + } + }, "node_modules/graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -25253,10 +28017,37 @@ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/graphql-ws": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.8.tgz", + "integrity": "sha512-m3EOaNsUBXwAnkBWbzPfe0Nq8pXUfxsWnolC54sru3FzHvhTZL0Ouf/BoQsaGAXqM+YPerXOJ47BUnmgmoupCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fastify/websocket": "^10 || ^11", + "crossws": "~0.3", + "graphql": "^15.10.1 || ^16", + "ws": "^8" + }, + "peerDependenciesMeta": { + "@fastify/websocket": { + "optional": true + }, + "crossws": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, "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,16 +28055,16 @@ "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" } }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25847,6 +28638,17 @@ "he": "bin/he" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -25937,19 +28739,6 @@ "node": "*" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/htm": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", @@ -26087,6 +28876,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", @@ -26182,6 +28980,19 @@ "node": ">=4" } }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -26253,13 +29064,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.23.0", + "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.23.0.tgz", + "integrity": "sha512-ILqp/RAm0mBrsFuGozTk09tPpQMiODtcLVHQRudXBC23YcaTpt9qTB30nWy5yHODb15dBH5DoUw7gqyUo/PPkw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.27.6", - "ai": "^5.0.18", + "@swc/helpers": "0.5.18", "markdown-to-jsx": "^7.7.15", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" @@ -26275,23 +29085,23 @@ } }, "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.93.0", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.93.0.tgz", + "integrity": "sha512-pTJN2ZPpySSpnTxbPo0f/l7IDjgvC/IoxRXgnQV2TT423uGXviEkzQuU2KcdfG9kio6nqcgBU3kQTe07OoHzkw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1", + "@swc/helpers": "0.5.18", "@types/dom-speech-recognition": "^0.0.1", "@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.28.1", "hogan.js": "^3.0.2", "htm": "^3.0.0", - "instantsearch-ui-components": "0.15.0", + "instantsearch-ui-components": "0.23.0", "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", @@ -26343,6 +29153,20 @@ "url": "https://github.com/sponsors/brc-dd" } }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -26695,6 +29519,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", + "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -26788,6 +29622,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -26891,6 +29738,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", + "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -26982,6 +29865,22 @@ "ws": "*" } }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -30502,12 +33401,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", @@ -30528,6 +33421,20 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -30621,9 +33528,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.88.1", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.88.1.tgz", + "integrity": "sha512-tpy5o7zu1MjawVkLPuahymVJekYY3kYjvzcoInhIchgePxTlo+api90tBv2KfhAIe5uXh+mez1tAfmbv8/TiZg==", "dev": true, "funding": [ { @@ -30641,13 +33548,14 @@ "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", - "js-yaml": "^4.1.1", "minimist": "^1.2.8", - "oxc-resolver": "^11.13.2", + "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", + "unbash": "^2.2.0", + "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { @@ -31015,9 +33923,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.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -31040,6 +33948,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.startcase": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", @@ -31060,6 +33975,23 @@ "dev": true, "license": "MIT" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -31211,6 +34143,16 @@ "tslib": "^2.0.3" } }, + "node_modules/lower-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", + "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -31239,12 +34181,12 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz", + "integrity": "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, "node_modules/lucide-react": { @@ -31323,6 +34265,16 @@ "tmpl": "1.0.5" } }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -31776,6 +34728,24 @@ "node": ">= 8" } }, + "node_modules/meros": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz", + "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "@types/node": ">=13" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/metro": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", @@ -33082,10 +36052,10 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -33136,6 +36106,16 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -33238,13 +36218,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 +36272,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 +36296,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -33364,9 +36341,9 @@ "license": "MIT" }, "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.6.0.tgz", + "integrity": "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==", "license": "MIT", "optional": true, "engines": { @@ -33464,15 +36441,15 @@ "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": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", "license": "MIT" }, "node_modules/nopt": { @@ -33499,15 +36476,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", @@ -33594,7 +36562,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" @@ -33843,17 +36810,6 @@ "dev": true, "license": "MIT" }, - "node_modules/optimism": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.1.tgz", - "integrity": "sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==", - "dependencies": { - "@wry/caches": "^1.0.0", - "@wry/context": "^0.7.0", - "@wry/trie": "^0.5.0", - "tslib": "^2.3.0" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -33906,34 +36862,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.19.1", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.19.1.tgz", + "integrity": "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==", "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.19.1", + "@oxc-resolver/binding-android-arm64": "11.19.1", + "@oxc-resolver/binding-darwin-arm64": "11.19.1", + "@oxc-resolver/binding-darwin-x64": "11.19.1", + "@oxc-resolver/binding-freebsd-x64": "11.19.1", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", + "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", + "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", + "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", + "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", + "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", + "@oxc-resolver/binding-linux-x64-musl": "11.19.1", + "@oxc-resolver/binding-openharmony-arm64": "11.19.1", + "@oxc-resolver/binding-wasm32-wasi": "11.19.1", + "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", + "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", + "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "node_modules/p-cancelable": { @@ -33968,15 +36925,15 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.2.1" }, "engines": { - "node": ">=6" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -33994,6 +36951,21 @@ "node": ">=8" } }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -34093,6 +37065,17 @@ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -34130,6 +37113,21 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -34195,6 +37193,17 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/patch-package": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", @@ -34379,6 +37388,17 @@ "node": ">= 6" } }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -34412,6 +37432,29 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -34543,21 +37586,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 +37610,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 +37849,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.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", "license": "MIT", "funding": { "type": "opencollective", @@ -34825,9 +37878,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 +37894,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": { @@ -34868,34 +37921,6 @@ "node": "^14.15.0 || >=16.0.0" } }, - "node_modules/prettier-plugin-solidity": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.3.tgz", - "integrity": "sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==", - "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.20.1", - "semver": "^7.7.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "prettier": ">=2.3.0" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -34931,15 +37956,6 @@ "node": ">=6" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-warning": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", @@ -35179,10 +38195,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.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { "node": ">=0.6" }, @@ -35497,15 +38516,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.29.0", + "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.29.0.tgz", + "integrity": "sha512-+foJJVVsSLNY3K5rkB2dGEUoOyLMGTZsl9I8Zwwf/nZQqwoqH0QIvkenlJh7deyAq1/u19bq+H5EVX2d+EjRJQ==", "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" + "@swc/helpers": "0.5.18", + "instantsearch-ui-components": "0.23.0", + "instantsearch.js": "4.93.0", + "react-instantsearch-core": "7.29.0" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6", @@ -35514,15 +38533,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.29.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.29.0.tgz", + "integrity": "sha512-iE7mciz4bE1qHjWzSirPSxQMCnEuCxVL0KSZ63mlB0esDv1ALlY8B9zJMYVWny73RKCnWgi2HXcwandFWvJPRg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.27.6", - "ai": "^5.0.18", - "algoliasearch-helper": "3.26.1", - "instantsearch.js": "4.84.0", + "@swc/helpers": "0.5.18", + "algoliasearch-helper": "3.28.1", + "instantsearch.js": "4.93.0", "use-sync-external-store": "^1.0.0", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" @@ -36010,9 +39028,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" @@ -36096,23 +39114,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rehackt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", - "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", - "peerDependencies": { - "@types/react": "*", - "react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - } - } - }, "node_modules/rehype": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", @@ -36457,6 +39458,30 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "dev": true, + "license": "MIT" + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -36612,12 +39637,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", @@ -36970,8 +39989,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/search-insights": { "version": "2.17.3", @@ -37118,6 +40136,18 @@ "node": ">= 0.8" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/serialize-error": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", @@ -37336,7 +40366,6 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -37345,17 +40374,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 +40403,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 +40422,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 +40438,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 +40456,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", @@ -37474,28 +40499,37 @@ "license": "MIT" }, "node_modules/sitemap": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.2.tgz", - "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", "license": "MIT", "dependencies": { - "@types/node": "^17.0.5", + "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { - "sitemap": "dist/cli.js" + "sitemap": "dist/esm/cli.js" }, "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": ">=20.19.5", + "npm": ">=10.8.2" } }, "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/sitemap/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/slash": { @@ -37538,9 +40572,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,23 +40600,22 @@ "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.2.1", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.2.1.tgz", + "integrity": "sha512-+VHSa84CRjm2s+KZWYxIDnI+NokcLsZHOSpRtg5nBFmnVfh6RPmPaFd5TN922Cfrm2i85kNoQtLiapALe26b5w==", "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", + "ajv": "^8.18.0", + "ajv-errors": "^3.0.0", "ast-parents": "^0.0.1", "better-ajv-errors": "^2.0.2", "chalk": "^4.1.2", "commander": "^10.0.0", "cosmiconfig": "^8.0.0", "fast-diff": "^1.2.0", - "glob": "^8.0.3", + "glob": "^13.0.6", "ignore": "^5.2.4", "js-yaml": "^4.1.0", "latest-version": "^7.0.0", @@ -37595,8 +40628,11 @@ "bin": { "solhint": "solhint.js" }, + "engines": { + "node": ">=20" + }, "optionalDependencies": { - "prettier": "^2.8.3" + "prettier": "^3.0.0" } }, "node_modules/solhint-plugin-chainlink-solidity": { @@ -37605,45 +40641,27 @@ "resolved": "git+ssh://git@github.com/smartcontractkit/chainlink-solhint-rules.git#2f0a3a6c3475607bb0cf8ab1a1df979534453ba9", "dev": true }, - "node_modules/solhint-plugin-prettier": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.1.0.tgz", - "integrity": "sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw==", - "dev": true, - "dependencies": { - "@prettier/sync": "^0.3.0", - "prettier-linter-helpers": "^1.0.0" - }, - "peerDependencies": { - "prettier": "^3.0.0", - "prettier-plugin-solidity": "^1.0.0" - } - }, - "node_modules/solhint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/solhint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/solhint/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/solhint/node_modules/commander": { @@ -37657,61 +40675,54 @@ } }, "node_modules/solhint/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=12" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solhint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, "node_modules/solhint/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solhint/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/solhint/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "prettier": "bin-prettier.js" + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=10.13.0" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/solhint/node_modules/semver": { @@ -37816,6 +40827,16 @@ "node": ">= 10.x" } }, + "node_modules/sponge-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", + "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -37931,7 +40952,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" } @@ -37955,6 +40975,13 @@ "node": ">=0.6.19" } }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true, + "license": "MIT" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -38199,7 +41226,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" }, @@ -38325,18 +41351,19 @@ } }, "node_modules/swagger-client": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.36.0.tgz", - "integrity": "sha512-9fkjxGHXuKy20jj8zwE6RwgFSOGKAyOD5U7aKgW/+/futtHZHOdZeqiEkb97sptk2rdBv7FEiUQDNlWZR186RA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.37.1.tgz", + "integrity": "sha512-WCRU7wfyqTyB0vOpVK1vHFm4aCqnmqcXycDcWVmHa784Nd4cABaQeSITtjWMOnjJoIkTqG8TLArYn4SAv+wj2w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", "@scarf/scarf": "=1.4.0", - "@swagger-api/apidom-core": "^1.0.0-rc.1", - "@swagger-api/apidom-error": "^1.0.0-rc.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-rc.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-rc.1", - "@swagger-api/apidom-reference": "^1.0.0-rc.1", + "@swagger-api/apidom-core": "^1.7.0", + "@swagger-api/apidom-error": "^1.7.0", + "@swagger-api/apidom-json-pointer": "^1.7.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.7.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.7.0", + "@swagger-api/apidom-reference": "^1.7.0", "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", @@ -38351,18 +41378,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.32.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.32.2.tgz", + "integrity": "sha512-t6Ns52nS8LU2hqi0+rezMjFO1ZrCsCrnommXrU7Nfrg2va2dWahdvM6TuSwzdHpG29v6BHJyU1c/UWFhgVZzVQ==", "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.32.2", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.32.2.tgz", + "integrity": "sha512-7MFN2c3urrqnDiB3n2C7cx2xddzp/DraOufpM5hIa61RhpIY/odFUY6TZsy5xhQwkRMHG04a7aU2d6rOXqWZEA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", @@ -38372,12 +41399,12 @@ "classnames": "^2.5.1", "css.escape": "1.5.1", "deep-extend": "0.6.0", - "dompurify": "=3.2.6", + "dompurify": "^3.3.2", "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", - "js-yaml": "=4.1.0", - "lodash": "^4.17.21", + "js-yaml": "=4.1.1", + "lodash": "^4.18.1", "prop-types": "^15.8.1", "randexp": "^0.5.3", "randombytes": "^2.1.0", @@ -38394,7 +41421,7 @@ "reselect": "^5.1.1", "serialize-error": "^8.1.0", "sha.js": "^2.4.12", - "swagger-client": "^3.36.0", + "swagger-client": "^3.37.1", "url-parse": "^1.5.10", "xml": "=1.0.1", "xml-but-prettier": "^1.0.1", @@ -38405,39 +41432,54 @@ "react-dom": ">=16.8.0 <20" } }, - "node_modules/swagger-ui-react/node_modules/dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" + "node_modules/swap-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", + "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" } }, - "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==", + "node_modules/sync-fetch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0.tgz", + "integrity": "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==", + "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=18" } }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "node_modules/sync-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, "engines": { - "node": ">=0.10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "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 +41493,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": { @@ -38537,33 +41579,33 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", - "chokidar": "^3.6.0", + "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.3.2", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", @@ -38582,19 +41624,6 @@ "tailwindcss": ">=3.0.0 || insiders" } }, - "node_modules/tailwindcss/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==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tailwindcss/node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -38604,32 +41633,13 @@ "jiti": "bin/jiti.js" } }, - "node_modules/tailwindcss/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" } }, "node_modules/tar": { @@ -38806,6 +41816,16 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, + "node_modules/timeout-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", + "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", @@ -38872,6 +41892,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -39011,31 +42041,20 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, - "node_modules/ts-invariant": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", - "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, "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.9", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", + "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.3", + "semver": "^7.7.4", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -39052,7 +42071,7 @@ "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" + "typescript": ">=4.3 <7" }, "peerDependenciesMeta": { "@babel/core": { @@ -39076,9 +42095,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -39088,6 +42107,13 @@ "node": ">=10" } }, + "node_modules/ts-log": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", + "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==", + "dev": true, + "license": "MIT" + }, "node_modules/ts-mixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", @@ -39175,13 +42201,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 +42220,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 +42818,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": { @@ -39359,6 +42843,16 @@ "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", "license": "MIT" }, + "node_modules/unbash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unbash/-/unbash-2.2.0.tgz", + "integrity": "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -39378,6 +42872,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/uncrypto": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", @@ -39385,35 +42889,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 +42914,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 +43030,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", @@ -39602,6 +43080,32 @@ "node": ">= 4.0.0" } }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -39655,9 +43159,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -39684,6 +43188,26 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -39703,6 +43227,13 @@ "requires-port": "^1.0.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -40104,6 +43635,16 @@ "license": "MIT", "peer": true }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -40389,9 +43930,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.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -40444,7 +43985,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -40456,15 +43996,18 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -40472,7 +44015,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -40499,15 +44041,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -40517,7 +44057,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -40566,17 +44105,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "node_modules/zen-observable-ts": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", - "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", - "dependencies": { - "zen-observable": "0.8.15" + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zenscroll": { @@ -40595,9 +44134,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..bf0e27bc2fe 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", @@ -20,6 +20,7 @@ "fetch-selectors": "npx tsx --require tsconfig-paths/register src/scripts/ccip/fetch-selectors.ts", "detect-new-tokens": "npx tsx --require tsconfig-paths/register src/scripts/ccip/detect-new-tokens.ts", "generate-token-report": "npx tsx --require tsconfig-paths/register src/scripts/ccip/generate-token-report.ts", + "graphql:schema": "graphql-codegen --config codegen.ts && prettier --write src/lib/ccip/graphql/__generated__/ src/lib/ccip/graphql/schema.graphql.json", "detect-new-data": "npx tsx --require tsconfig-paths/register src/scripts/data/detect-new-data.ts", "detect-trailing-slash-links": "tsx --require tsconfig-paths/register scripts/detect-trailing-slash-links.ts", "fix-trailing-slash-links": "tsx --require tsconfig-paths/register scripts/fix-trailing-slash-links.ts", @@ -55,18 +56,16 @@ }, "dependencies": { "@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", - "@astrojs/partytown": "^2.1.4", + "@astro-community/astro-embed-youtube": "^0.5.10", + "@astrojs/mdx": "^4.3.14", + "@astrojs/partytown": "^2.1.6", "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", + "@astrojs/sitemap": "^3.7.2", "@astrojs/tailwind": "^6.0.2", - "@chainlink/blocks": "^1.3.1", "@astrojs/vercel": "^8.2.11", + "@chainlink/blocks": "^1.3.4", "@chainlink/cl-search-frontend": "^0.12.1", "@chainlink/components": "^0.4.18", "@chainlink/contracts": "1.5.0", @@ -76,57 +75,66 @@ "@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", + "@openzeppelin/contracts": "5.6.1", + "@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.101.1", + "astro": "^5.18.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", + "fuse.js": "^7.3.0", "github-slugger": "^2.0.0", - "lodash": "^4.17.21", + "graphql": "^16.13.2", + "graphql-request": "^7.4.0", + "lodash": "^4.18.1", + "lru-cache": "^11.3.3", "marked": "^15.0.12", "nanostores": "^0.11.4", + "next": "14.2.35", + "p-limit": "^7.3.0", "pino": "^9.14.0", - "preact": "^10.27.2", - "react-instantsearch": "^7.20.0", + "preact": "^10.29.1", + "react-instantsearch": "^7.29.0", "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.32.2", + "swagger-ui-react": "^5.32.2", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.1", + "@graphql-codegen/cli": "^6.2.1", + "@graphql-codegen/client-preset": "^5.2.4", + "@graphql-codegen/introspection": "^5.0.1", "@jest/globals": "^29.7.0", "@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.24", + "@types/node": "^20.19.39", "@types/node-fetch": "^2.6.13", - "@types/prismjs": "^1.26.5", - "@types/react": "^19.2.7", + "@types/prismjs": "^1.26.6", + "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/swagger-ui-dist": "^3.30.6", "@types/swagger-ui-react": "^5.18.0", @@ -137,31 +145,28 @@ "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.88.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.2.1", "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.9", "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..f0987066527 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.16.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": { @@ -101,6 +101,35 @@ "default": "false" }, "description": "When set to 'true', returns detailed fee token information including addresses, names, and decimals instead of just symbol strings" + }, + { + "name": "search", + "in": "query", + "schema": { + "type": "string", + "maxLength": 100 + }, + "description": "Unified search query. Automatically detects query type: selector (>17 digits), chainId (≤17 digits or Solana base58 hash), internalId (kebab-case), or displayName (fuzzy text search). Cannot be combined with chainId, selector, or internalId filters.", + "example": "ethereum" + }, + { + "name": "family", + "in": "query", + "schema": { + "type": "string", + "enum": ["evm", "solana", "aptos", "sui", "tron", "canton", "ton", "stellar", "starknet"] + }, + "description": "Filter results by chain family. Only effective when using the search parameter." + }, + { + "name": "internalIdFormat", + "in": "query", + "schema": { + "type": "string", + "enum": ["directory", "selector"], + "default": "selector" + }, + "description": "Format for internal IDs in the response. 'selector' uses canonical selector names (e.g., 'ethereum-mainnet'), 'directory' uses chains.json keys (e.g., 'mainnet'). Only applies when outputKey=internalId." } ], "responses": { @@ -136,10 +165,11 @@ "tokenAdminRegistry": "0xb22764f98dD05c789929716D677382Df22C05Cb6", "tokenPoolFactory": "0x17D8a409fE2ceF2d3808bcB61F14aBEFfc28876e", "chainType": "evm", - "chainFamily": "evm" + "chainFamily": "evm", + "supported": true } }, - "svm": { + "solana": { "solana-devnet": { "chainId": "solana-devnet", "displayName": "Solana Devnet", @@ -150,7 +180,52 @@ "rmn": "CRmNVnB7S6SqEPFG6m9dVp9fJJCjr3TC2TiAWB3RqNod", "feeQuoter": "FqbCVbS7a4ndxs9xZ8UmfL6LQsUhAJNkWxW3duJRrCWD", "chainType": "solana", - "chainFamily": "svm" + "chainFamily": "solana", + "supported": true + } + } + }, + "ignored": [] + } + }, + "search": { + "summary": "Search response (includes both supported and unsupported chains)", + "value": { + "metadata": { + "environment": "testnet", + "timestamp": "2024-03-14T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "ignoredChainCount": 0, + "validChainCount": 2, + "searchQuery": "solana", + "searchType": "displayName" + }, + "data": { + "solana": { + "solana-devnet": { + "chainId": "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG", + "displayName": "Solana Devnet", + "selector": "16015286601757825753", + "internalId": "solana-devnet", + "feeTokens": ["LINK", "SOL"], + "router": "CCiPv7hcmEqNdMdJgmHDJmEJyCkBgLqxmcf87R1Gho6H", + "rmn": "CRmNVnB7S6SqEPFG6m9dVp9fJJCjr3TC2TiAWB3RqNod", + "feeQuoter": "FqbCVbS7a4ndxs9xZ8UmfL6LQsUhAJNkWxW3duJRrCWD", + "chainType": "solana", + "chainFamily": "solana", + "supported": true + }, + "solana-testnet": { + "chainId": "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z", + "displayName": "Solana Testnet", + "selector": "6302590918974934319", + "internalId": "solana-testnet", + "feeTokens": [], + "router": "", + "rmn": "", + "chainType": "solana", + "chainFamily": "solana", + "supported": false } } }, @@ -200,7 +275,8 @@ "tokenAdminRegistry": "0xb22764f98dD05c789929716D677382Df22C05Cb6", "tokenPoolFactory": "0x17D8a409fE2ceF2d3808bcB61F14aBEFfc28876e", "chainType": "evm", - "chainFamily": "evm" + "chainFamily": "evm", + "supported": true } } }, @@ -278,6 +354,16 @@ "default": "chainId" }, "description": "Key to use for organizing the response data" + }, + { + "name": "internalIdFormat", + "in": "query", + "schema": { + "type": "string", + "enum": ["directory", "selector"], + "default": "selector" + }, + "description": "Format for internal IDs in the response. 'selector' uses canonical selector names (e.g., 'ethereum-mainnet'), 'directory' uses chains.json keys (e.g., 'mainnet'). Only applies when outputKey=internalId." } ], "responses": { @@ -361,6 +447,474 @@ } } }, + "/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": "outputKey", + "in": "query", + "schema": { + "type": "string", + "enum": ["chainId", "selector", "internalId"], + "default": "chainId" + }, + "description": "Key to use for organizing the response data by chain" + }, + { + "name": "internalIdFormat", + "in": "query", + "schema": { + "type": "string", + "enum": ["directory", "selector"], + "default": "selector" + }, + "description": "Format for internal IDs in the response. 'selector' uses canonical selector names (e.g., 'ethereum-mainnet'), 'directory' uses chains.json keys (e.g., 'mainnet'). Only applies when outputKey=internalId." + } + ], + "responses": { + "200": { + "description": "Successful response with token detail data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenDetailApiResponse" + }, + "examples": { + "v2Pool": { + "summary": "v2.0 pool (BETS) with CCV features enabled", + "description": "For v2.0+ pools (supportsV2Features=true), ccvConfig contains thresholdAmount and customFinality shows block confirmation settings. Different chains may show different scenarios: customFinality enabled (minBlockConfirmation > 0), disabled (minBlockConfirmation = 0), or downstream API error (both null).", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "tokenSymbol": "BETS", + "chainCount": 3 + }, + "data": { + "1": { + "chainId": 1, + "chainName": "Ethereum", + "decimals": 18, + "destinations": ["56", "137"], + "name": "BetSwirl Token", + "poolAddress": "0x1B7492C3bD23A4aDB448710e4275FF14A5288932", + "poolType": "lockRelease", + "symbol": "BETS", + "tokenAddress": "0x514910771AF9Ca656af840dff83E8264EcF986CA", + "customFinality": { + "hasCustomFinality": false, + "minBlockConfirmation": 0 + }, + "ccvConfig": { + "thresholdAmount": "10000000000000000000000" + }, + "pool": { + "address": "0x1B7492C3bD23A4aDB448710e4275FF14A5288932", + "rawType": "LockReleaseTokenPool", + "type": "lockRelease", + "version": "2.0.0", + "advancedPoolHooks": null, + "supportsV2Features": true + } + }, + "137": { + "chainId": 137, + "chainName": "Polygon", + "decimals": 18, + "destinations": ["1"], + "name": "BetSwirl Token", + "poolAddress": "0x5678...9ABC", + "poolType": "burnMint", + "symbol": "BETS", + "tokenAddress": "0xDEF0...1234", + "customFinality": { + "hasCustomFinality": true, + "minBlockConfirmation": 5 + }, + "ccvConfig": { + "thresholdAmount": "5000000000000000000000" + }, + "pool": { + "address": "0x5678...9ABC", + "rawType": "BurnMintTokenPool", + "type": "burnMint", + "version": "2.0.0", + "advancedPoolHooks": null, + "supportsV2Features": true + } + }, + "56": { + "chainId": 56, + "chainName": "BNB Smart Chain", + "decimals": 18, + "destinations": ["1"], + "name": "BetSwirl Token", + "poolAddress": "0xABCD...1234", + "poolType": "burnMint", + "symbol": "BETS", + "tokenAddress": "0x9876...FEDC", + "customFinality": { + "hasCustomFinality": null, + "minBlockConfirmation": null + }, + "ccvConfig": { + "thresholdAmount": null + }, + "pool": { + "address": "0xABCD...1234", + "rawType": "BurnMintTokenPool", + "type": "burnMint", + "version": "2.0.0", + "advancedPoolHooks": null, + "supportsV2Features": true + } + } + } + } + }, + "v1Pool": { + "summary": "v1.x pool (GHO) with CCV features not supported", + "description": "For v1.x pools (supportsV2Features=false), both ccvConfig and customFinality are null because these features are not supported by v1.x pools.", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "456e7890-e89b-12d3-a456-426614174000", + "tokenSymbol": "GHO", + "chainCount": 1 + }, + "data": { + "1": { + "chainId": 1, + "chainName": "Ethereum", + "decimals": 18, + "destinations": ["42161"], + "name": "Gho Token", + "poolAddress": "0xGHO1...5678", + "poolType": "lockRelease", + "symbol": "GHO", + "tokenAddress": "0x40D1...2C2f", + "customFinality": null, + "ccvConfig": null, + "pool": { + "address": "0xGHO1...5678", + "rawType": "LockReleaseTokenPool", + "type": "lockRelease", + "version": "1.6.0", + "advancedPoolHooks": null, + "supportsV2Features": false + } + } + } + } + } + } + } + } + }, + "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}/chains/{chain}": { + "get": { + "tags": ["tokens"], + "summary": "Retrieve token directory data for a specific chain", + "description": "Returns detailed token configuration for a specific chain, including pool information, CCV (Cross-Chain Verifier) configuration, and lane-specific verifiers and rate limits. This endpoint provides the data needed for cross-chain token transfer interfaces.", + "operationId": "getTokenDirectory", + "parameters": [ + { + "name": "tokenCanonicalSymbol", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The canonical symbol for the token (e.g., LINK, USDC, LBTC)", + "example": "LBTC" + }, + { + "name": "chain", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The source chain identifier (e.g., mainnet, ethereum-testnet-sepolia)", + "example": "mainnet" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + }, + { + "name": "outputKey", + "in": "query", + "schema": { + "type": "string", + "enum": ["chainId", "selector", "internalId"], + "default": "chainId" + }, + "description": "Key format to use for lane keys in the response" + }, + { + "name": "internalIdFormat", + "in": "query", + "schema": { + "type": "string", + "enum": ["directory", "selector"], + "default": "selector" + }, + "description": "Format for internalId values in the response. 'selector' uses canonical selector names (e.g., 'ethereum-mainnet'), 'directory' uses chains.json keys (e.g., 'mainnet')." + } + ], + "responses": { + "200": { + "description": "Successful response with token directory data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenDirectoryApiResponse" + }, + "examples": { + "v2Pool": { + "summary": "v2.0 pool (LBTC) with CCV features enabled", + "description": "For v2.0+ pools (supportsV2Features=true), ccvConfig contains thresholdAmount and verifiers include additional threshold verifiers in aboveThreshold array. customFinality shows block confirmation settings.", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "symbol": "LBTC", + "sourceChain": "ethereum-mainnet" + }, + "data": { + "internalId": "ethereum-mainnet", + "chainId": 1, + "selector": "5009297550715157269", + "token": { + "address": "0x8236a87084f8B84306f72007F36F2618A5634494", + "decimals": 8 + }, + "pool": { + "address": "0x88E18636EfFC3b3cd520FC72B710eb99C0017BC7", + "rawType": "BurnMintTokenPool", + "type": "burnMint", + "version": "2.0.0", + "advancedPoolHooks": null, + "supportsV2Features": true + }, + "ccvConfig": { + "thresholdAmount": "100000000000" + }, + "customFinality": { + "hasCustomFinality": true, + "minBlockConfirmation": 5 + }, + "outboundLanes": { + "8453": { + "internalId": "ethereum-mainnet-base-1", + "chainId": 8453, + "selector": "15971525489660198786", + "rateLimits": { + "standard": { + "capacity": "3490000000", + "rate": "323148", + "isEnabled": true + }, + "custom": { + "capacity": "6980000000", + "rate": "646296", + "isEnabled": true + } + }, + "fees": { + "standardTransferFeeBps": 10, + "customTransferFeeBps": 25 + }, + "verifiers": { + "belowThreshold": ["0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D"], + "aboveThreshold": [ + "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", + "0xF4c7E640EdA248ef95972845a62bdC74237805dB" + ] + } + } + }, + "inboundLanes": { + "8453": { + "internalId": "ethereum-mainnet-base-1", + "chainId": 8453, + "selector": "15971525489660198786", + "rateLimits": { + "standard": null, + "custom": null + }, + "fees": null, + "verifiers": { + "belowThreshold": ["0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D"], + "aboveThreshold": ["0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D"] + } + } + } + } + } + }, + "v1Pool": { + "summary": "v1.x pool (GHO) with CCV features not supported", + "description": "For v1.x pools (supportsV2Features=false), both ccvConfig and customFinality are null because these features are not supported. Verifiers in lanes are also null.", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "456e7890-e89b-12d3-a456-426614174000", + "symbol": "GHO", + "sourceChain": "ethereum-mainnet" + }, + "data": { + "internalId": "ethereum-mainnet", + "chainId": 1, + "selector": "5009297550715157269", + "token": { + "address": "0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f", + "decimals": 18 + }, + "pool": { + "address": "0xGhoPool123...", + "rawType": "LockReleaseTokenPool", + "type": "lockRelease", + "version": "1.6.0", + "advancedPoolHooks": null, + "supportsV2Features": false + }, + "ccvConfig": null, + "customFinality": null, + "outboundLanes": { + "42161": { + "internalId": "arbitrum-mainnet", + "chainId": 42161, + "selector": "4949039107694359620", + "rateLimits": { + "standard": { + "capacity": "5000000000000000000000", + "rate": "1670000000000000000", + "isEnabled": true + }, + "custom": null + }, + "fees": null, + "verifiers": null + } + }, + "inboundLanes": {} + } + } + } + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Token or chain not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "NOT_FOUND", + "message": "Token 'INVALID' not found on chain 'mainnet'" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/lanes": { "get": { "tags": ["lanes"], @@ -450,6 +1004,16 @@ "default": "chainId" }, "description": "Key format to use for organizing the lane keys in the response" + }, + { + "name": "internalIdFormat", + "in": "query", + "schema": { + "type": "string", + "enum": ["directory", "selector"], + "default": "selector" + }, + "description": "Format for internal IDs in the response. 'selector' uses canonical selector names (e.g., 'ethereum-mainnet'), 'directory' uses chains.json keys (e.g., 'mainnet'). Only applies when outputKey=internalId." } ], "responses": { @@ -576,9 +1140,22 @@ "type": "integer", "minimum": 0, "description": "Number of valid chains in the response" + }, + "searchQuery": { + "type": "string", + "description": "The search query that was used (only present when search parameter was provided)" + }, + "searchType": { + "$ref": "#/components/schemas/SearchType", + "description": "The detected type of search query (only present when search parameter was provided)" } } }, + "SearchType": { + "type": "string", + "enum": ["selector", "chainId", "internalId", "displayName"], + "description": "The detected type of search query. 'selector' for CCIP selectors (>17 digits), 'chainId' for chain IDs (≤17 digits or Solana base58), 'internalId' for kebab-case identifiers, 'displayName' for fuzzy text search." + }, "FeeTokenEnriched": { "type": "object", "required": ["symbol", "name", "address", "decimals"], @@ -614,7 +1191,8 @@ "router", "rmn", "chainType", - "chainFamily" + "chainFamily", + "supported" ], "properties": { "chainId": { @@ -623,7 +1201,7 @@ }, "displayName": { "type": "string", - "description": "Human-readable name of the chain" + "description": "Human-readable name of the chain. For supported chains, this comes from configuration. For unsupported chains, it is derived from the internalId." }, "selector": { "type": "string", @@ -650,25 +1228,29 @@ "description": "Detailed fee token information (when enrichFeeTokens=true)" } ], - "description": "Fee tokens - either as string symbols or enriched objects with addresses" + "description": "Fee tokens - either as string symbols or enriched objects with addresses. Empty array for unsupported chains." }, "router": { "type": "string", - "description": "CCIP Router contract address" + "description": "CCIP Router contract address. Empty string for unsupported chains." }, "rmn": { "type": "string", - "description": "Risk Management Network contract address" + "description": "Risk Management Network contract address. Empty string for unsupported chains." }, "chainType": { "type": "string", - "enum": ["evm", "solana", "aptos"], + "enum": ["evm", "solana", "aptos", "sui", "canton", "ton", "tron", "stellar", "starknet"], "description": "Type of blockchain" }, "chainFamily": { "type": "string", - "enum": ["evm", "svm", "mvm"], - "description": "Blockchain family (EVM, Solana VM, Move VM)" + "enum": ["evm", "solana", "aptos", "sui", "tron", "canton", "ton", "stellar", "starknet"], + "description": "Blockchain family grouping" + }, + "supported": { + "type": "boolean", + "description": "Whether this chain is fully supported with complete configuration. Unsupported chains have minimal details (empty router, rmn, feeTokens)." }, "registryModule": { "type": "string", @@ -676,7 +1258,7 @@ }, "tokenAdminRegistry": { "type": "string", - "description": "Token Admin Registry contract address (EVM chains only)" + "description": "Token Admin Registry contract address (EVM and Aptos chains)" }, "tokenPoolFactory": { "type": "string", @@ -685,6 +1267,10 @@ "feeQuoter": { "type": "string", "description": "Fee Quoter address (Solana chains only)" + }, + "mcms": { + "type": "string", + "description": "MCMS (Multi-Chain Management Service) address (Aptos chains only)" } } }, @@ -730,19 +1316,61 @@ }, "description": "EVM chain details keyed by the specified output key" }, - "svm": { + "solana": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ChainDetails" + }, + "description": "Solana chain details keyed by the specified output key" + }, + "aptos": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ChainDetails" + }, + "description": "Aptos chain details keyed by the specified output key" + }, + "sui": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ChainDetails" + }, + "description": "Sui chain details keyed by the specified output key" + }, + "tron": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ChainDetails" + }, + "description": "Tron chain details keyed by the specified output key" + }, + "canton": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ChainDetails" + }, + "description": "Canton chain details keyed by the specified output key" + }, + "ton": { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/ChainDetails" }, - "description": "Solana VM chain details keyed by the specified output key" + "description": "TON chain details keyed by the specified output key" }, - "mvm": { + "stellar": { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/ChainDetails" }, - "description": "Move VM (Aptos) chain details keyed by the specified output key" + "description": "Stellar chain details keyed by the specified output key" + }, + "starknet": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ChainDetails" + }, + "description": "Starknet chain details keyed by the specified output key" } }, "description": "Chain details grouped by chain family" @@ -789,7 +1417,8 @@ }, "ChainInfo": { "type": "object", - "required": ["chainId", "displayName", "selector", "internalId", "chainType", "chainFamily"], + "description": "Chain information used in lane endpoints. Note: chainType and chainFamily are intentionally excluded from this schema for API responses.", + "required": ["chainId", "displayName", "selector", "internalId"], "properties": { "chainId": { "oneOf": [{ "type": "integer" }, { "type": "string" }], @@ -806,16 +1435,6 @@ "internalId": { "type": "string", "description": "Internal identifier used in configuration" - }, - "chainType": { - "type": "string", - "enum": ["evm", "solana", "aptos", "sui"], - "description": "Type of blockchain" - }, - "chainFamily": { - "type": "string", - "enum": ["evm", "mvm", "svm"], - "description": "Family of blockchain virtual machine" } } }, @@ -931,6 +1550,11 @@ "message": { "type": "string", "description": "Human-readable error message" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request, useful for debugging and support" } } }, @@ -989,7 +1613,7 @@ }, "poolType": { "type": "string", - "enum": ["lockRelease", "burnMint", "usdc", "feeTokenOnly"], + "enum": ["lockRelease", "burnMint", "usdc"], "description": "Type of pool for this token" }, "poolAddress": { @@ -1022,7 +1646,7 @@ }, "poolType": { "type": "string", - "enum": ["lockRelease", "burnMint", "usdc", "feeTokenOnly"], + "enum": ["lockRelease", "burnMint", "usdc"], "description": "Type of pool for this token" }, "poolAddress": { @@ -1046,6 +1670,108 @@ } } }, + "TokenDetailChainData": { + "type": "object", + "description": "Extended token chain data with custom finality and CCV information", + "allOf": [ + { + "$ref": "#/components/schemas/TokenChainData" + }, + { + "type": "object", + "properties": { + "customFinality": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/CustomFinalityConfig" }], + "description": "Custom finality configuration for v2.0+ pools. Null for v1.x pools (check pool.supportsV2Features). When present with hasCustomFinality=null and minBlockConfirmation=null, indicates downstream API error." + }, + "ccvConfig": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/CCVConfig" }], + "description": "CCV configuration for v2.0+ pools. Null for v1.x pools (check pool.supportsV2Features). When present with thresholdAmount=null, indicates downstream API error." + }, + "pool": { + "nullable": true, + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Pool contract address" + }, + "rawType": { + "type": "string", + "description": "Raw pool type from configuration (e.g., 'LockReleaseTokenPool', 'BurnMintTokenPool', 'USDCTokenPool')" + }, + "type": { + "type": "string", + "enum": ["lockRelease", "burnMint", "usdc"], + "description": "Normalized pool type" + }, + "version": { + "type": "string", + "description": "Pool contract version" + }, + "advancedPoolHooks": { + "type": "string", + "nullable": true, + "description": "Address of advanced pool hooks contract, or null if not configured" + }, + "supportsV2Features": { + "type": "boolean", + "description": "Whether this pool supports v2 features (customFinality, ccvConfig). When true and these fields have null values inside, it indicates a downstream API error rather than feature not supported." + } + }, + "description": "Pool information including version, hooks, and v2 feature support flag" + } + } + } + ] + }, + "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" + } + } + }, "TokenDetails": { "type": "object", "required": ["symbol", "lanes", "chains"], @@ -1120,6 +1846,304 @@ "description": "List of tokens that were ignored due to configuration issues" } } + }, + "TokenDirectoryMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "symbol", "sourceChain"], + "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" + }, + "symbol": { + "type": "string", + "description": "Canonical symbol of the requested token" + }, + "sourceChain": { + "type": "string", + "description": "Source chain identifier" + } + } + }, + "LaneVerifiers": { + "type": "object", + "description": "Pre-computed verifier sets for different transfer amounts. Only present for v2.0+ pools (supportsV2Features=true). For v1.x pools, the entire verifiers field is null. Values: empty array [] = no verifiers configured, [addr1, ...] = verifiers configured, null = downstream API error.", + "required": ["belowThreshold", "aboveThreshold"], + "properties": { + "belowThreshold": { + "nullable": true, + "type": "array", + "items": { + "type": "string" + }, + "description": "Verifier addresses used when transfer amount is below the threshold. Empty array [] if no verifiers configured, null if downstream API error." + }, + "aboveThreshold": { + "nullable": true, + "type": "array", + "items": { + "type": "string" + }, + "description": "Verifier addresses used when transfer amount is at or above the threshold (includes all belowThreshold verifiers plus additional threshold verifiers). Empty array [] if no verifiers configured, null if downstream API error." + } + } + }, + "RateLimiterConfig": { + "type": "object", + "description": "Rate limit configuration for a single direction (in or out)", + "required": ["capacity", "rate", "isEnabled"], + "properties": { + "capacity": { + "type": "string", + "description": "Maximum capacity of the rate limiter bucket (in token's smallest unit)" + }, + "rate": { + "type": "string", + "description": "Rate at which the bucket refills (tokens per second in smallest unit)" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether rate limiting is enabled" + } + } + }, + "DirectionalRateLimits": { + "type": "object", + "description": "Rate limits for both directions (in and out) on a lane", + "properties": { + "in": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/RateLimiterConfig" }], + "description": "Inbound rate limit configuration" + }, + "out": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/RateLimiterConfig" }], + "description": "Outbound rate limit configuration" + } + } + }, + "TokenRateLimits": { + "type": "object", + "description": "Rate limits for both standard and custom transfers, each with in/out directions", + "required": ["standard", "custom"], + "properties": { + "standard": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/DirectionalRateLimits" }], + "description": "Standard transfer rate limit configuration" + }, + "custom": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/DirectionalRateLimits" }], + "description": "Custom (custom block confirmation) transfer rate limit configuration" + } + } + }, + "LaneFees": { + "type": "object", + "description": "Transfer fees for a lane in basis points (1 bps = 0.01%)", + "required": ["standardTransferFeeBps", "customTransferFeeBps"], + "properties": { + "standardTransferFeeBps": { + "type": "integer", + "description": "Standard transfer fee in basis points" + }, + "customTransferFeeBps": { + "type": "integer", + "description": "custom (custom block confirmation) transfer fee in basis points" + } + } + }, + "TokenDirectoryLane": { + "type": "object", + "description": "Lane configuration for outbound or inbound transfers. Use pool.supportsV2Features to interpret verifiers: false + null = v1.x pool (not supported), true + {null, null} = downstream error, true + {[], []} = not configured, true + {[...], [...]} = configured.", + "required": ["internalId", "chainId", "selector", "rateLimits", "fees", "verifiers"], + "properties": { + "internalId": { + "type": "string", + "description": "Internal identifier of the remote chain (destination for outbound, source for inbound)" + }, + "chainId": { + "oneOf": [{ "type": "integer" }, { "type": "string" }], + "description": "Chain ID of the remote chain" + }, + "selector": { + "type": "string", + "description": "CCIP chain selector of the remote chain" + }, + "rateLimits": { + "$ref": "#/components/schemas/TokenRateLimits", + "description": "Rate limits for both standard and custom transfers, with in/out directions" + }, + "fees": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/LaneFees" }], + "description": "Transfer fees in basis points, or null if not configured" + }, + "verifiers": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/LaneVerifiers" }], + "description": "Verifier configuration. For v1.x pools (pool.supportsV2Features=false): null. For v2.x pools: object with arrays or null values." + } + } + }, + "CCVConfig": { + "type": "object", + "description": "Cross-Chain Verifier (CCV) configuration for a pool. Only present for v2.0+ pools (check pool.supportsV2Features). For v1.x pools, the entire ccvConfig field is null.", + "required": ["thresholdAmount"], + "properties": { + "thresholdAmount": { + "type": "string", + "nullable": true, + "description": "Amount threshold (in token's smallest unit) above which additional threshold verifiers are required. Values: '0' = CCV not configured for this pool, 'N' (positive number) = CCV configured with threshold N, null = downstream API error fetching CCV config." + } + } + }, + "TokenDirectoryTokenInfo": { + "type": "object", + "required": ["address", "decimals"], + "properties": { + "address": { + "type": "string", + "description": "Token contract address" + }, + "decimals": { + "type": "integer", + "description": "Token decimals" + } + } + }, + "TokenDirectoryPoolInfo": { + "type": "object", + "required": ["address", "rawType", "type", "version", "advancedPoolHooks", "supportsV2Features"], + "properties": { + "address": { + "type": "string", + "description": "Pool contract address" + }, + "rawType": { + "type": "string", + "description": "Raw pool type from configuration (e.g., 'LockReleaseTokenPool', 'BurnMintTokenPool', 'USDCTokenPool')" + }, + "type": { + "type": "string", + "enum": ["lockRelease", "burnMint", "usdc"], + "description": "Normalized pool type" + }, + "version": { + "type": "string", + "description": "Pool contract version" + }, + "advancedPoolHooks": { + "type": "string", + "nullable": true, + "description": "Address of advanced pool hooks contract, or null if not configured" + }, + "supportsV2Features": { + "type": "boolean", + "description": "Whether this pool supports v2 features (customFinality, ccvConfig). When true and these fields have null values inside, it indicates a downstream API error rather than feature not supported." + } + } + }, + "CustomFinalityConfig": { + "type": "object", + "description": "Custom finality configuration for the token on this chain. Only present for v2.0+ pools (check pool.supportsV2Features). For v1.x pools, the entire customFinality field is null. When both hasCustomFinality and minBlockConfirmation are null inside the object, it indicates a downstream API error for a v2.x pool.", + "required": ["hasCustomFinality", "minBlockConfirmation"], + "properties": { + "hasCustomFinality": { + "type": "boolean", + "nullable": true, + "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null indicates downstream API error." + }, + "minBlockConfirmation": { + "type": "integer", + "nullable": true, + "description": "Minimum block confirmations required. Null indicates downstream API error." + } + } + }, + "TokenDirectoryData": { + "type": "object", + "description": "Token directory data for a specific chain", + "required": [ + "internalId", + "chainId", + "selector", + "token", + "pool", + "ccvConfig", + "customFinality", + "outboundLanes", + "inboundLanes" + ], + "properties": { + "internalId": { + "type": "string", + "description": "Internal chain identifier" + }, + "chainId": { + "oneOf": [{ "type": "integer" }, { "type": "string" }], + "description": "Chain ID" + }, + "selector": { + "type": "string", + "description": "CCIP chain selector" + }, + "token": { + "$ref": "#/components/schemas/TokenDirectoryTokenInfo" + }, + "pool": { + "$ref": "#/components/schemas/TokenDirectoryPoolInfo" + }, + "ccvConfig": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/CCVConfig" }], + "description": "CCV configuration for v2.0+ pools. Null for v1.x pools (check pool.supportsV2Features). When present with thresholdAmount=null, indicates downstream API error." + }, + "customFinality": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/CustomFinalityConfig" }], + "description": "Custom finality configuration for v2.0+ pools. Null for v1.x pools (check pool.supportsV2Features). When present with hasCustomFinality=null and minBlockConfirmation=null, indicates downstream API error." + }, + "outboundLanes": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenDirectoryLane" + }, + "description": "Outbound lanes indexed by destination chain ID" + }, + "inboundLanes": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenDirectoryLane" + }, + "description": "Inbound lanes indexed by source chain ID" + } + } + }, + "TokenDirectoryApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/TokenDirectoryMetadata" + }, + "data": { + "$ref": "#/components/schemas/TokenDirectoryData" + } + } } } } diff --git a/public/assets/chains/adi-network.svg b/public/assets/chains/adi-network.svg new file mode 100644 index 00000000000..42db03f813c --- /dev/null +++ b/public/assets/chains/adi-network.svg @@ -0,0 +1,10 @@ + + + + + + + + + + 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/canton.svg b/public/assets/chains/canton.svg new file mode 100644 index 00000000000..e746fe39023 --- /dev/null +++ b/public/assets/chains/canton.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/edge.svg b/public/assets/chains/edge.svg new file mode 100644 index 00000000000..34bd3e50cac --- /dev/null +++ b/public/assets/chains/edge.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/chains/giwa.svg b/public/assets/chains/giwa.svg new file mode 100644 index 00000000000..52af31d5868 --- /dev/null +++ b/public/assets/chains/giwa.svg @@ -0,0 +1,5 @@ + + + + + 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/perennial.svg b/public/assets/chains/perennial.svg new file mode 100644 index 00000000000..63d548c3a79 --- /dev/null +++ b/public/assets/chains/perennial.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/chains/robinhood-chain.svg b/public/assets/chains/robinhood-chain.svg new file mode 100644 index 00000000000..32639552681 --- /dev/null +++ b/public/assets/chains/robinhood-chain.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/chains/robinhood.svg b/public/assets/chains/robinhood.svg new file mode 100644 index 00000000000..32639552681 --- /dev/null +++ b/public/assets/chains/robinhood.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/chains/seismic.svg b/public/assets/chains/seismic.svg new file mode 100644 index 00000000000..e0680143a15 --- /dev/null +++ b/public/assets/chains/seismic.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/chains/ton.svg b/public/assets/chains/ton.svg new file mode 100644 index 00000000000..46593c13c53 --- /dev/null +++ b/public/assets/chains/ton.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..e31442888fb 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -16,6 +16,10 @@ "displayName": "Apechain", "iconUrl": "https://docs.chain.link/assets/chains/apechain.svg" }, + "adi-network": { + "displayName": "ADI Network", + "iconUrl": "https://docs.chain.link/assets/chains/adi-network.svg" + }, "aptos": { "displayName": "Aptos", "iconUrl": "https://docs.chain.link/assets/chains/aptos.svg" @@ -24,6 +28,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" @@ -68,6 +76,10 @@ "displayName": "B²", "iconUrl": "https://docs.chain.link/assets/chains/bsquared.svg" }, + "canton": { + "displayName": "Canton", + "iconUrl": "https://docs.chain.link/assets/chains/canton.svg" + }, "celo": { "displayName": "Celo", "iconUrl": "https://docs.chain.link/assets/chains/celo.svg" @@ -88,6 +100,14 @@ "displayName": "Cronos zkEVM", "iconUrl": "https://docs.chain.link/assets/chains/cronoszkevm.svg" }, + "dogeos": { + "displayName": "DogeOS", + "iconUrl": "https://docs.chain.link/assets/chains/dogeos.svg" + }, + "edge": { + "displayName": "Edge", + "iconUrl": "https://docs.chain.link/assets/chains/edge.svg" + }, "ethereum": { "displayName": "Ethereum", "iconUrl": "https://docs.chain.link/assets/chains/ethereum.svg" @@ -108,6 +128,10 @@ "displayName": "Fraxtal", "iconUrl": "https://docs.chain.link/assets/chains/fraxtal.svg" }, + "giwa": { + "displayName": "Giwa", + "iconUrl": "https://docs.chain.link/assets/chains/giwa.svg" + }, "gnosis-chain": { "displayName": "Gnosis Chain", "iconUrl": "https://docs.chain.link/assets/chains/gnosis-chain.svg" @@ -148,6 +172,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 +248,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 +264,14 @@ "displayName": "OP", "iconUrl": "https://docs.chain.link/assets/chains/optimism.svg" }, + "perennial": { + "displayName": "Perennial", + "iconUrl": "https://docs.chain.link/assets/chains/perennial.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" @@ -252,6 +292,10 @@ "displayName": "Polygon zkEVM", "iconUrl": "https://docs.chain.link/assets/chains/polygonzkevm.svg" }, + "robinhood": { + "displayName": "Robinhood Chain", + "iconUrl": "https://docs.chain.link/assets/chains/robinhood-chain.svg" + }, "ronin": { "displayName": "Ronin", "iconUrl": "https://docs.chain.link/assets/chains/ronin.svg" @@ -268,6 +312,10 @@ "displayName": "Sei Network", "iconUrl": "https://docs.chain.link/assets/chains/sei.svg" }, + "seismic": { + "displayName": "Seismic", + "iconUrl": "https://docs.chain.link/assets/chains/seismic.svg" + }, "shibarium": { "displayName": "Shibarium", "iconUrl": "https://docs.chain.link/assets/chains/shibarium.svg" @@ -284,6 +332,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 +356,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" @@ -320,28 +376,4793 @@ "displayName": "World Chain", "iconUrl": "https://docs.chain.link/assets/chains/worldchain.svg" }, - "xdc": { - "displayName": "XDC", - "iconUrl": "https://docs.chain.link/assets/chains/xdc.svg" + "xdc": { + "displayName": "XDC", + "iconUrl": "https://docs.chain.link/assets/chains/xdc.svg" + }, + "xlayer": { + "displayName": "X Layer", + "iconUrl": "https://docs.chain.link/assets/chains/xlayer.svg" + }, + "zircuit": { + "displayName": "Zircuit", + "iconUrl": "https://docs.chain.link/assets/chains/zircuit.svg" + }, + "zksync": { + "displayName": "ZKsync", + "iconUrl": "https://docs.chain.link/assets/chains/zksync.svg" + }, + "zora": { + "displayName": "Zora", + "iconUrl": "https://docs.chain.link/assets/chains/zora.svg" + } + }, + "data": [ + { + "category": "integration", + "date": "2026-04-05", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "giwa", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "robinhood", + "scroll", + "shibarium", + "sei", + "seismic", + "soneium", + "sonic", + "solana", + "stable", + "xlayer", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "Frax USD", + "baseAsset": "FRXUSD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/frxusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/frxusd.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-04-05", + "description": "New Data Feeds available:", + "relatedNetworks": ["megaeth"], + "relatedTokens": [ + { + "assetName": "Ethena Staked USDe", + "baseAsset": "SUSDE", + "quoteAsset": "USD", + "network": "megaeth", + "url": "https://data.chain.link/feeds/megaeth/mainnet/susde-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susde.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-04-03", + "description": "Newly supported tokens: Yee, apxUSD, apyUSD", + "relatedTokens": [ + { + "assetName": "Yee Token", + "baseAsset": "Yee", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/Yee", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/yee.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "apxUSD", + "baseAsset": "apxUSD", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/apxUSD", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/apxusd.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "apyUSD", + "baseAsset": "apyUSD", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/apyUSD", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/apyusd.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-04-02", + "description": "CRE CLI version 1.9.0 is now available. This release adds browser-based OAuth (PKCE) for vault secrets operations — running `cre secrets create`, `cre secrets update`, `cre secrets delete`, or `cre secrets list` now opens your browser to authorize Vault DON access and submits your encrypted secrets automatically. It also adds a `--skip-type-checks` flag to `cre workflow build`, `cre workflow simulate`, `cre workflow deploy`, and `cre workflow hash` to skip TypeScript type checking for faster development iteration.\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.8.0...v1.9.0)", + "title": "CRE CLI v1.9.0 — Vault Secrets OAuth and Skip Type Checks", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-29", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "giwa", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "robinhood", + "scroll", + "shibarium", + "sei", + "seismic", + "soneium", + "sonic", + "solana", + "stable", + "xlayer", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "Katana", + "baseAsset": "KAT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/kat-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kat.webp" + }, + { + "assetName": "USAT", + "baseAsset": "USAT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usat-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usat.webp" + }, + { + "assetName": "ZAMA", + "baseAsset": "ZAMA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/zama-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zama.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-03-29", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["ethereum"], + "relatedTokens": [ + { + "assetName": "AARC BTCY", + "baseAsset": "BTCY", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/btcy-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btcy.webp" + }, + { + "assetName": "Coinshift USPC", + "baseAsset": "USPC", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/uspc-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uspc.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2026-03-29", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "polygonkatana", "base", "megaeth", "arbitrum"], + "relatedTokens": [ + { + "assetName": "Argentine Peso", + "baseAsset": "ARS", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/ars-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ars.webp" + }, + { + "assetName": "avKAT / KAT Exchange Rate", + "baseAsset": "avKAT", + "quoteAsset": "KAT", + "network": "polygonkatana", + "url": "https://data.chain.link/feeds/katana/polygon-mainnet-katana/avkat-kat-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/avkat.webp" + }, + { + "assetName": "Brazilian Real", + "baseAsset": "BRL", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/brl-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/brl.webp" + }, + { + "assetName": "Edge", + "baseAsset": "EDGE", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/edge-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/edge.webp" + }, + { + "assetName": "GLV [USDm-USDm]", + "baseAsset": "GLV", + "quoteAsset": "USDm", + "network": "megaeth", + "url": "https://data.chain.link/feeds/megaeth/mainnet/glv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/glv.webp" + }, + { + "assetName": "Katana", + "baseAsset": "KAT", + "quoteAsset": "USD", + "network": "polygonkatana", + "url": "https://data.chain.link/feeds/katana/polygon-mainnet-katana/kat-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kat.webp" + }, + { + "assetName": "Lido Staked Ether", + "baseAsset": "STETH", + "quoteAsset": "ETH", + "network": "megaeth", + "url": "https://data.chain.link/feeds/megaeth/mainnet/steth-eth", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/steth.webp" + }, + { + "assetName": "pmUSD / USD Exchange Rate", + "baseAsset": "pmUSD", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/pmusd-usd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/pmusd.webp" + }, + { + "assetName": "Ripple USD", + "baseAsset": "RLUSD", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/rlusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rlusd.webp" + }, + { + "assetName": "SIUSD / USD Exchange Rate", + "baseAsset": "SIUSD", + "quoteAsset": "USD", + "network": "polygonkatana", + "url": "https://data.chain.link/feeds/katana/polygon-mainnet-katana/siusd-usd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/siusd.webp" + }, + { + "assetName": "STRC", + "baseAsset": "STRC", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/strc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/strc.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-03-27", + "description": "Self-managed Data Feeds are now supported, allowing chains and operators to publish data onchain. See [Self-Managed Feeds](/data-feeds/self-managed-feeds) for more information, or contact the Data Feeds team at [chainlink_data_feeds@smartcontract.com](mailto:chainlink_data_feeds@smartcontract.com) for details regarding deployment. \n \n _Note: Chainlink Labs does not manage the onchain publication path, monitoring, or service levels for self-managed feeds and does not list their proxy addresses in official documentation; the chain or its operator is responsible for running the workflow, maintaining contracts, and supporting integrators._", + "title": "Self-Managed Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-03-27", + "description": "TypeScript SDK version 1.5.0 improves type checking accuracy and build reproducibility for TypeScript workflows. The SDK now runs type checks using your workflow's own `tsconfig.json` instead of its internal configuration, giving you more accurate, project-specific type errors. TypeScript workflow binaries are also now reproducible on the same OS, making it easier to verify build integrity across CI runs.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.4.0...v1.5.0)", + "title": "CRE TS SDK v1.5.0 — Workflow-Aware Type Checking and Reproducible Builds", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-26", + "description": "CRE CLI version 1.8.0 is now available. This release adds a tenant context cache (`~/.cre/context.yaml`) after login, scriptable `cre init` for CI pipelines, and `cre templates list --json` for machine-readable template listings.\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.7.0...v1.8.0)", + "title": "CRE CLI v1.8.0 — Tenant Context and Scriptable Init", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-26", + "description": "We have addressed a minor bug with [24/5 US Equity Data Streams](https://docs.chain.link/data-streams/rwa-streams?show24x5=true&page=1) & [Tokenized Equity Data Feeds](https://docs.chain.link/data-feeds/tokenized-equity-feeds). For both Data Streams and Data Feeds, no negative user impact is expected. For Data Streams, users may experience slightly less frequent data points during transitions from the overnight session to the extended hours session, but the accuracy of the data during the extended hours session is now higher. For Data Feeds, users can expect no difference in the values they are reading from the onchain contracts.", + "title": "Bug Fixes for 24/5 US Equity Data Streams and Tokenized Equity Data Feeds", + "topic": "Data Streams" + }, + { + "category": "deprecation", + "date": "2026-03-25", + "description": "We have announced the deprecation of select Data Feeds, scheduled for shutdown on April 8th, 2026. Check [the list of Deprecating Data Feeds to learn more](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecating Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-03-23", + "description": "CRE CLI version 1.7.0 is now available. This release adds Hyperliquid Mainnet support and enables Gnosis Chiado testnet support for workflow simulation and production deployment.\n\n**Required versions:** CLI v1.7.0+, Go SDK v1.7.0+, TS SDK v1.4.0+\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.6.0...v1.7.0)", + "title": "CRE CLI v1.7.0 — New Network Support", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-23", + "description": "CRE now supports Hyperliquid Mainnet and Gnosis Chiado testnet for workflow simulation and production deployment.\n\n**Required versions:** CLI v1.7.0+, Go SDK v1.7.0+, TS SDK v1.4.0+\n\nSee the [Supported Networks](https://docs.chain.link/cre/supported-networks) page for chain names and version requirements.", + "relatedNetworks": ["gnosis-chain", "hyperliquid"], + "title": "CRE Adds Hyperliquid Mainnet and Gnosis Chiado", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-23", + "description": "Go SDK version 1.7.0 updates EVM capabilities to support the new networks added in CLI v1.7.0.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.6.0...v1.7.0)", + "title": "CRE Go SDK v1.7.0 — New Network Support", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-23", + "description": "TypeScript SDK version 1.4.0 improves the TypeScript experience when working with Node.js APIs and adds support for new networks added in CLI v1.7.0.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.3.0...v1.4.0)", + "title": "CRE TS SDK v1.4.0 — Node.js API Improvements and New Networks", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-20", + "description": "Chainlink Data Streams is available for Robinhood Chain Testnet. The verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/supported-networks?streamsNetwork=robinhood) page.", + "relatedNetworks": ["robinhood"], + "title": "Data Streams Expands to Robinhood Chain Testnet", + "topic": "Data Streams" + }, + { + "category": "release", + "date": "2026-03-20", + "description": "To give developers more choice in how certain asset classes are priced onchain, we have introduced Bounded Market Price Feeds, which include predefined bounds on reported values. This approach is intended to provide guardrails during edge cases where structural deviations can introduce higher risk. If your use case requires the use of a non-Bounded Market Price Feed and one does not exist, reach out and we’ll be happy to support. See the docs for how these feeds work and associated considerations: [Bounded Market Price Feeds](https://docs.chain.link/data-feeds/price-feeds/bounded-market-price-feeds).", + "title": "Bounded Market Price Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-03-20", + "description": "CRE CLI version 1.6.0 is now available. This release adds a `--limits` flag to `cre workflow simulate`, letting you simulate workflows under specific resource constraints to better reflect production behavior. It also includes improvements to the `cre init` experience, a binding bug fix, and improved WASM debug symbol retention 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.5.0...v1.6.0)", + "title": "CRE CLI v1.6.0 — Simulation Limits and Init Improvements", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-17", + "description": "CRE CLI version 1.5.0 is now available. This release adds support for 9 new mainnets (Celo, Gnosis Chain, Ink, Linea, Mantle, MegaETH, Plasma, Scroll, and Sonic) and 8 new testnets (Cronos, Mantle Sepolia, MegaETH Testnet 2, Scroll Sepolia, Sonic Testnet, TAC Testnet, Unichain Sepolia, and XLayer Testnet), introduces the `cre hash` command to display content hashes for workflow artifacts, adds `${VAR}` environment variable resolution in RPC URLs, JSON ABI support in `cre generate-bindings`, and `.env` file support across all commands.\n\n**Required versions for new networks:** CLI v1.5.0+, Go SDK v1.6.0+, TS SDK v1.3.0+\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.4.0...v1.5.0)", + "title": "CRE CLI v1.5.0 — New Networks, Hash Command, and Developer Tools", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-17", + "description": "CRE now supports 9 new mainnets and 8 new testnets for workflow simulation and production deployment.\n\nNew mainnets: Celo, Gnosis Chain, Ink, Linea, Mantle, MegaETH, Plasma, Scroll, and Sonic.\n\nNew testnets: Cronos, Mantle Sepolia, MegaETH Testnet 2, Scroll Sepolia, Sonic Testnet, TAC Testnet, Unichain Sepolia, and XLayer Testnet.\n\n**Required versions:** CLI v1.5.0+, Go SDK v1.6.0+, TS SDK v1.3.0+\n\nSee the [Supported Networks](https://docs.chain.link/cre/supported-networks) page for chain names and version requirements.", + "relatedNetworks": [ + "celo", + "gnosis-chain", + "ink", + "linea", + "mantle", + "megaeth", + "plasma", + "scroll", + "sonic", + "cronos", + "tac", + "unichain", + "xlayer" + ], + "title": "CRE Expands to New Mainnets and Testnets", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-16", + "description": "Go SDK version 1.6.0 updates EVM capabilities to support the new networks added in CLI v1.5.0.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.5.0...v1.6.0)", + "title": "CRE Go SDK v1.6.0 — New Network Support", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-16", + "description": "TypeScript SDK version 1.3.0 updates EVM capabilities to support the new networks added in CLI v1.5.0.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.2.0...v1.3.0)", + "title": "CRE TS SDK v1.3.0 — New Network Support", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-12", + "description": "CRE CLI version 1.4.0 is now available. This release enables `cre workflow build`, `cre workflow upload`, and `cre workflow deploy` to run as independent steps for better CI/CD pipeline integration. The HTTP capability now supports sending multiple headers per request.\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.3.0...v1.4.0)", + "title": "CRE CLI v1.4.0 — CI/CD Pipeline Support and MultiHeaders", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-12", + "description": "TypeScript SDK version 1.2.0 adds a `logTriggerConfig` helper for configuring EVM log triggers in workflows and improves error messages with field-level context in `encodeCallMsg`.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.1.0...v1.2.0)", + "title": "CRE TS SDK v1.2.0 — logTriggerConfig Helper and Improved Errors", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-15", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "giwa", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "seismic", + "soneium", + "sonic", + "solana", + "stable", + "xlayer", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "ADI Token", + "baseAsset": "ADI", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/adi-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/adi.webp" + }, + { + "assetName": "Oklo Inc", + "baseAsset": "OKLO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/oklo-usd-overnighthoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/oklo.webp" + }, + { + "assetName": "Oklo Inc", + "baseAsset": "OKLO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/oklo-usd-regularhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/oklo.webp" + }, + { + "assetName": "Oklo Inc", + "baseAsset": "OKLO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/oklo-usd-extendedhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/oklo.webp" + }, + { + "assetName": "OpenDelta NX8", + "baseAsset": "NX8", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/nx8-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nx8.webp" + }, + { + "assetName": "SanDisk Corp", + "baseAsset": "SNDK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sndk-usd-regularhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sndk.webp" + }, + { + "assetName": "SanDisk Corp", + "baseAsset": "SNDK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sndk-usd-extendedhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sndk.webp" + }, + { + "assetName": "SanDisk Corp", + "baseAsset": "SNDK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sndk-usd-overnighthoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sndk.webp" + }, + { + "assetName": "Strategy Variable Rate Perpetual xStock", + "baseAsset": "STRCx", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/strcx-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/strcx.webp" + }, + { + "assetName": "Tessera tKalshi", + "baseAsset": "tKalshi", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tkalshi-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tkalshi.webp" + }, + { + "assetName": "Tessera tSpaceX", + "baseAsset": "tSpaceX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tspacex-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tspacex.webp" + }, + { + "assetName": "Unitas USDu", + "baseAsset": "USDu", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdu-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdu.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-03-15", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["ethereum"], + "relatedTokens": [ + { + "assetName": "Treasury+", + "baseAsset": "Treasury+", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/treasuryplus-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/treasury+.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2026-03-15", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "tron", "bnb-chain", "sonic"], + "relatedTokens": [ + { + "assetName": "AUSD", + "baseAsset": "AUSD", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/ausd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ausd.webp" + }, + { + "assetName": "HTX DAO", + "baseAsset": "HTX", + "quoteAsset": "USD", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=htx", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/htx.webp" + }, + { + "assetName": "RLP / USD Exchange Rate", + "baseAsset": "RLP", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://data.chain.link/feeds/bsc/mainnet/rlp-usd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rlp.webp" + }, + { + "assetName": "stGLD / tGLD Exchange Rate", + "baseAsset": "stGLD", + "quoteAsset": "tGLD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/stgld-tgld-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/stgld.webp" + }, + { + "assetName": "sUSDD / USDD Exchange Rate", + "baseAsset": "sUSDD", + "quoteAsset": "sUSDD", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=susdd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdd.webp" + }, + { + "assetName": "US Sonic Dollar", + "baseAsset": "USSD", + "quoteAsset": "USD", + "network": "sonic", + "url": "https://data.chain.link/feeds/sonic/sonic/ussd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ussd.webp" + }, + { + "assetName": "USDD / USDC Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDC", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=usdd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "USDD / USDT Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDT", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=usdd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "Wrapped Bitcoin", + "baseAsset": "WBTC", + "quoteAsset": "USD", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=wbtc", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wbtc.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-03-13", + "description": "Chainlink CCIP expands support to new networks:", + "newNetworks": [ + { + "displayName": "Robinhood Chain Testnet", + "network": "robinhood", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/robinhood-testnet" + }, + { + "displayName": "Ronin Saigon Testnet", + "network": "ronin", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/ronin-testnet-saigon" + } + ], + "relatedNetworks": ["robinhood", "ronin"], + "title": "CCIP on Robinhood Chain Testnet and Ronin Saigon Testnet", + "topic": "CCIP" + }, + { + "category": "release", + "date": "2026-03-12", + "description": "We have begun upgrading the underlying infrastructure that powers Data Feeds on Arbitrum, Base, and Binance Smart Chain to improve performance and redundancy. No negative impact is expected. This includes all Data Feeds including [Smart Value Recapture (SVR) feeds](https://docs.chain.link/data-feeds/price-feeds/addresses?showSvr=true). \n\n If you experience any issues, please contact your Chainlink point of contact or [email](mailto:chainlink_data_feeds@smartcontract.com).", + "title": "Upgrading Data Feeds Infrastructure on Arbitrum, Base, and Binance Smart Chain", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-03-08", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi-network", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "giwa", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "seismic", + "soneium", + "sonic", + "solana", + "stable", + "xlayer", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "DeFi Janus Henderson Anemoy AAA CLO Fund", + "baseAsset": "deJAAA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejaaa-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejaaa.webp" + }, + { + "assetName": "DeFi Janus Henderson Anemoy Treasury Fund", + "baseAsset": "deJTRSY", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejtrsy-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejtrsy.webp" + }, + { + "assetName": "Saakuru", + "baseAsset": "SKR", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/skr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/skr.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "deprecation", + "date": "2026-03-11", + "description": "We have announced the deprecation of select Data Feeds, scheduled for shutdown on March 25th, 2026. Check [the list of Deprecating Data Feeds to learn more](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecating Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-03-08", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "unichain", "xlayer"], + "relatedTokens": [ + { + "assetName": "Alphabet Inc - A", + "baseAsset": "GOOGL", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/googl-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/googl.webp" + }, + { + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/btc-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Chainlink", + "baseAsset": "LINK", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/link-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/link.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/usdc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/usdc-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/eth-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Invesco QQQ", + "baseAsset": "QQQ", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/qqq-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/qqq.webp" + }, + { + "assetName": "Kelp DAO Restaked ETH", + "baseAsset": "RSETH", + "quoteAsset": "ETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/rseth-eth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rseth.webp" + }, + { + "assetName": "NVIDIA Corporation", + "baseAsset": "NVDA", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/nvda-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nvda.webp" + }, + { + "assetName": "Renzo Restaked ETH", + "baseAsset": "EZETH", + "quoteAsset": "ETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/ezeth-eth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ezeth.webp" + }, + { + "assetName": "Solana", + "baseAsset": "SOL", + "quoteAsset": "USD", + "network": "xlayer", + "url": "https://data.chain.link/feeds/xlayer/xlayer/sol-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sol.webp" + }, + { + "assetName": "SPDR S&P 500 ETF", + "baseAsset": "SPY", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/spy-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/spy.webp" + }, + { + "assetName": "Tesla Inc", + "baseAsset": "TSLA", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/tsla-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tsla.webp" + }, + { + "assetName": "Uniswap", + "baseAsset": "UNI", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/uni-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uni.webp" + }, + { + "assetName": "Wrapped eETH", + "baseAsset": "weETH", + "quoteAsset": "eETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/weeth-eeth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/weeth.webp" + }, + { + "assetName": "wstETH / stETH Exchange Rate", + "baseAsset": "wstETH", + "quoteAsset": "stETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/wsteth-steth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-03-08", + "description": "Newly supported tokens: ZYPTO, cbBTC", + "relatedTokens": [ + { + "assetName": "Zypto Token", + "baseAsset": "ZYPTO", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/ZYPTO", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zypto.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Coinbase Wrapped BTC", + "baseAsset": "cbBTC", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/cbBTC", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cbbtc.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": "2026-03-06", + "description": "Chainlink CCIP expands support to new networks:", + "newNetworks": [ + { + "displayName": "ADI Network Mainnet", + "network": "adi-network", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/adi-network-mainnet" + }, + { + "displayName": "Edge Mainnet", + "network": "edge-mainnet", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/edge-mainnet" + }, + { + "displayName": "Edge Testnet", + "network": "edge-testnet", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/edge-testnet" + } + ], + "relatedNetworks": ["adi-network", "edge"], + "title": "CCIP on ADI Network Mainnet, Edge Mainnet and Edge Testnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-03-06", + "description": "Newly supported tokens: ZYPTO", + "relatedTokens": [ + { + "assetName": "ZYPTO", + "baseAsset": "ZYPTO", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/ZYPTO", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zypto.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-03-05", + "description": "CLI version 1.3.0 adds TypeScript EVM binding generation, explicit `--target` prompting, Jovay/Pharos/XLayer mainnet support, and Pharos Atlantic testnet support.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.2.0...v1.3.0)", + "title": "CRE CLI v1.3.0 — TypeScript Bindings and New Networks", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-05", + "description": "Go SDK version 1.5.0 adds Pharos Atlantic network support.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.4.0...v1.5.0)", + "title": "CRE Go SDK v1.5.0 — Pharos Atlantic Support", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-03", + "description": "Chainlink Data Feeds is available on Unichain Mainnet. View the available price feed information on the [Price Feed Addresses](https://docs.chain.link/data-feeds/price-feeds/addresses?network=unichain&page=1) page.", + "relatedNetworks": ["unichain"], + "title": "Data Feeds Expands to Unichain Mainnet", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-03-02", + "description": "Go SDK version 1.4.0 adds Solana LogTrigger SDK generation and Solana workflow bindings, and expands network support to Jovay Testnet, Pharos Testnet, and XLayer. Note: previously generated Solana SDK types have been removed and replaced by the new Solana bindings.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.3.0...v1.4.0)", + "title": "CRE Go SDK v1.4.0 — Solana Bindings and New Networks", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-02", + "description": "The CCIP SDK, CLI, and REST API are now generally available:\n\n- **CCIP SDK v1.0** ([@chainlink/ccip-sdk](https://www.npmjs.com/package/@chainlink/ccip-sdk)): Programmatic tools for sending messages, transferring tokens, estimating fees, and querying CCIP activity.\n- **CCIP CLI v1.0** ([@chainlink/ccip-cli](https://www.npmjs.com/package/@chainlink/ccip-cli)): Command-line interface for the same capabilities.\n- **CCIP API v2** ([REST API](https://docs.chain.link/ccip/tools/api/)): Endpoints for messages and their details, lane latency, and intents.\n\nSee the [CCIP Tools](https://docs.chain.link/ccip/tools/) documentation for details.", + "title": "CCIP SDK v1.0, CLI v1.0, and API v2", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-03-01", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi-network", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "stable", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": " Rocket Lab Corp", + "baseAsset": "RKLB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/rklb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rklb.webp" + }, + { + "assetName": "Advanced Micro Devices / AMD", + "baseAsset": "AMD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/amd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/amd.webp" + }, + { + "assetName": "Alibaba Group Holding Ltd (ADRs)", + "baseAsset": "BABA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/baba-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/baba.webp" + }, + { + "assetName": "Beyond Meat Inc", + "baseAsset": "BYND", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/bynd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bynd.webp" + }, + { + "assetName": "CoreWeave Inc", + "baseAsset": "CRWV", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/crwv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/crwv.webp" + }, + { + "assetName": "DeFi Janus Henderson Anemoy AAA CLO Fund", + "baseAsset": "deJAAA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejaaa-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejaaa.webp" + }, + { + "assetName": "DeFi Janus Henderson Anemoy Treasury Fund", + "baseAsset": "deJTRSY", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejtrsy-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejtrsy.webp" + }, + { + "assetName": "Global Dollar", + "baseAsset": "USDG", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdg-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdg.webp" + }, + { + "assetName": "Global X AI & Tech ETF", + "baseAsset": "AIQ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/aiq-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/aiq.webp" + }, + { + "assetName": "Global X Robotics & Artificial Intelligence (BOTZ)", + "baseAsset": "BOTZ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/botz-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/botz.webp" + }, + { + "assetName": "Intel Corp", + "baseAsset": "INTC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/intc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/intc.webp" + }, + { + "assetName": "iPath Series B S&P 500 VIX Short-Term Futures ETF", + "baseAsset": "VXX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/vxx-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/vxx.webp" + }, + { + "assetName": "iShares 20+ Year Treasury Bond ETF", + "baseAsset": "TLT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tlt-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tlt.webp" + }, + { + "assetName": "iShares Core MSCI Emerging Mkts ETF", + "baseAsset": "IEMG", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/iemg-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/iemg.webp" + }, + { + "assetName": "iShares Gold Trust", + "baseAsset": "IAU", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/iau-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/iau.webp" + }, + { + "assetName": "iShares MSCI Japan ETF", + "baseAsset": "EWJ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ewj-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ewj.webp" + }, + { + "assetName": "iShares Russell 2000 ETF", + "baseAsset": "IWM", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/iwm-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/iwm.webp" + }, + { + "assetName": "iShares Silver Trust ETF", + "baseAsset": "SLV", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/slv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/slv.webp" + }, + { + "assetName": "Kraneshares CSI China Internet ETF", + "baseAsset": "KWEB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/kweb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kweb.webp" + }, + { + "assetName": "Micron Technology Inc", + "baseAsset": "MU", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mu-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mu.webp" + }, + { + "assetName": "Nebius Group", + "baseAsset": "NBIS", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/nbis-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nbis.webp" + }, + { + "assetName": "Real Estate Select Sector SPDR Fund ETF", + "baseAsset": "XLRE", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/xlre-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xlre.webp" + }, + { + "assetName": "Rigetti Computing Inc", + "baseAsset": "RGTI", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/rgti-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rgti.webp" + }, + { + "assetName": "Roundhill Magnificent Seven ETF", + "baseAsset": "MAGS", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mags-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mags.webp" + }, + { + "assetName": "Schwab US REIT", + "baseAsset": "SCHH", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/schh-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/schh.webp" + }, + { + "assetName": "Sentient", + "baseAsset": "SENT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sent-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sent.webp" + }, + { + "assetName": "SPDR DJIA ETF", + "baseAsset": "DIA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dia-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dia.webp" + }, + { + "assetName": "STRC", + "baseAsset": "STRC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/strc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/strc.webp" + }, + { + "assetName": "TSMC / Taiwan Semiconductor Man Co (ADRs)", + "baseAsset": "TSM", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tsm-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tsm.webp" + }, + { + "assetName": "United States Oil Fund LP ETF", + "baseAsset": "USO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/uso-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uso.webp" + }, + { + "assetName": "USD", + "baseAsset": "USD", + "quoteAsset": "ARS", + "url": "https://data.chain.link/streams/usd-ars", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usd.webp" + }, + { + "assetName": "USX / USD Redemption Rate", + "baseAsset": "USX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usx-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usx.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-03-01", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["ethereum", "bnb-chain"], + "relatedTokens": [ + { + "assetName": "CRDYX NAV", + "baseAsset": "CRDYX", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/crdyx-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/crdyx.webp" + }, + { + "assetName": "JAAA NAV", + "baseAsset": "JAAA", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/jaaa-nav-v2", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jaaa.webp" + }, + { + "assetName": "JTRSY NAV", + "baseAsset": "JTRSY", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/jtrsy-nav-v2", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jtrsy.webp" + }, + { + "assetName": "Kinesis Gold (KAU)", + "baseAsset": "KAU", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/kau-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kau.webp" + }, + { + "assetName": "Kinesis Silver (KAG)", + "baseAsset": "KAG", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/kag-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kag.webp" + }, + { + "assetName": "Renzo Restaked ETH", + "baseAsset": "ezETH", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/ezeth-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ezeth.webp" + }, + { + "assetName": "US Dollar (USD) total reserves", + "baseAsset": "C1USD", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/c1usd-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/c1usd.webp" + }, + { + "assetName": "WTGXX NAV", + "baseAsset": "WTGXX", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/wtgxx-nav-24h", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wtgxx.webp" + }, + { + "assetName": "XAUM Reference Rate", + "baseAsset": "XAUM", + "network": "bnb-chain", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/bsc/mainnet/xaum-reference-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xaum.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2026-03-01", + "description": "New Data Feeds available:", + "relatedNetworks": ["arbitrum", "scroll", "base", "polygonkatana", "optimism", "ethereum"], + "relatedTokens": [ + { + "assetName": "Avant Staked USD", + "baseAsset": "savUSD", + "quoteAsset": "avUSD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/savusd-avusd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/savusd.webp" + }, + { + "assetName": "Circle EUR", + "baseAsset": "EURC", + "quoteAsset": "USD", + "network": "scroll", + "url": "https://data.chain.link/feeds/scroll/mainnet/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" + }, + { + "assetName": "Ripple USD", + "baseAsset": "RLUSD", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/rlusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rlusd.webp" + }, + { + "assetName": "Silver", + "baseAsset": "XAG", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/xag-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xag.webp" + }, + { + "assetName": "Solv Protocol SOLVBTC / BTC Exchange Rate", + "baseAsset": "SOLVBTC", + "quoteAsset": "BTC", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/solvbtc-btc-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/solvbtc.webp" + }, + { + "assetName": "SUSDA / USDA Exchange Rate", + "baseAsset": "SUSDA", + "quoteAsset": "USDA", + "network": "polygonkatana", + "url": "https://data.chain.link/feeds/katana/polygon-mainnet-katana/susda-usda-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susda.webp" + }, + { + "assetName": "UMA", + "baseAsset": "UMA", + "quoteAsset": "USD", + "network": "optimism", + "url": "https://data.chain.link/feeds/optimism/mainnet/uma-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uma.webp" + }, + { + "assetName": "Zcash", + "baseAsset": "ZEC", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/zec-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zec.webp" + }, + { + "assetName": "ZCash", + "baseAsset": "ZEC", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/zec-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zec.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-02-26", + "description": "Chainlink Data Streams is available for new blockchains:\n\n- Giwa Sepolia Testnet\n- Injective EVM Testnet\n- Seismic Testnet\n- X Layer Mainnet\n- X Layer Testnet\n\nThe verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", + "relatedNetworks": ["giwa", "injective", "seismic", "xlayer"], + "title": "Data Streams Expands to New Blockchains", + "topic": "Data Streams" + }, + { + "category": "deprecation", + "date": "2026-02-26", + "description": "We have announced the deprecation of select Data Feeds, scheduled for shutdown on March 12th, 2026. Check [the list of Deprecating Data Feeds to learn more](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecating Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-02-26", + "description": "CRE CLI version 1.2.0 is now available. This release adds dynamic template fetching, new `cre templates` commands for managing template sources, and a new `cre account access` command for checking and requesting deployment access.\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.1.0...v1.2.0)", + "title": "CRE CLI v1.2.0 — Dynamic Templates and Deploy Access Management", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-02-25", + "description": "CRE now supports the Confidential HTTP capability for production workflows, allowing you to make privacy-preserving API calls with enclave execution. See the [Confidential HTTP](https://docs.chain.link/cre/capabilities/confidential-http) page for more information.", + "title": "CRE supports Confidential HTTP capability for production workflows", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-02-25", + "description": "Chainlink Data Streams is available for Canton. See the [Canton Integration](https://docs.chain.link/data-streams/canton-integration) page for more information.", + "relatedNetworks": ["canton"], + "title": "Data Streams Expands to Canton", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-02-22", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "arbitrum"], + "relatedTokens": [ + { + "assetName": "Swell Ethereum", + "baseAsset": "SWETH", + "quoteAsset": "ETH", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/sweth-eth", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sweth.webp" + }, + { + "assetName": "Swell Ethereum", + "baseAsset": "SWETH", + "quoteAsset": "ETH", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/sweth-eth", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sweth.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-02-22", + "description": "Newly supported tokens: USDi", + "relatedTokens": [ + { + "assetName": "USDi Coin", + "baseAsset": "USDi", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/USDi", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdi.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": "2026-03-15", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "giwa", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "seismic", + "soneium", + "sonic", + "solana", + "stable", + "xlayer", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "ADI Token", + "baseAsset": "ADI", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/adi-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/adi.webp" + }, + { + "assetName": "Oklo Inc", + "baseAsset": "OKLO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/oklo-usd-overnighthoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/oklo.webp" + }, + { + "assetName": "Oklo Inc", + "baseAsset": "OKLO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/oklo-usd-regularhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/oklo.webp" + }, + { + "assetName": "Oklo Inc", + "baseAsset": "OKLO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/oklo-usd-extendedhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/oklo.webp" + }, + { + "assetName": "OpenDelta NX8", + "baseAsset": "NX8", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/nx8-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nx8.webp" + }, + { + "assetName": "SanDisk Corp", + "baseAsset": "SNDK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sndk-usd-regularhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sndk.webp" + }, + { + "assetName": "SanDisk Corp", + "baseAsset": "SNDK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sndk-usd-extendedhoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sndk.webp" + }, + { + "assetName": "SanDisk Corp", + "baseAsset": "SNDK", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sndk-usd-overnighthoursequityprice-streams", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sndk.webp" + }, + { + "assetName": "Strategy Variable Rate Perpetual xStock", + "baseAsset": "STRCx", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/strcx-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/strcx.webp" + }, + { + "assetName": "Tessera tKalshi", + "baseAsset": "tKalshi", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tkalshi-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tkalshi.webp" + }, + { + "assetName": "Tessera tSpaceX", + "baseAsset": "tSpaceX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tspacex-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tspacex.webp" + }, + { + "assetName": "Unitas USDu", + "baseAsset": "USDu", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdu-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdu.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-03-15", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["ethereum"], + "relatedTokens": [ + { + "assetName": "Treasury+", + "baseAsset": "Treasury+", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/treasuryplus-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/treasury+.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2026-03-15", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "tron", "bnb-chain", "sonic"], + "relatedTokens": [ + { + "assetName": "AUSD", + "baseAsset": "AUSD", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/ausd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ausd.webp" + }, + { + "assetName": "HTX DAO", + "baseAsset": "HTX", + "quoteAsset": "USD", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=htx", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/htx.webp" + }, + { + "assetName": "RLP / USD Exchange Rate", + "baseAsset": "RLP", + "quoteAsset": "USD", + "network": "bnb-chain", + "url": "https://data.chain.link/feeds/bsc/mainnet/rlp-usd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rlp.webp" + }, + { + "assetName": "stGLD / tGLD Exchange Rate", + "baseAsset": "stGLD", + "quoteAsset": "tGLD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/stgld-tgld-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/stgld.webp" + }, + { + "assetName": "sUSDD / USDD Exchange Rate", + "baseAsset": "sUSDD", + "quoteAsset": "sUSDD", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=susdd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susdd.webp" + }, + { + "assetName": "US Sonic Dollar", + "baseAsset": "USSD", + "quoteAsset": "USD", + "network": "sonic", + "url": "https://data.chain.link/feeds/sonic/sonic/ussd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ussd.webp" + }, + { + "assetName": "USDD / USDC Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDC", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=usdd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "USDD / USDT Exchange Rate", + "baseAsset": "USDD", + "quoteAsset": "USDT", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=usdd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdd.webp" + }, + { + "assetName": "Wrapped Bitcoin", + "baseAsset": "WBTC", + "quoteAsset": "USD", + "network": "tron", + "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=tron&search=wbtc", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wbtc.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-03-13", + "description": "Chainlink CCIP expands support to new networks:", + "newNetworks": [ + { + "displayName": "Robinhood Chain Testnet", + "network": "robinhood", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/robinhood-testnet" + }, + { + "displayName": "Ronin Saigon Testnet", + "network": "ronin", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/ronin-testnet-saigon" + } + ], + "relatedNetworks": ["robinhood", "ronin"], + "title": "CCIP on Robinhood Chain Testnet and Ronin Saigon Testnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-03-08", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi-network", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "giwa", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "seismic", + "soneium", + "sonic", + "solana", + "stable", + "xlayer", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "DeFi Janus Henderson Anemoy AAA CLO Fund", + "baseAsset": "deJAAA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejaaa-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejaaa.webp" + }, + { + "assetName": "DeFi Janus Henderson Anemoy Treasury Fund", + "baseAsset": "deJTRSY", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejtrsy-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejtrsy.webp" + }, + { + "assetName": "Saakuru", + "baseAsset": "SKR", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/skr-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/skr.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-03-08", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "unichain", "xlayer"], + "relatedTokens": [ + { + "assetName": "Alphabet Inc - A", + "baseAsset": "GOOGL", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/googl-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/googl.webp" + }, + { + "assetName": "Bitcoin", + "baseAsset": "BTC", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/btc-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.webp" + }, + { + "assetName": "Chainlink", + "baseAsset": "LINK", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/link-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/link.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/usdc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Circle USD", + "baseAsset": "USDC", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/usdc-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdc.webp" + }, + { + "assetName": "Ethereum", + "baseAsset": "ETH", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/eth-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eth.webp" + }, + { + "assetName": "Invesco QQQ", + "baseAsset": "QQQ", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/qqq-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/qqq.webp" + }, + { + "assetName": "Kelp DAO Restaked ETH", + "baseAsset": "RSETH", + "quoteAsset": "ETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/rseth-eth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rseth.webp" + }, + { + "assetName": "NVIDIA Corporation", + "baseAsset": "NVDA", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/nvda-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nvda.webp" + }, + { + "assetName": "Renzo Restaked ETH", + "baseAsset": "EZETH", + "quoteAsset": "ETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/ezeth-eth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ezeth.webp" + }, + { + "assetName": "Solana", + "baseAsset": "SOL", + "quoteAsset": "USD", + "network": "xlayer", + "url": "https://data.chain.link/feeds/xlayer/xlayer/sol-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sol.webp" + }, + { + "assetName": "SPDR S&P 500 ETF", + "baseAsset": "SPY", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/spy-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/spy.webp" + }, + { + "assetName": "Tesla Inc", + "baseAsset": "TSLA", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/tsla-usd-kalman-24-5", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tsla.webp" + }, + { + "assetName": "Uniswap", + "baseAsset": "UNI", + "quoteAsset": "USD", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/uni-usd-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uni.webp" + }, + { + "assetName": "Wrapped eETH", + "baseAsset": "weETH", + "quoteAsset": "eETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/weeth-eeth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/weeth.webp" + }, + { + "assetName": "wstETH / stETH Exchange Rate", + "baseAsset": "wstETH", + "quoteAsset": "stETH", + "network": "unichain", + "url": "https://data.chain.link/feeds/unichain/mainnet/wsteth-steth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wsteth.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-03-08", + "description": "Newly supported tokens: ZYPTO, cbBTC", + "relatedTokens": [ + { + "assetName": "Zypto Token", + "baseAsset": "ZYPTO", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/ZYPTO", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zypto.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + }, + { + "assetName": "Coinbase Wrapped BTC", + "baseAsset": "cbBTC", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/cbBTC", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cbbtc.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": "2026-03-06", + "description": "Chainlink CCIP expands support to new networks:", + "newNetworks": [ + { + "displayName": "ADI Network Mainnet", + "network": "adi-network", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/adi-network-mainnet" + }, + { + "displayName": "Edge Mainnet", + "network": "edge-mainnet", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/edge-mainnet" + }, + { + "displayName": "Edge Testnet", + "network": "edge-testnet", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/edge-testnet" + } + ], + "relatedNetworks": ["adi-network", "edge"], + "title": "CCIP on ADI Network Mainnet, Edge Mainnet and Edge Testnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-03-06", + "description": "Newly supported tokens: ZYPTO", + "relatedTokens": [ + { + "assetName": "ZYPTO", + "baseAsset": "ZYPTO", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/ZYPTO", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zypto.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-03-05", + "description": "CLI version 1.3.0 adds TypeScript EVM binding generation, explicit `--target` prompting, Jovay/Pharos/XLayer mainnet support, and Pharos Atlantic testnet support.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.2.0...v1.3.0)", + "title": "CRE CLI v1.3.0 — TypeScript Bindings and New Networks", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-05", + "description": "Go SDK version 1.5.0 adds Pharos Atlantic network support.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.4.0...v1.5.0)", + "title": "CRE Go SDK v1.5.0 — Pharos Atlantic Support", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-03-03", + "description": "Chainlink Data Feeds is available on Unichain Mainnet. View the available price feed information on the [Price Feed Addresses](https://docs.chain.link/data-feeds/price-feeds/addresses?network=unichain&page=1) page.", + "relatedNetworks": ["unichain"], + "title": "Data Feeds Expands to Unichain Mainnet", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-03-02", + "description": "Go SDK version 1.4.0 adds Solana LogTrigger SDK generation and Solana workflow bindings, and expands network support to Jovay Testnet, Pharos Testnet, and XLayer. Note: previously generated Solana SDK types have been removed and replaced by the new Solana bindings.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.3.0...v1.4.0)", + "title": "CRE Go SDK v1.4.0 — Solana Bindings and New Networks", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-03-02", + "description": "The CCIP SDK, CLI, and REST API are now generally available:\n\n- **CCIP SDK v1.0** ([@chainlink/ccip-sdk](https://www.npmjs.com/package/@chainlink/ccip-sdk)): Programmatic tools for sending messages, transferring tokens, estimating fees, and querying CCIP activity.\n- **CCIP CLI v1.0** ([@chainlink/ccip-cli](https://www.npmjs.com/package/@chainlink/ccip-cli)): Command-line interface for the same capabilities.\n- **CCIP API v2** ([REST API](https://docs.chain.link/ccip/tools/api/)): Endpoints for messages and their details, lane latency, and intents.\n\nSee the [CCIP Tools](https://docs.chain.link/ccip/tools/) documentation for details.", + "title": "CCIP SDK v1.0, CLI v1.0, and API v2", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-03-01", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "adi-network", + "aptos", + "arbitrum", + "arc", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "dogeos", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "perennial", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "stable", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": " Rocket Lab Corp", + "baseAsset": "RKLB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/rklb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rklb.webp" + }, + { + "assetName": "Advanced Micro Devices / AMD", + "baseAsset": "AMD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/amd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/amd.webp" + }, + { + "assetName": "Alibaba Group Holding Ltd (ADRs)", + "baseAsset": "BABA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/baba-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/baba.webp" + }, + { + "assetName": "Beyond Meat Inc", + "baseAsset": "BYND", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/bynd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/bynd.webp" + }, + { + "assetName": "CoreWeave Inc", + "baseAsset": "CRWV", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/crwv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/crwv.webp" + }, + { + "assetName": "DeFi Janus Henderson Anemoy AAA CLO Fund", + "baseAsset": "deJAAA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejaaa-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejaaa.webp" + }, + { + "assetName": "DeFi Janus Henderson Anemoy Treasury Fund", + "baseAsset": "deJTRSY", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dejtrsy-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dejtrsy.webp" + }, + { + "assetName": "Global Dollar", + "baseAsset": "USDG", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usdg-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdg.webp" + }, + { + "assetName": "Global X AI & Tech ETF", + "baseAsset": "AIQ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/aiq-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/aiq.webp" + }, + { + "assetName": "Global X Robotics & Artificial Intelligence (BOTZ)", + "baseAsset": "BOTZ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/botz-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/botz.webp" + }, + { + "assetName": "Intel Corp", + "baseAsset": "INTC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/intc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/intc.webp" + }, + { + "assetName": "iPath Series B S&P 500 VIX Short-Term Futures ETF", + "baseAsset": "VXX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/vxx-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/vxx.webp" + }, + { + "assetName": "iShares 20+ Year Treasury Bond ETF", + "baseAsset": "TLT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tlt-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tlt.webp" + }, + { + "assetName": "iShares Core MSCI Emerging Mkts ETF", + "baseAsset": "IEMG", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/iemg-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/iemg.webp" + }, + { + "assetName": "iShares Gold Trust", + "baseAsset": "IAU", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/iau-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/iau.webp" + }, + { + "assetName": "iShares MSCI Japan ETF", + "baseAsset": "EWJ", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ewj-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ewj.webp" + }, + { + "assetName": "iShares Russell 2000 ETF", + "baseAsset": "IWM", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/iwm-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/iwm.webp" + }, + { + "assetName": "iShares Silver Trust ETF", + "baseAsset": "SLV", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/slv-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/slv.webp" + }, + { + "assetName": "Kraneshares CSI China Internet ETF", + "baseAsset": "KWEB", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/kweb-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kweb.webp" + }, + { + "assetName": "Micron Technology Inc", + "baseAsset": "MU", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mu-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mu.webp" + }, + { + "assetName": "Nebius Group", + "baseAsset": "NBIS", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/nbis-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/nbis.webp" + }, + { + "assetName": "Real Estate Select Sector SPDR Fund ETF", + "baseAsset": "XLRE", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/xlre-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xlre.webp" + }, + { + "assetName": "Rigetti Computing Inc", + "baseAsset": "RGTI", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/rgti-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rgti.webp" + }, + { + "assetName": "Roundhill Magnificent Seven ETF", + "baseAsset": "MAGS", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mags-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mags.webp" + }, + { + "assetName": "Schwab US REIT", + "baseAsset": "SCHH", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/schh-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/schh.webp" + }, + { + "assetName": "Sentient", + "baseAsset": "SENT", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/sent-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sent.webp" + }, + { + "assetName": "SPDR DJIA ETF", + "baseAsset": "DIA", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/dia-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/dia.webp" + }, + { + "assetName": "STRC", + "baseAsset": "STRC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/strc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/strc.webp" + }, + { + "assetName": "TSMC / Taiwan Semiconductor Man Co (ADRs)", + "baseAsset": "TSM", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/tsm-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tsm.webp" + }, + { + "assetName": "United States Oil Fund LP ETF", + "baseAsset": "USO", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/uso-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uso.webp" + }, + { + "assetName": "USD", + "baseAsset": "USD", + "quoteAsset": "ARS", + "url": "https://data.chain.link/streams/usd-ars", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usd.webp" + }, + { + "assetName": "USX / USD Redemption Rate", + "baseAsset": "USX", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/usx-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usx.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-03-01", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["ethereum", "bnb-chain"], + "relatedTokens": [ + { + "assetName": "CRDYX NAV", + "baseAsset": "CRDYX", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/crdyx-nav", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/crdyx.webp" + }, + { + "assetName": "JAAA NAV", + "baseAsset": "JAAA", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/jaaa-nav-v2", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jaaa.webp" + }, + { + "assetName": "JTRSY NAV", + "baseAsset": "JTRSY", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/jtrsy-nav-v2", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/jtrsy.webp" + }, + { + "assetName": "Kinesis Gold (KAU)", + "baseAsset": "KAU", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/kau-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kau.webp" + }, + { + "assetName": "Kinesis Silver (KAG)", + "baseAsset": "KAG", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/kag-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/kag.webp" + }, + { + "assetName": "Renzo Restaked ETH", + "baseAsset": "ezETH", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/ezeth-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ezeth.webp" + }, + { + "assetName": "US Dollar (USD) total reserves", + "baseAsset": "C1USD", + "network": "ethereum", + "productTypeCode": "PoR", + "url": "https://data.chain.link/feeds/ethereum/mainnet/c1usd-por", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/c1usd.webp" + }, + { + "assetName": "WTGXX NAV", + "baseAsset": "WTGXX", + "network": "ethereum", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/ethereum/mainnet/wtgxx-nav-24h", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/wtgxx.webp" + }, + { + "assetName": "XAUM Reference Rate", + "baseAsset": "XAUM", + "network": "bnb-chain", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/bsc/mainnet/xaum-reference-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xaum.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2026-03-01", + "description": "New Data Feeds available:", + "relatedNetworks": ["arbitrum", "scroll", "base", "polygonkatana", "optimism", "ethereum"], + "relatedTokens": [ + { + "assetName": "Avant Staked USD", + "baseAsset": "savUSD", + "quoteAsset": "avUSD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/savusd-avusd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/savusd.webp" + }, + { + "assetName": "Circle EUR", + "baseAsset": "EURC", + "quoteAsset": "USD", + "network": "scroll", + "url": "https://data.chain.link/feeds/scroll/mainnet/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" + }, + { + "assetName": "Ripple USD", + "baseAsset": "RLUSD", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/rlusd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/rlusd.webp" + }, + { + "assetName": "Silver", + "baseAsset": "XAG", + "quoteAsset": "USD", + "network": "base", + "url": "https://data.chain.link/feeds/base/base/xag-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/xag.webp" + }, + { + "assetName": "Solv Protocol SOLVBTC / BTC Exchange Rate", + "baseAsset": "SOLVBTC", + "quoteAsset": "BTC", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/solvbtc-btc-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/solvbtc.webp" + }, + { + "assetName": "SUSDA / USDA Exchange Rate", + "baseAsset": "SUSDA", + "quoteAsset": "USDA", + "network": "polygonkatana", + "url": "https://data.chain.link/feeds/katana/polygon-mainnet-katana/susda-usda-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susda.webp" + }, + { + "assetName": "UMA", + "baseAsset": "UMA", + "quoteAsset": "USD", + "network": "optimism", + "url": "https://data.chain.link/feeds/optimism/mainnet/uma-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/uma.webp" + }, + { + "assetName": "Zcash", + "baseAsset": "ZEC", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/zec-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zec.webp" + }, + { + "assetName": "ZCash", + "baseAsset": "ZEC", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/zec-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/zec.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-02-26", + "description": "Chainlink Data Streams is available for new blockchains:\n\n- Giwa Sepolia Testnet\n- Injective EVM Testnet\n- Seismic Testnet\n- X Layer Mainnet\n- X Layer Testnet\n\nThe verifier proxy addresses and stream IDs are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", + "relatedNetworks": ["giwa", "injective", "seismic", "xlayer"], + "title": "Data Streams Expands to New Blockchains", + "topic": "Data Streams" + }, + { + "category": "deprecation", + "date": "2026-02-26", + "description": "We have announced the deprecation of select Data Feeds, scheduled for shutdown on March 12th, 2026. Check [the list of Deprecating Data Feeds to learn more](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecating Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-02-26", + "description": "CRE CLI version 1.2.0 is now available. This release adds dynamic template fetching, new `cre templates` commands for managing template sources, and a new `cre account access` command for checking and requesting deployment access.\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.1.0...v1.2.0)", + "title": "CRE CLI v1.2.0 — Dynamic Templates and Deploy Access Management", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-02-25", + "description": "CRE now supports the Confidential HTTP capability for production workflows, allowing you to make privacy-preserving API calls with enclave execution. See the [Confidential HTTP](https://docs.chain.link/cre/capabilities/confidential-http) page for more information.", + "title": "CRE supports Confidential HTTP capability for production workflows", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-02-25", + "description": "Chainlink Data Streams is available for Canton. See the [Canton Integration](https://docs.chain.link/data-streams/canton-integration) page for more information.", + "relatedNetworks": ["canton"], + "title": "Data Streams Expands to Canton", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-02-22", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "arbitrum"], + "relatedTokens": [ + { + "assetName": "Swell Ethereum", + "baseAsset": "SWETH", + "quoteAsset": "ETH", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/sweth-eth", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sweth.webp" + }, + { + "assetName": "Swell Ethereum", + "baseAsset": "SWETH", + "quoteAsset": "ETH", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/sweth-eth", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/sweth.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-02-22", + "description": "Newly supported tokens: USDi", + "relatedTokens": [ + { + "assetName": "USDi Coin", + "baseAsset": "USDi", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/USDi", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdi.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": "2026-02-19", + "description": "Chainlink Data Streams is available for new blockchains:\n\n- ADI Mainnet\n- Arc Testnet\n- DogeOS Chikyu Testnet\n- Perennial Mainnet\n- Stable Mainnet\n- Stable Testnet\n\nThe verifier proxy addresses and stream IDs are available on the [Supported Networks](https://docs.chain.link/data-streams/supported-networks) page.", + "relatedNetworks": ["adi-network", "arc", "dogeos", "perennial", "stable"], + "title": "Data Streams Expands to New Blockchains", + "topic": "Data Streams" + }, + { + "category": "release", + "date": "2026-02-18", + "description": "TypeScript SDK version 1.1.0 includes improved error messages across the runtime and utilities, converts the Confidential HTTP capability to run in DON mode, and adds a descriptive error when `cre-setup` has not been run.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.9...v1.1.0)", + "title": "CRE TS SDK v1.1.0 — Error Improvements and Confidential HTTP DON Mode", + "topic": "CRE" + }, + { + "category": "deprecation", + "date": "2026-02-18", + "description": "We have announced the deprecation of select Data Feeds, scheduled for shutdown on March 4th, 2026. Check [the list of Deprecating Data Feeds to learn more](https://docs.chain.link/data-feeds/deprecating-feeds).", + "title": "Deprecating Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "integration", + "date": "2026-02-20", + "description": "Chainlink CCIP expands support to new networks:", + "newNetworks": [ + { + "displayName": "Pharos Mainnet", + "network": "pharos", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/pharos-mainnet" + }, + { + "displayName": "ADI Network Testnet", + "network": "adi-network", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/adi-network-testnet" + } + ], + "relatedNetworks": ["pharos", "adi-network"], + "title": "CCIP on Pharos Mainnet and ADI Network Testnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-02-20", + "description": "Newly supported tokens: USDi", + "relatedTokens": [ + { + "assetName": "USDi Coin", + "baseAsset": "USDi", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/USDi", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/usdi.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-02-19", + "description": "CRE CLI version 1.1.0 is now available. This release adds support for custom WASM builds and an improved CLI interface.\n\n**Required versions:** CLI v1.1.0+, Go SDK v1.2.0+, TS SDK v1.0.9+\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.11...v1.1.0)", + "title": "CRE CLI v1.1.0 — Custom WASM Builds and Improved CLI Interface", + "topic": "CRE" + }, + { + "category": "integration", + "date": "2026-02-15", + "description": "Newly supported tokens: FUSD", + "relatedTokens": [ + { + "assetName": "FinChain Dollar", + "baseAsset": "FUSD", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/FUSD", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/fusd.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": "2026-02-15", + "description": "New Data Feeds available:", + "relatedNetworks": ["ethereum", "plasma"], + "relatedTokens": [ + { + "assetName": "Circle Internet Group (Ondo API)", + "baseAsset": "CRCLon", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/crclon-usd-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/crclon.webp" + }, + { + "assetName": "Invesco QQQ (Ondo API)", + "baseAsset": "QQQon", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/qqqon-usd-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/qqqon.webp" + }, + { + "assetName": "Invesco QQQ (Ondo Tokenized ETF)", + "baseAsset": "QQQon", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/qqqon-usd-calculated-kalman-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/qqqon.webp" + }, + { + "assetName": "SNUSD / NUSD Exchange Rate", + "baseAsset": "SNUSD", + "quoteAsset": "NUSD", + "network": "plasma", + "url": "https://data.chain.link/feeds/plasma/mainnet/snusd-nusd-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/snusd.webp" + }, + { + "assetName": "SPDR S&P 500 ETF (Ondo API)", + "baseAsset": "SPYon", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/spyon-usd-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/spyon.webp" + }, + { + "assetName": "SPDR S&P 500 ETF (Ondo Tokenized ETF)", + "baseAsset": "SPYON", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/spyon-usd-calculated-kalman-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/spyon.webp" + }, + { + "assetName": "Tesla (Ondo API)", + "baseAsset": "TSLAon", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/tslaon-usd-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tslaon.webp" + }, + { + "assetName": "Tesla (Ondo Tokenized Stock)", + "baseAsset": "TSLAon", + "quoteAsset": "USD", + "network": "ethereum", + "url": "https://data.chain.link/feeds/ethereum/mainnet/tslaon-usd-calculated-kalman-shared-svr", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/tslaon.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, + { + "category": "release", + "date": "2026-02-13", + "description": "CRE CLI version 1.0.11 is now available. This release adds World Chain Mainnet support for workflow simulation and production deployment.\n\n**Required versions:** CLI v1.0.11+, Go SDK v1.2.0+, TS SDK v1.0.9+\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.10...v1.0.11)", + "title": "CRE CLI v1.0.11 — World Chain Mainnet Support", + "topic": "CRE" + }, + { + "category": "release", + "date": "2026-02-12", + "description": "Go SDK version 1.3.0 updates the Confidential HTTP capability types. The `encrypt_output` field has moved from `ConfidentialHTTPRequest` to `HTTPRequest`. Update workflows that set this field accordingly.\n\n[See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-go/compare/v1.2.0...v1.3.0)", + "title": "CRE Go SDK v1.3.0 — Confidential HTTP Type Update", + "topic": "CRE" + }, + { + "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": "2026-02-10", + "description": "Chainlink CCIP expands support to new testnets:", + "newNetworks": [ + { + "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": ["arc", "dogeos"], + "title": "CCIP on Arc Network Testnet and DogeOS Chikyu Testnet", + "topic": "CCIP" + }, + { + "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": "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": "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": "2026-02-09", + "description": "Chainlink CCIP expands support to MegaETH Mainnet:", + "newNetworks": [ + { + "displayName": "MegaETH Mainnet", + "network": "megaeth", + "url": "https://docs.chain.link/ccip/directory/mainnet/chain/megaeth-mainnet" + } + ], + "relatedNetworks": ["megaeth"], + "title": "CCIP on MegaETH Mainnet", + "topic": "CCIP" + }, + { + "category": "integration", + "date": "2026-02-08", + "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", + "pharos", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "AUSD", + "baseAsset": "AUSD", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/ausd-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/ausd.webp" + }, + { + "assetName": "Avalanche Bridged BTC", + "baseAsset": "BTC.B", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/btc.b-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/btc.b.webp" + }, + { + "assetName": "Euro Coin", + "baseAsset": "EURC", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/eurc-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/eurc.webp" + }, + { + "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/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", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2026-02-08", + "description": "New Data Feeds available:", + "relatedNetworks": ["megaeth", "avalanche"], + "relatedTokens": [ + { + "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": "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": "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://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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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" + } + ], + "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": "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": "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" + } + ], + "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": "integration", + "date": "2026-04-01", + "description": "Chainlink CCIP expands support to Tempo Testnet Moderato, replacing the deprecated Tempo Testnet.", + "newNetworks": [ + { + "displayName": "Tempo Testnet Moderato", + "network": "tempo", + "url": "https://docs.chain.link/ccip/directory/testnet/chain/tempo-testnet-moderato" + } + ], + "relatedNetworks": ["tempo"], + "title": "CCIP Expands to Tempo Testnet Moderato", + "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" }, - "xlayer": { - "displayName": "X Layer", - "iconUrl": "https://docs.chain.link/assets/chains/xlayer.svg" + { + "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" }, - "zircuit": { - "displayName": "Zircuit", - "iconUrl": "https://docs.chain.link/assets/chains/zircuit.svg" + { + "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" }, - "zksync": { - "displayName": "ZKsync", - "iconUrl": "https://docs.chain.link/assets/chains/zksync.svg" + { + "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" }, - "zora": { - "displayName": "Zora", - "iconUrl": "https://docs.chain.link/assets/chains/zora.svg" - } - }, - "data": [ { "category": "integration", "date": "2025-11-25", @@ -582,6 +5403,13 @@ "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", @@ -1343,14 +6171,6 @@ "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=hyperevm&search=LHYPE#hyperevm-mainnet", "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lhype.webp" }, - { - "assetName": "LHYPE / STHYPE Exchange Rate", - "baseAsset": "LHYPE", - "quoteAsset": "STHYPE", - "network": "hyperevm", - "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=hyperevm&search=LHYPE#hyperevm-mainnet", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/lhype.webp" - }, { "assetName": "Magic Internet Money", "baseAsset": "MIM", @@ -1649,14 +6469,6 @@ "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&network=hyperevm&search=KHYPE&testnetPage=1#hyperevm-mainnet", "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?page=1&network=hyperevm&search=KHYPE&testnetPage=1#hyperevm-mainnet", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/khype.webp" - }, { "assetName": "lBTC-BTC Exchange Rate", "baseAsset": "lBTC", @@ -2756,14 +7568,6 @@ "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=plasma&search=cusdo#plasma-mainnet", "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cusdo.webp" }, - { - "assetName": "Compounding OpenDollar", - "baseAsset": "CUSDO", - "quoteAsset": "USD", - "network": "plasma", - "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=plasma&search=cusdo#plasma-mainnet", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/cusdo.webp" - }, { "assetName": "dForce USD", "baseAsset": "USDX", @@ -2788,14 +7592,6 @@ "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=plasma&search=susde#plasma-mainnet", "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susde.webp" }, - { - "assetName": "Ethena Staked USDe", - "baseAsset": "SUSDE", - "quoteAsset": "USD", - "network": "plasma", - "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=plasma&search=susde#plasma-mainnet", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/susde.webp" - }, { "assetName": "Ethena USDe", "baseAsset": "USDE", @@ -2972,14 +7768,6 @@ "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=plasma&search=weeth#plasma-mainnet", "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/weeth.webp" }, - { - "assetName": "Wrapped eETH", - "baseAsset": "weETH", - "quoteAsset": "eETH", - "network": "plasma", - "url": "https://docs.chain.link/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=plasma&search=weeth#plasma-mainnet", - "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/weeth.webp" - }, { "assetName": "Wrapped rsETH", "baseAsset": "wrsETH", @@ -5100,7 +9888,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/files/json/feeds-tron-mainnet.json b/public/files/json/feeds-tron-mainnet.json deleted file mode 100644 index b0a484320e3..00000000000 --- a/public/files/json/feeds-tron-mainnet.json +++ /dev/null @@ -1,575 +0,0 @@ -[ - { - "compareOffchain": "", - "contractAddress": "TAenee7qFcWpZfxVkASjL52LsWBCUXHaSb", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "ETH / USD", - "pair": ["ETH", "USD"], - "path": "eth-usd", - "proxyAddress": "TBcCSYgSTMQccxgoR7Ct6hTsCm5qdErRyf", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "Ethereum", - "feedCategory": "low", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "ETH", - "baseAssetClic": "ETH_CR", - "blockchainName": "Tron", - "clicProductName": "ETH/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "TCQsFKRYKjPoxVWw81K2yGuaxRz7VWWDhK", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "WIN / USD", - "pair": ["WIN", "USD"], - "path": "win-usd", - "proxyAddress": "TGyGnajzAXXxeRdb5Cg18PRmeUWGFazSmP", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "WINkLink", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "WIN", - "baseAssetClic": "WIN_CR", - "blockchainName": "Tron", - "clicProductName": "WIN/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TG3wSZQKXbKsm44j7AYJ2FhtRbVsooHbn6", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USDC / USD", - "pair": ["USDC", "USD"], - "path": "usdc-usd", - "proxyAddress": "TA3bQbszj2k6wPSUwo3SjwL4bo6uzMe3h3", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "Circle USD", - "feedCategory": "low", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "assetSubClass": "Stablecoin", - "baseAsset": "USDC", - "baseAssetClic": "USDC_CR", - "blockchainName": "Tron", - "clicProductName": "USDC/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX", - "underlyingAsset": "USD", - "underlyingAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "THNYBB31ZUDmFWsE2sVaffC3tvt4QZuUo8", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "LTC / USD", - "pair": ["LTC", "USD"], - "path": "ltc-usd", - "proxyAddress": "TYGBSY6b3o4SkiifDCZgswm5Nsof55McMu", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "Litecoin", - "feedCategory": "low", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "LTC", - "baseAssetClic": "LTC_CR", - "blockchainName": "Tron", - "clicProductName": "LTC/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "THSMmCDzCG2jnrACRNa12NcjwGBgU9My1v", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "NFT / USD", - "pair": ["NFT", "USD"], - "path": "nft-usd", - "proxyAddress": "TLHwakfUnZmz9VLRikKBcQnwRPyBuaUa5d", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "APENFT", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "NFT", - "baseAssetClic": "NFT_CR", - "blockchainName": "Tron", - "clicProductName": "NFT/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TLYn3X4GDWLVcSeuGakqpPyUp4H1A3njqD", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "TUSD / USD", - "pair": ["TUSD", "USD"], - "path": "tusd-usd", - "proxyAddress": "TW5KxDwPriXcNmCa69cme2zB1e7ZmfjVPs", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "True USD", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "assetSubClass": "Stablecoin", - "baseAsset": "TUSD", - "baseAssetClic": "TUSD_CR", - "blockchainName": "Tron", - "clicProductName": "TUSD/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX", - "underlyingAsset": "USD", - "underlyingAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "TMxQpun1Fb6x72H8cppqwov375CiVnfDuv", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USDD / USD", - "pair": ["USDD", "USD"], - "path": "usdd-usd", - "proxyAddress": "TVPZBTUnUkg6TuVhnWfWqydhwFoq4P4ik9", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "USDD", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "assetSubClass": "Stablecoin", - "baseAsset": "USDD", - "baseAssetClic": "USDD_CR", - "blockchainName": "Tron", - "clicProductName": "USDD/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX", - "underlyingAsset": "USD", - "underlyingAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "TSpSw3FzvgdSKMzBJUvGuT1PcfLE9vrNzx", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USDT / USD", - "pair": ["USDT", "USD"], - "path": "usdt-usd", - "proxyAddress": "TH58iiFuwwvsoLxpETQmGDe2kpaNxo3NnW", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "Tether USD", - "feedCategory": "low", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "assetSubClass": "Stablecoin", - "baseAsset": "USDT", - "baseAssetClic": "USDT_CR", - "blockchainName": "Tron", - "clicProductName": "USDT/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX", - "underlyingAsset": "USD", - "underlyingAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "TT6s4JRXrfpUKjYAWQtVK8Li6CWP1yBPQn", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "BTC / USD", - "pair": ["BTC", "USD"], - "path": "btc-usd", - "proxyAddress": "TJTMLr4Szkn5sbywPamgUzrFLCR8vbJ34Y", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "Bitcoin", - "feedCategory": "low", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "BTC", - "baseAssetClic": "BTC_CR", - "blockchainName": "Tron", - "clicProductName": "BTC/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "TUJY1HT2BMwcGXA6hAaJtCzoUkKWDyFv8K", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "STRX-TRX Exchange Rate", - "pair": ["STRX", "TRX"], - "path": "strx-trx-exchcange-rate", - "proxyAddress": "TN5JU5qfvudMKbzKBAkeXoGJkBnkw9pdze", - "threshold": 1e-7, - "valuePrefix": "", - "assetName": "Staked TRX", - "feedCategory": "custom", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "assetSubClass": "Pegged Asset", - "baseAsset": "STRX", - "baseAssetClic": "STRX_CR", - "blockchainName": "Tron", - "clicProductName": "STRX/TRX-ExRate-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Exchange Rate", - "productType": "Price", - "productTypeCode": "ExRate", - "quoteAsset": "TRX", - "quoteAssetClic": "TRX_CR", - "underlyingAsset": "TRX", - "underlyingAssetClic": "TRX_CR" - }, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TUdt9Vidjn4roXbJTfUboukruVFyZKi8qj", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "SUN / USD", - "pair": ["SUN", "USD"], - "path": "sun-usd", - "proxyAddress": "TUWZWzzgyxZ6uu2mStZTtQ8es88cKmyP1Q", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "Sun", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "SUN", - "baseAssetClic": "SUN_CR", - "blockchainName": "Tron", - "clicProductName": "SUN/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TZGRhuDgwYE3Gd9gt8XkiNxqm4jLtyMZMz", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "BTT / USD", - "pair": ["BTT", "USD"], - "path": "btt-usd", - "proxyAddress": "TT1rx6zpqmFg3urAGtsnJ21prLUWCUqAkM", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "BitTorrent", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "BTT", - "baseAssetClic": "BTT_CR", - "blockchainName": "Tron", - "clicProductName": "BTT/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TViQb8UDtSz1s88EUpyngU8jiTNDpiC1Ge", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "TRX / USD", - "pair": ["TRX", "USD"], - "path": "trx-usd", - "proxyAddress": "TC6o8AakUg4Xz9nHY9qXpJNsgF7CQkwBqF", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "Tron", - "feedCategory": "low", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "TRX", - "baseAssetClic": "TRX_CR", - "blockchainName": "Tron", - "clicProductName": "TRX/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "TWkb1JyPqiSvQZxY1zEx72SkadbSM8Kf2N", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "JST / USD", - "pair": ["JST", "USD"], - "path": "jst-usd", - "proxyAddress": "TXUVn16dsALw5zLvVDF5r9xzE2Xy6DLumN", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "JUST", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "baseAsset": "JST", - "baseAssetClic": "JST_CR", - "blockchainName": "Tron", - "clicProductName": "JST/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX" - }, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TLixA99kEdH9Fx52iL5nJJobUMQSpU22Sv", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USD1 / USD", - "pair": ["USD1", "USD"], - "path": "usd1-usd", - "proxyAddress": "TKWUPnc9SLijWKxDAN7CdMmiJr1bXvHUHd", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "World Liberty Financial USD", - "feedCategory": "medium", - "feedType": "Crypto", - "docs": { - "assetClass": "Crypto", - "assetSubClass": "Stablecoin", - "baseAsset": "USD1", - "baseAssetClic": "USD1_CR", - "blockchainName": "Tron", - "clicProductName": "USD1/USD-RefPrice-DF-Tron-001", - "deliveryChannelCode": "DF", - "marketHours": "Crypto", - "productSubType": "Reference", - "productType": "Price", - "productTypeCode": "RefPrice", - "quoteAsset": "USD", - "quoteAssetClic": "USD_FX", - "underlyingAsset": "USD", - "underlyingAssetClic": "USD_FX" - }, - "decimals": 8 - } -] diff --git a/public/files/json/feeds-tron-testnet.json b/public/files/json/feeds-tron-testnet.json deleted file mode 100644 index b4e290db621..00000000000 --- a/public/files/json/feeds-tron-testnet.json +++ /dev/null @@ -1,362 +0,0 @@ -[ - { - "compareOffchain": "", - "contractAddress": "0x02AD1968e785c9A3eB12Df5dfb7deCF8AC97EDfe", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "LINK / USD", - "pair": ["LINK", "USD"], - "path": "link-usd", - "proxyAddress": "TSvmq6pfVaRqnnn3jszndEFcNn6U5SoCgK", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x03bE26cFc8eB863d8Ab3ae379d0621539f778887", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "TRX / USD", - "pair": ["TRX", "USD"], - "path": "trx-usd", - "proxyAddress": "TWZ37cpV6LJAoTNuiqEWrEUxQLvvKGmbrm", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x04fe49d999DA4A5E97C036b9BBB772d49a01A183", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "ETH / USD", - "pair": ["ETH", "USD"], - "path": "eth-usd", - "proxyAddress": "TYaLVmqGzz33ghKEMTdC64dUnde5LZc6Y3", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x0d3B963Ac3c2dd03E6Cd449613cF6ce29A9400c4", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "BTC / USD", - "pair": ["BTC", "USD"], - "path": "btc-usd", - "proxyAddress": "TD3hrfAtPcnkLSsRh4UTgjXBo6KyRfT1AR", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x37E89D89BD135674dA31338d281A1A4B58EB63f8", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "JST / USD", - "pair": ["JST", "USD"], - "path": "jst-usd", - "proxyAddress": "TA4xrS8rQWD7xTWP2mEw3YMCmcVy26GrJY", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "0x3e94F8808a33adE4A7E7CF8517a51f7136920602", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "TUSD / USD", - "pair": ["TUSD", "USD"], - "path": "tusd-usd", - "proxyAddress": "TKvumQmYhc2rbCbbZWc1uChfFQVEf4AmkM", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x4A44436e2B2128De539eA4Bf89424A2BEf04b185", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "LTC / USD", - "pair": ["LTC", "USD"], - "path": "ltc-usd", - "proxyAddress": "TCcgXMidBKZPjnzNgoJBtRiNaZUEU6d5Ra", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x50831Da70550400949EeB5a306370128C2867309", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USDD / USD", - "pair": ["USDD", "USD"], - "path": "usdd-usd", - "proxyAddress": "TNuJxt19dkrtfVVUfzWUQurkoVT9dd4nJJ", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0x5ECe9f4236c944e1c00C75955c69ea4B36b992bC", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "BTT / USD", - "pair": ["BTT", "USD"], - "path": "btt-usd", - "proxyAddress": "TA2842b4owtNzSQzPaRekrSbmaJ4oKccj6", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "0x632a5294e5af96Fad6533D747dbbe35bb64A6714", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "NFT / USD", - "pair": ["NFT", "USD"], - "path": "nft-usd", - "proxyAddress": "TDwKG5jJ7Nb2xKfBRD2WMBa3iXSxTWrkQx", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "0x7507687303001682C79a7074d044d2153e8edf8f", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USDT / USD", - "pair": ["USDT", "USD"], - "path": "usdt-usd", - "proxyAddress": "TP2G864A3FEkggdUs7aa4nehxDhs12MQWS", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0xCC1116e0ebef13E7dfc6eF18A2C741d4eC193bfF", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "WIN / USD", - "pair": ["WIN", "USD"], - "path": "win-usd", - "proxyAddress": "TN7gMhdyFvW1yowNfXGDsdVTcZdvtds5Hs", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "0xdB30Ab08DC6c1C2a261404686a732A298A01cf28", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USDC / USD", - "pair": ["USDC", "USD"], - "path": "usdc-usd", - "proxyAddress": "TXeicAAdfdaGoVmD8GtVfvqTSbuWYhXe8v", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - }, - { - "compareOffchain": "", - "contractAddress": "0xee6C42a163140a25C8Fa0E50dED43675EE6FBC05", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "1000000000000000000", - "name": "SUN / USD", - "pair": ["SUN", "USD"], - "path": "sun-usd", - "proxyAddress": "TR9JZUZdyJiqvFrVM1WpXN9ummbGMXoVzV", - "threshold": 0.5, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 18 - }, - { - "compareOffchain": "", - "contractAddress": "TQWKSBtbcuiWsXaw9cfWZ7zEcWZZHaLe8V", - "contractType": "", - "contractVersion": 6, - "decimalPlaces": null, - "ens": null, - "formatDecimalPlaces": null, - "healthPrice": "", - "heartbeat": 86400, - "history": true, - "multiply": "100000000", - "name": "USD1 / USD", - "pair": ["USD1", "USD"], - "path": "usd1-usd", - "proxyAddress": "TD5ZGYdWgqR4PrJ3pozktD96uxTkLVPyft", - "threshold": 0.3, - "valuePrefix": "", - "assetName": "", - "feedCategory": "", - "feedType": "", - "docs": {}, - "decimals": 8 - } -] 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/data-streams/canton-consumer-integration-flow.png b/public/images/data-streams/canton-consumer-integration-flow.png new file mode 100644 index 00000000000..9318461f44d Binary files /dev/null and b/public/images/data-streams/canton-consumer-integration-flow.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/llms.txt b/public/llms.txt index b9feca983bf..4998fcc16b5 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -170,4 +170,4 @@ This document offers simple, clean, and comprehensive resources for developers t ## Tools - [Chainlink Local Development Environment](https://docs.chain.link/chainlink-local): Set up a local Chainlink node environment. - [Chainlink Functions Toolkit (NPM)](https://www.npmjs.com/package/@chainlink/functions-toolkit): NPM package for working with Chainlink Functions. -- [Chainlink CCIP JavaScript SDK (GitHub)](https://github.com/smartcontractkit/ccip-javascript-sdk): SDK for building applications with CCIP. +- [CCIP Tools (GitHub)](https://github.com/smartcontractkit/ccip-tools-ts): TypeScript SDK and CLI for interacting with CCIP. diff --git a/public/robots.txt b/public/robots.txt index 36804f6fca7..90ebfd40083 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,4 +1,5 @@ User-agent: * Allow: / Disallow: -Sitemap: https://docs.chain.link/sitemap-index.xml \ No newline at end of file +Sitemap: https://docs.chain.link/sitemap-index.xml +Sitemap: https://docs.chain.link/ccip/tools/sitemap.xml \ 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/bundle-bid.json b/public/samples/DataFeeds/SVR/bundle-bid.json new file mode 100644 index 00000000000..f59f8e7344d --- /dev/null +++ b/public/samples/DataFeeds/SVR/bundle-bid.json @@ -0,0 +1,22 @@ +{ + "jsonrpc": "2.0", + "method": "mev_sendBundle", + "params": [ + { + "version": "v0.1", + "inclusion": { + "block": "0x01", + "maxBlock": "0x04" + }, + "body": [ + { + "hash": "0x_bundle_event_hash" + }, + { + "tx": "0x0213a...", + "canRevert": false + } + ] + } + ] +} diff --git a/public/samples/DataFeeds/SVR/bundle-transaction-event.json b/public/samples/DataFeeds/SVR/bundle-transaction-event.json new file mode 100644 index 00000000000..e47973374e8 --- /dev/null +++ b/public/samples/DataFeeds/SVR/bundle-transaction-event.json @@ -0,0 +1,15 @@ +{ + "hash": "0x_bundle_event_hash", + "txs": [ + { + "to": "0x45ab36b69e02e59d3c49b863b31f530c991dd554", + "functionSelector": "0x6fadcf72", + "callData": "0x80640b.....................a2354d" + }, + { + "to": "0x45ab36b69e02e59d3c49b863b31f530c991dd554", + "functionSelector": "0x6fadcf72", + "callData": "0x12340b.....................a2354d" + } + ] +} 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/DataFeeds/SVR/single-transaction-event.json b/public/samples/DataFeeds/SVR/single-transaction-event.json new file mode 100644 index 00000000000..313f36e10a8 --- /dev/null +++ b/public/samples/DataFeeds/SVR/single-transaction-event.json @@ -0,0 +1,10 @@ +{ + "hash": "0x_single_transaction_event_hash", + "txs": [ + { + "to": "0x45ab36b69e02e59d3c49b863b31f530c991dd554", + "functionSelector": "0x6fadcf72", + "callData": "0x80640b.....................a2354d" + } + ] +} 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/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..4bf84bc4f9c 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, @@ -14,9 +15,11 @@ import ChainHero from "~/components/CCIP/ChainHero/ChainHero" import ChainTable from "~/components/CCIP/Tables/ChainTable" import { getTokenIconUrl } from "~/features/utils" import ChainTokenGrid from "./ChainTokenGrid" +import { fetchAllPoolData } from "~/lib/ccip/graphql/services/enrichment-data-service.ts" 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 +51,19 @@ const lanes = await getAllNetworkLanes({ const searchLanes = getSearchLanes({ environment }) +const allPoolData = await fetchAllPoolData(environment) +const poolDataByToken: Record = {} +for (const [tokenId, chainPoolData] of Object.entries(allPoolData)) { + if (chainPoolData[network.chain]) { + poolDataByToken[tokenId] = chainPoolData[network.chain] + } +} + +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 +122,7 @@ const chainStructuredData = generateChainStructuredData( network={network} environment={environment} lanes={searchLanes} + verifiers={allVerifiers} client:load />
@@ -127,19 +144,22 @@ const chainStructuredData = generateChainStructuredData(

Tokens ({allTokens.length})

{ - network.chainType !== "solana" && network.chainType !== "aptos" && ( - - Add - Add my token - + network.chainType !== "solana" && network.chainType !== "aptos" && network.chainType !== "ton" && ( + ) }
- +
@@ -180,6 +200,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 +221,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..ea3886c7ca2 100644 --- a/src/components/CCIP/Chain/ChainTokenGrid.tsx +++ b/src/components/CCIP/Chain/ChainTokenGrid.tsx @@ -1,12 +1,14 @@ import { Environment, Version, Network } from "~/config/data/ccip/types.ts" -import { getAllTokenLanes, getTokenData } from "~/config/data/ccip/data.ts" +import type { PoolType } from "~/config/data/ccip/types.ts" +import { 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" import "./ChainTokenGrid.css" import SeeMore from "../SeeMore/SeeMore.tsx" +import type { PoolInfo } from "~/lib/ccip/graphql/services/enrichment-data-service.ts" interface ChainTokenGridProps { tokens: { @@ -16,11 +18,12 @@ interface ChainTokenGridProps { }[] network: Network environment: Environment + poolDataByToken?: Record } const BEFORE_SEE_MORE = 6 * 4 // Number of networks to show before the "See more" button, 7 rows x 4 items -function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { +function ChainTokenGrid({ tokens, network, environment, poolDataByToken }: ChainTokenGridProps) { const [seeMore, setSeeMore] = useState(tokens.length <= BEFORE_SEE_MORE) return ( <> @@ -36,7 +39,9 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { id={token.id} logo={token.logo} key={token.id} + variant="square" onClick={() => { + const poolInfo = poolDataByToken?.[token.id] const selectedNetwork = Object.keys(data) .map((key) => { const supportedChain = directoryToSupportedChain(key || "") @@ -53,8 +58,10 @@ 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: (poolInfo?.type ?? data[key].pool?.type ?? "burnMint") as PoolType, + tokenPoolRawType: poolInfo?.rawType ?? data[key].pool?.rawType ?? "", + tokenPoolAddress: poolInfo?.address ?? data[key].pool?.address ?? "", + tokenPoolVersion: poolInfo?.version ?? data[key].pool?.version ?? "", explorer: network.explorer, chainType, } @@ -62,11 +69,7 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { .find((n) => n.key === network.key) if (selectedNetwork) { - const destinationLanes = getAllTokenLanes({ - environment, - version: Version.V1_2_0, - token: token.id, - })[selectedNetwork.key] + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( )) diff --git a/src/components/CCIP/ChainHero/ChainHero.css b/src/components/CCIP/ChainHero/ChainHero.css index 34c38f7ae17..f57070a0b3c 100644 --- a/src/components/CCIP/ChainHero/ChainHero.css +++ b/src/components/CCIP/ChainHero/ChainHero.css @@ -1,7 +1,6 @@ .ccip-chain-hero { - background-color: var(--gray-100); + background: var(--Page-Background-Alt); border-bottom: 1px solid var(--gray-200); - min-height: 241px; } .ccip-chain-hero__heading { @@ -17,6 +16,12 @@ margin: 0; font-size: 28px; font-weight: 500; + display: flex; + align-items: center; + gap: 8px; + position: relative; + overflow: visible; + line-height: var(--space-6x); } .ccip-chain-hero__heading img { @@ -121,7 +126,8 @@ .ccip-chain-hero__token-logo__symbol { font-weight: 500; font-size: 18px; - color: var(--gray-700); + color: var(--Page-Foreground-Muted, #6c7585); + align-self: self-end; } .ccip-chain-hero__feeTokens__list { @@ -164,6 +170,12 @@ padding: var(--space-10x) var(--space-8x); } + /* Drawer-specific styles to match drawer heading width */ + .ccip-chain-hero--drawer .ccip-chain-hero__content { + padding: var(--space-10x); + margin: 0; + } + .ccip-chain-hero__fee-tokens-group-item { grid-column: 1 / -1; /* Span all columns */ } diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx index bbeba6b171f..b6199ff352f 100644 --- a/src/components/CCIP/ChainHero/ChainHero.tsx +++ b/src/components/CCIP/ChainHero/ChainHero.tsx @@ -24,6 +24,7 @@ interface ChainHeroProps { totalTokens: number logo: string chain: string + chainSelector: string }[] tokens: { id: string @@ -46,6 +47,13 @@ interface ChainHeroProps { } lane: LaneConfig }[] + verifiers?: { + id: string + name: string + type: string + logo: string + totalNetworks: number + }[] network?: Network token?: { id: string @@ -54,9 +62,22 @@ interface ChainHeroProps { symbol: string } environment: Environment + breadcrumbItems?: Array<{ + name: string + url: string + }> } -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 +120,70 @@ function ChainHero({ chains, tokens, network, token, environment, lanes }: Chain
- +
-
- { - currentTarget.onerror = null // prevents looping - currentTarget.src = fallbackTokenIconUrl - }} - /> -

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

-
+

+ {network?.name || token?.id} + + {token?.id === "USDC" ? "USD Coin" : token?.name} + + + {chainTooltipConfig && ( + + )} +

+
+ )} {network && (
@@ -189,7 +225,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..984aebd9151 100644 --- a/src/components/CCIP/ChainHero/TokenDetailsHero.tsx +++ b/src/components/CCIP/ChainHero/TokenDetailsHero.tsx @@ -1,9 +1,8 @@ import Address from "~/components/AddressReact.tsx" import { getExplorerAddressUrl, fallbackTokenIconUrl } from "~/features/utils/index.ts" -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 { formatPoolTypeForDisplay } from "~/lib/ccip/graphql/utils/type-version-parser.ts" interface TokenDetailsHeroProps { network: { @@ -19,18 +18,19 @@ interface TokenDetailsHeroProps { logo: string decimals: number address: string - poolType: PoolType + poolRawType: string poolAddress: string } + inDrawer?: boolean } -function TokenDetailsHero({ network, token }: TokenDetailsHeroProps) { +function TokenDetailsHero({ network, token, inDrawer = false }: TokenDetailsHeroProps) { return ( -
+
- +
Token pool type
-
{tokenPoolDisplay(token.poolType)}
+
+ {token.poolRawType ? formatPoolTypeForDisplay(token.poolRawType) : "—"} +
Token pool address
diff --git a/src/components/CCIP/Drawer/Drawer.css b/src/components/CCIP/Drawer/Drawer.css index f42721fad1d..0b8d48a4d6a 100644 --- a/src/components/CCIP/Drawer/Drawer.css +++ b/src/components/CCIP/Drawer/Drawer.css @@ -52,6 +52,11 @@ width: 75%; } + /* Wide drawer for lane details - full width minus ESC button width and spacing */ + .drawer__container--wide { + width: calc(100% - var(--space-12x) - var(--space-8x)); + } + .drawer__closeMobile { display: none; } diff --git a/src/components/CCIP/Drawer/Drawer.tsx b/src/components/CCIP/Drawer/Drawer.tsx index 9120bb98b0f..7846947b9dc 100644 --- a/src/components/CCIP/Drawer/Drawer.tsx +++ b/src/components/CCIP/Drawer/Drawer.tsx @@ -1,6 +1,6 @@ import { useStore } from "@nanostores/react" import "./Drawer.css" -import { drawerContentStore } from "./drawerStore.ts" +import { drawerContentStore, drawerWidthStore, DrawerWidth } from "./drawerStore.ts" import { useRef, useEffect, useState } from "react" import { clsx } from "~/lib/clsx/clsx.ts" import type { ReactNode } from "react" @@ -9,6 +9,7 @@ function Drawer() { const drawerRef = useRef(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} > -
+
@@ -551,7 +551,7 @@ export const NetworkDropdown = ({ userAddress }: Props) => {
diff --git a/src/features/ccip/components/billing/Billing.astro b/src/features/ccip/components/billing/Billing.astro index ef8ca7eef19..64af032f3c8 100644 --- a/src/features/ccip/components/billing/Billing.astro +++ b/src/features/ccip/components/billing/Billing.astro @@ -6,11 +6,28 @@ import { } from "@config/data/ccip" 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 restFromEthereumToNonEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromEthereumToNonEthereum" +) +const restFromEthereumToSolana = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromEthereumToSolana" +) +const restFromNonEthereumToEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromNonEthereumToEthereum" +) +const restFromNonEthereumToNonEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromNonEthereumToNonEthereum" +) +const restFromNonEthereumToSolana = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromNonEthereumToSolana" +) const messagingFeesFromToEthereum = calculateMessagingNetworkFeesDirect("fromToEthereum") -const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("nonEthereum") +const messagingFeesFromNonEthereumToNonEthereum = calculateMessagingNetworkFeesDirect("fromNonEthereumToNonEthereum") ---
@@ -19,7 +36,8 @@ const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("nonEthereu Use case Token Pool Mechanism - Lanes + Source Chain + Destination Chain Fee Token @@ -30,46 +48,70 @@ const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("nonEthereu - +
  • Token Transfers
  • Programmable Token Transfers
Lock and Unlock - All Lanes + All Chains + All Chains {lockAndUnlockAllLanes.linkFee} {lockAndUnlockAllLanes.gasTokenFee} + + Lock and Mint
Burn and Mint
Burn and Unlock + Ethereum + Not Ethereum + {restFromEthereumToNonEthereum.linkFee} + {restFromEthereumToNonEthereum.gasTokenFee} + - Lock and Mint
Burn and Mint
Burn and Unlock - Non-Ethereum - {restMechanismNonEthereum.linkFee} - {restMechanismNonEthereum.gasTokenFee} + Ethereum + Solana + {restFromEthereumToSolana.linkFee} + {restFromEthereumToSolana.gasTokenFee} - From: Ethereum - {restFromEthereum.linkFee} - {restFromEthereum.gasTokenFee} + Not Ethereum + Solana + {restFromNonEthereumToSolana.linkFee} + {restFromNonEthereumToSolana.gasTokenFee} - To: Ethereum - {restToEthereum.linkFee} - {restToEthereum.gasTokenFee} + Not Ethereum + Ethereum + {restFromNonEthereumToEthereum.linkFee} + {restFromNonEthereumToEthereum.gasTokenFee} - - Messaging - N/A - Non-Ethereum - {messagingFeesNonEthereum.linkFee} - {messagingFeesNonEthereum.gasTokenFee} + Not Ethereum + Not Ethereum + {restFromNonEthereumToNonEthereum.linkFee} + {restFromNonEthereumToNonEthereum.gasTokenFee} + + + + Messaging + N/A + Ethereum + Any + {messagingFeesFromToEthereum.linkFee} + {messagingFeesFromToEthereum.gasTokenFee} - From/To: Ethereum + Any + Ethereum {messagingFeesFromToEthereum.linkFee} {messagingFeesFromToEthereum.gasTokenFee} + + Not Ethereum + Not Ethereum + {messagingFeesFromNonEthereumToNonEthereum.linkFee} + {messagingFeesFromNonEthereumToNonEthereum.gasTokenFee} +
@@ -86,4 +128,7 @@ const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("nonEthereu padding: 1em; white-space: nowrap; } + tr.section-divider td { + border-top: 3px solid #bbb; + } diff --git a/src/features/ccip/components/billing/TokenCalculator.tsx b/src/features/ccip/components/billing/TokenCalculator.tsx index 29e3eb4ed9b..5c43622ccb8 100644 --- a/src/features/ccip/components/billing/TokenCalculator.tsx +++ b/src/features/ccip/components/billing/TokenCalculator.tsx @@ -58,6 +58,7 @@ const fetchData = (endpoint: string, fetchParams: Partial = {}): Fe version, }) + if (!mechanism) return { fees: { token, mechanism: undefined, fee: undefined } } const networkFee = calculateNetworkFeesForTokenMechanism(mechanism, sourceBlockchain, destinationBlockchain) return { fees: { token, mechanism, fee: networkFee } } 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/common/Tooltip/SimplePreactTooltip.tsx b/src/features/common/Tooltip/SimplePreactTooltip.tsx index 1c7c5993d07..0dc630d6524 100644 --- a/src/features/common/Tooltip/SimplePreactTooltip.tsx +++ b/src/features/common/Tooltip/SimplePreactTooltip.tsx @@ -4,7 +4,7 @@ import { useState } from "preact/hooks" export const SimplePreactTooltip = ({ label, tip, - imgURL = "https://smartcontract.imgix.net/icons/info.svg?auto=compress%2Cformat", + imgURL = "https://d2f70xi62kby8n.cloudfront.net/icons/info.svg?auto=compress%2Cformat", labelStyle = {}, tooltipStyle = {}, }) => { diff --git a/src/features/common/Tooltip/Tooltip.tsx b/src/features/common/Tooltip/Tooltip.tsx index e7dd9eb3ba8..37a2c2ca398 100644 --- a/src/features/common/Tooltip/Tooltip.tsx +++ b/src/features/common/Tooltip/Tooltip.tsx @@ -45,7 +45,7 @@ interface TooltipProps { /** * URL for the tooltip icon. Defaults to Chainlink's info icon. - * @default "https://smartcontract.imgix.net/icons/info.svg?auto=compress%2Cformat" + * @default "https://d2f70xi62kby8n.cloudfront.net/icons/info.svg?auto=compress%2Cformat" */ imgURL?: string @@ -138,7 +138,7 @@ interface TooltipProps { export const Tooltip = ({ label, tip, - imgURL = "https://smartcontract.imgix.net/icons/info.svg?auto=compress%2Cformat", + imgURL = "https://d2f70xi62kby8n.cloudfront.net/icons/info.svg?auto=compress%2Cformat", style = {}, labelStyle = {}, position = "top", 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-streams/common/dsNotes.mdx b/src/features/data-streams/common/dsNotes.mdx index 4e076a0b994..c336255f801 100644 --- a/src/features/data-streams/common/dsNotes.mdx +++ b/src/features/data-streams/common/dsNotes.mdx @@ -1,6 +1,6 @@ import { Aside } from "@components" diff --git a/src/features/data/api/backend.ts b/src/features/data/api/backend.ts index fb3dc24aa13..14ffc98fc0d 100644 --- a/src/features/data/api/backend.ts +++ b/src/features/data/api/backend.ts @@ -2,15 +2,18 @@ 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 - type: "json", // we'll parse JSON for you + duration: skipCache ? "0s" : "1d", + type: "json", }).then((metadata) => ({ ...nw, metadata: metadata.filter( @@ -26,7 +29,7 @@ export const getServerSideChainMetadata = async (chains: Chain[]): Promise { + const mainnets: ChainNetwork[] = [] + for (const chain of chains) { + for (const network of chain.networks) { + if (network.networkType === "mainnet") { + mainnets.push(network) + } + } + } + mainnets.sort((a, b) => a.name.localeCompare(b.name, "en")) + return mainnets +} + export const ALL_CHAINS: Chain[] = [ { page: "deprecated", @@ -873,138 +850,7 @@ export const ALL_CHAINS: Chain[] = [ networkStatusUrl: "https://ethstats.dev/", tags: ["default", "smartData"], supportedFeatures: ["feeds"], - networks: [ - { - name: "Ethereum Mainnet", - explorerUrl: "https://etherscan.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-mainnet.json", - queryString: "ethereum-mainnet", - tags: ["smartData"], - }, - { - name: "BNB Chain Mainnet", - explorerUrl: "https://bscscan.com/address/%s", - networkType: "mainnet", - tags: ["smartData"], - rddUrl: "https://reference-data-directory.vercel.app/feeds-bsc-mainnet.json", - queryString: "bnb-mainnet", - }, - { - name: "Polygon Mainnet", - explorerUrl: "https://polygonscan.com/address/%s", - networkType: "mainnet", - tags: ["smartData"], - rddUrl: "https://reference-data-directory.vercel.app/feeds-matic-mainnet.json", - queryString: "polygon-mainnet", - }, - { - name: "Gnosis Chain Mainnet", - explorerUrl: "https://gnosisscan.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-xdai-mainnet.json", - queryString: "gnosis-mainnet", - }, - { - name: "Avalanche Mainnet", - explorerUrl: "https://snowtrace.io/address/%s", - networkType: "mainnet", - tags: ["smartData"], - rddUrl: "https://reference-data-directory.vercel.app/feeds-avalanche-mainnet.json", - queryString: "avalanche-mainnet", - }, - { - name: "Fantom Mainnet", - explorerUrl: "https://ftmscan.com/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-fantom-mainnet.json", - queryString: "fantom-mainnet", - }, - { - name: "Arbitrum Mainnet", - explorerUrl: "https://arbiscan.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-arbitrum-1.json", - queryString: "arbitrum-mainnet", - }, - { - name: "OP Mainnet", - explorerUrl: "https://optimistic.etherscan.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-optimism-1.json", - queryString: "optimism-mainnet", - }, - { - name: "Moonriver Mainnet", - explorerUrl: "https://moonriver.moonscan.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-kusama-mainnet-moonriver.json", - queryString: "moonriver-mainnet", - }, - { - name: "Moonbeam Mainnet", - explorerUrl: "https://moonscan.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-polkadot-mainnet-moonbeam.json", - queryString: "moonbeam-mainnet", - }, - { - name: "Metis Mainnet", - explorerUrl: "https://andromeda-explorer.metis.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-andromeda-1.json", - queryString: "metis-mainnet", - }, - { - name: "Base Mainnet", - explorerUrl: "https://basescan.org/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-base-1.json", - queryString: "base-mainnet", - }, - { - name: "Celo Mainnet", - explorerUrl: "https://explorer.celo.org/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-celo-mainnet.json", - queryString: "celo-mainnet", - }, - { - name: "Scroll Mainnet", - explorerUrl: "https://scrollscan.com/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-scroll-1.json", - queryString: "scroll-mainnet", - }, - { - name: "Linea Mainnet", - explorerUrl: "https://lineascan.build/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-linea-1.json", - queryString: "linea-mainnet", - }, - { - name: "ZKsync Era Mainnet", - explorerUrl: "https://explorer.zksync.io/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-zksync-1.json", - queryString: "zksync-mainnet", - }, - { - name: "Polygon zkEVM Mainnet", - explorerUrl: "https://zkevm.polygonscan.com/address/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-polygon-zkevm-1.json", - queryString: "polygon-zkevm-mainnet", - }, - { - name: "Solana Mainnet", - explorerUrl: "https://solscan.io/account/%s", - networkType: "mainnet", - rddUrl: "https://reference-data-directory.vercel.app/feeds-solana-mainnet.json", - queryString: "solana-mainnet", - }, - ], + networks: allMainnetNetworksFromChains(CHAINS), label: "All", }, ] diff --git a/src/features/feeds/components/FeedList.module.css b/src/features/feeds/components/FeedList.module.css index 83303f563d0..116898065ed 100644 --- a/src/features/feeds/components/FeedList.module.css +++ b/src/features/feeds/components/FeedList.module.css @@ -84,7 +84,7 @@ div.shutDate > hr { .filterDropdown_searchInput { height: 42px; border: var(--border-width-primary) solid var(--color-border-primary); - background-image: url(https://smartcontract.imgix.net/icons/searchIcon_blue_noborder.svg?auto=compress%2Cformat); + background-image: url(https://d2f70xi62kby8n.cloudfront.net/icons/searchIcon_blue_noborder.svg?auto=compress%2Cformat); background-repeat: no-repeat; background-position: left var(--space-2x) top 50%; padding-left: var(--space-8x); @@ -139,7 +139,7 @@ div.shutDate > hr { padding: var(--space-3x) var(--space-6x) var(--space-3x) var(--space-4x); border: var(--border-width-primary) solid var(--color-border-primary); border-radius: var(--border-radius-primary); - background-image: url(https://smartcontract.imgix.net/icons/Caret.svg?auto=compress%2Cformat); + background-image: url(https://d2f70xi62kby8n.cloudfront.net/icons/Caret.svg?auto=compress%2Cformat); background-repeat: no-repeat; background-position: right var(--space-2x) top 50%; list-style: none; diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index f3071e16b08..e5f87de7769 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -1,6 +1,6 @@ /** @jsxImportSource preact */ import { useEffect, useState, useRef, useMemo } from "preact/hooks" -import { MainnetTable, TestnetTable, StreamsNetworkAddressesTable } from "./Tables.tsx" +import { MainnetTable, TestnetTable, StreamsNetworkAddressesTable, StreamsTHead, StreamsTr } from "./Tables.tsx" import feedList from "./FeedList.module.css" import tableStyles from "./Tables.module.css" import { clsx } from "~/lib/clsx/clsx.ts" @@ -13,14 +13,16 @@ import { getFeedCategories } from "../../../db/feedCategories.js" import SectionWrapper from "~/components/SectionWrapper/SectionWrapper.tsx" import button from "@chainlink/design-system/button.module.css" import { updateTableOfContents } from "~/components/TableOfContents/tocStore.ts" -import alertIcon from "../../../components/Alert/Assets/alert-icon.svg" import { ChainSelector } from "~/components/ChainSelector/ChainSelector.tsx" +import { isFeedVisible } from "../utils/feedVisibility.ts" +import { updateUrlClean, clearFilters } from "./urlStateHelpers.ts" export type DataFeedType = | "default" | "smartdata" | "rates" | "usGovernmentMacroeconomicData" + | "tokenizedEquity" | "streamsCrypto" | "streamsRwa" | "streamsNav" @@ -29,6 +31,7 @@ export type DataFeedType = type SchemaFilterValue = "all" | "v8" | "v11" type StreamsRwaFeedTypeValue = "all" | "datalink" | "equities" | "forex" +type TradingHoursFilterValue = "all" | "regular" | "extended" | "overnight" type FilterOption = { 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) && (
)} + {isTokenizedEquityFeed && ( + + )} + {stablecoinBound && ( + + )}
{metadata.docs.shutdownDate && (
@@ -271,30 +367,40 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d )}
-
- - - {metadata.proxyAddress ?? metadata.transmissionsAccount} - -
+ {shouldHideAddress ? ( + // Calculated-price feeds show a contact email instead of proxy address + + Contact us:{" "} + + {TOKENIZED_EQUITY_CONTACT_EMAIL} + + + ) : ( +
+ + + {metadata.proxyAddress ?? metadata.transmissionsAccount} + +
+ )}
{metadata.assetName && ( @@ -336,31 +442,43 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d {isAaveSVR(metadata) ? "AAVE SVR Proxy:" : "SVR Proxy:"}
- - - {metadata.secondaryProxyAddress} - + {shouldHideAddress ? ( + // Calculated-price feeds show a contact email instead of SVR proxy address + + Contact us:{" "} + + {TOKENIZED_EQUITY_CONTACT_EMAIL} + + + ) : ( + <> + + + {metadata.secondaryProxyAddress} + + + )}
- {isAaveSVR(metadata) && ( + {isAaveSVR(metadata) && !shouldHideAddress && (
⚠️ Aave Dedicated Feed: This SVR proxy feed is dedicated exclusively for use by the Aave protocol. Learn more about{" "} @@ -370,7 +488,7 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d .
)} - {isSharedSVR(metadata) && ( + {isSharedSVR(metadata) && !shouldHideAddress && (
🔗 SVR Feed: This SVR proxy feed is usable by any protocol. Learn more about{" "} @@ -408,19 +526,15 @@ 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 + + // Stablecoin price-bound note for Stablecoin Stability Assessment feeds + const isStablecoinAssessment = metadata.docs?.assetClass === "Stablecoin Stability Assessment" + const stablecoinBound = isStablecoinAssessment + ? getMaxSubmissionValueBound(metadata.maxSubmissionValue, metadata.decimals) + : null return ( @@ -472,6 +586,18 @@ const SmartDataTr = ({ network, metadata, showExtraDetails, batchedCategoryData
)} + {stablecoinBound && ( + + )} @@ -630,11 +756,34 @@ const SmartDataTr = ({ network, metadata, showExtraDetails, batchedCategoryData export const StreamsNetworkAddressesTable = ({ allowExpansion = false, defaultExpanded = false, + initialSearch = "", }: { allowExpansion?: boolean defaultExpanded?: boolean + initialSearch?: string } = {}) => { - const [searchValue, setSearchValue] = useState("") + // null = untouched; string = user has set a value + const [searchState, setSearchState] = useState(null) + + const urlSearch = + typeof window !== "undefined" ? (new URLSearchParams(window.location.search).get("streamsNetwork") ?? "") : "" + + // Priority: user-typed value → SSR prop (when Astro can pass it) → URL param (client fallback) + const searchValue = searchState ?? (initialSearch || urlSearch) + + const updateSearch = (value: string) => { + setSearchState(value) + if (typeof window === "undefined") return + const params = new URLSearchParams(window.location.search) + if (value) { + params.set("streamsNetwork", value) + } else { + params.delete("streamsNetwork") + } + const queryString = params.toString() + const newUrl = window.location.pathname + (queryString ? "?" + queryString : "") + window.location.hash + window.history.replaceState({ path: newUrl }, "", newUrl) + } const normalizedSearch = searchValue.toLowerCase().replaceAll(" ", "") @@ -663,10 +812,10 @@ export const StreamsNetworkAddressesTable = ({ placeholder="Search" className={feedList.filterDropdown_searchInput} value={searchValue} - onInput={(e) => setSearchValue((e.target as HTMLInputElement).value)} + onInput={(e) => updateSearch((e.target as HTMLInputElement).value)} /> {searchValue && ( - )} @@ -682,7 +831,7 @@ export const StreamsNetworkAddressesTable = ({ - {filteredNetworks.length === 0 ? ( + {typeof window === "undefined" ? null : filteredNetworks.length === 0 ? ( No results found @@ -719,9 +868,19 @@ export const StreamsNetworkAddressesTable = ({ {network.network}
- {network.mainnet?.label} + + {network.mainnet?.label} + {network.mainnet?.note && ( +
+ )} + - {network.isSolana ? ( + {network.isCanton ? ( + See Canton integration guide → + ) : network.isSolana ? ( <>
Verifier Program ID: @@ -767,7 +926,15 @@ export const StreamsNetworkAddressesTable = ({
)} - {network.testnet?.label} + + {network.testnet?.label} + {network.testnet?.note && ( +
+ )} + {network.isSolana ? ( <> @@ -841,7 +1008,7 @@ export const StreamsNetworkAddressesTable = ({ ) } -const StreamsTHead = () => ( +export const StreamsTHead = () => ( Stream @@ -861,204 +1028,297 @@ const streamsCategoryMap = { }, } -const StreamsTr = ({ metadata, isMainnet }) => ( - - -
- {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.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} + {(() => { + 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 + })()} +
+
+ + + ) +} export const MainnetTable = ({ network, @@ -1068,6 +1328,8 @@ export const MainnetTable = ({ showOnlyDEXFeeds, rwaSchemaFilter, streamCategoryFilter, + show24x5Feeds, + tradingHoursFilter, dataFeedType, ecosystem, selectedFeedCategories, @@ -1077,6 +1339,7 @@ export const MainnetTable = ({ currentPage, paginate, searchValue, + tokenizedEquityProvider, }: { network: ChainNetwork showExtraDetails: boolean @@ -1085,6 +1348,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 +1359,7 @@ export const MainnetTable = ({ currentPage: number paginate searchValue: string + tokenizedEquityProvider?: string }) => { if (!network.metadata) return null @@ -1110,122 +1376,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 +1474,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( @@ -1290,7 +1526,7 @@ export const MainnetTable = ({

No results found

@@ -1368,6 +1604,9 @@ export const TestnetTable = ({ showOnlyDEXFeeds, rwaSchemaFilter, streamCategoryFilter, + show24x5Feeds, + tradingHoursFilter, + tokenizedEquityProvider, }: { network: ChainNetwork showExtraDetails: boolean @@ -1383,6 +1622,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 +1641,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 +1729,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( @@ -1565,7 +1763,7 @@ export const TestnetTable = ({

No results found

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..057a37913c2 100644 --- a/src/features/feeds/data/StreamsNetworksData.ts +++ b/src/features/feeds/data/StreamsNetworksData.ts @@ -2,8 +2,9 @@ export type NetworkDetails = { verifierProxy?: string verifierProgramId?: string accessController?: string - explorerUrl: string + explorerUrl?: string label: string + note?: string } export type NetworkData = { @@ -14,6 +15,7 @@ export type NetworkData = { testnet?: NetworkDetails message?: string isSolana?: boolean + isCanton?: boolean } export const StreamsNetworksData: NetworkData[] = [ @@ -32,6 +34,15 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://chainscan-galileo.0g.ai/address/%s", }, }, + { + network: "ADI Network", + logoUrl: "/assets/chains/adi-network.svg", + mainnet: { + label: "ADI Mainnet", + verifierProxy: "0x29b289DC5f840762FBF605FF4DF37df18FdA4e7a", + explorerUrl: "https://explorer.adifoundation.ai/address/%s", + }, + }, { network: "Apechain", logoUrl: "/assets/chains/apechain.svg", @@ -76,6 +87,15 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://sepolia.arbiscan.io/address/%s", }, }, + { + network: "Arc", + logoUrl: "/assets/chains/arc.svg", + testnet: { + label: "Arc Testnet", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://testnet.arcscan.app/address/%s", + }, + }, { network: "Avalanche", logoUrl: "/assets/chains/avalanche.svg", @@ -193,6 +213,15 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://testnet.botanixscan.io/address/%s", }, }, + { + network: "Canton", + logoUrl: "/assets/chains/canton.svg", + isCanton: true, + mainnet: { + label: "Canton Network", + note: "Uses a party-specific VerifierConfig Contract ID issued by Chainlink.", + }, + }, { network: "Celo", logoUrl: "/assets/chains/celo.svg", @@ -221,6 +250,24 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://sepolia.etherscan.io/address/%s", }, }, + { + network: "DogeOS", + logoUrl: "/assets/chains/dogeos.svg", + testnet: { + label: "DogeOS Chikyu Testnet", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://blockscout.testnet.dogeos.com/address/%s", + }, + }, + { + network: "Giwa", + logoUrl: "/assets/chains/giwa.svg", + testnet: { + label: "Giwa Sepolia", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://sepolia-explorer.giwa.io/address/%s", + }, + }, { network: "Gnosis", logoUrl: "/assets/chains/gnosis-chain.svg", @@ -283,12 +330,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", }, }, { @@ -312,7 +359,12 @@ export const StreamsNetworksData: NetworkData[] = [ mainnet: { label: "Injective EVM Mainnet", verifierProxy: "0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB", - explorerUrl: "https://injscan.com/account/inj1vra207kffxhnjt0usk84m9lramaq060t75latq/", // Note: Injective uses Bech32 address format, hardcoding here to avoid confusion + explorerUrl: "https://injscan.com/account/inj1vra207kffxhnjt0usk84m9lramaq060t75latq/", + }, + testnet: { + label: "Injective Testnet", + verifierProxy: "0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB", + explorerUrl: "https://testnet.explorer.injective.network/account/inj1wfusl84c9k6f9f7akmf27g4zwrwv8kmyt3r45r/", }, }, { @@ -391,10 +443,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 +511,34 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://sepolia-optimism.etherscan.io/address/%s", }, }, + { + network: "Perennial", + logoUrl: "/assets/chains/perennial.svg", + mainnet: { + label: "Perennial Mainnet", + verifierProxy: "0xC539169910DE08D237Df0d73BcDa9074c787A4a1", + explorerUrl: "https://explorer.perennial.foundation/address/%s", + }, + testnet: { + label: "Perennial Testnet", + verifierProxy: "0xF94Fc3DfD2875AECBEfDA8b7bFA05884fbF1E042", + explorerUrl: "https://explorer-sepolia.perennial.foundation/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", @@ -484,6 +569,15 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://testnet.plasmascan.to/address/%s", }, }, + { + network: "Robinhood Chain", + logoUrl: "/assets/chains/ronin.svg", + testnet: { + label: "Robinhood Chain Testnet", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://explorer.testnet.chain.robinhood.com/address/%s", + }, + }, { network: "Ronin", logoUrl: "/assets/chains/ronin.svg", @@ -527,6 +621,15 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://testnet.seitrace.com/address/%s", }, }, + { + network: "Seismic", + logoUrl: "/assets/chains/seismic.svg", + testnet: { + label: "Seismic Testnet", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://seismic-testnet.socialscan.io/address/%s", + }, + }, { network: "Shibarium", logoUrl: "/assets/chains/shibarium.svg", @@ -587,6 +690,35 @@ export const StreamsNetworksData: NetworkData[] = [ explorerUrl: "https://explorer.solana.com/address/%s?cluster=devnet", }, }, + { + network: "Stable", + logoUrl: "/assets/chains/stable.svg", + mainnet: { + label: "Stable Mainnet", + verifierProxy: "0x06034790F8b6c2573B91704BeC6Ab380cB590237", + explorerUrl: "https://stablescan.xyz/address/%s", + }, + testnet: { + label: "Stable Testnet", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://testnet.stablescan.xyz/address/%s", + }, + }, + { + network: "X Layer", + logoUrl: "/assets/chains/xlayer.svg", + networkStatus: "https://status.xlayer.tech/", + mainnet: { + label: "X Layer Mainnet", + verifierProxy: "0xcE73c8ad08CBDEaCa6078BF0627C8fe0a9a536E7", + explorerUrl: "https://web3.okx.com/explorer/x-layer/address/%s", + }, + testnet: { + label: "X Layer Testnet", + verifierProxy: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64", + explorerUrl: "https://web3.okx.com/explorer/x-layer-testnet/address/%s", + }, + }, { network: "Taiko", logoUrl: "/assets/chains/taiko.svg", diff --git a/src/features/feeds/utils/feedVisibility.ts b/src/features/feeds/utils/feedVisibility.ts new file mode 100644 index 00000000000..5293c671353 --- /dev/null +++ b/src/features/feeds/utils/feedVisibility.ts @@ -0,0 +1,188 @@ +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) + // Only show true tokenized equity feeds (primaryTokenizedPrice) on this page. + // Generic equity price feeds (e.g. RefPrice) are excluded — they are not + // tokenized equity instruments and should not appear here. + isVisible = + feed.docs?.assetClass === "Equity" && + feed.contractType !== "verifier" && + feed.docs?.productTypeCode === "primaryTokenizedPrice" + } 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/notifications/data/index.ts b/src/features/notifications/data/index.ts index 58e1b3af575..c5e24f1533f 100644 --- a/src/features/notifications/data/index.ts +++ b/src/features/notifications/data/index.ts @@ -5,5 +5,5 @@ export const NotificationData: BannerContent = { type: "info", linkText: "Start Building.", linkUrl: - "https://chain.link/chainlink-runtime-environment/?utm_source=chainlink-docs&utm_campaign=smartcon-2025&utm_medium=referral", + "https://chain.link/chainlink-runtime-environment?utm_campaign=global-app-banner&utm_medium=referral&utm_source=docs.chain.link", } diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index a059180af4f..a00a4d4d04b 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -2187,7 +2187,7 @@ }, { "source": "ccip/tutorials/get-status-offchain", - "destination": "ccip/tutorials/evm/offchain/get-status-offchain", + "destination": "ccip/tutorials/offchain", "statusCode": 301 }, { @@ -2195,11 +2195,6 @@ "destination": "ccip/tutorials/evm/manual-execution", "statusCode": 301 }, - { - "source": "ccip/tutorials/offchain", - "destination": "ccip/tutorials/evm/offchain", - "statusCode": 301 - }, { "source": "ccip/tutorials/programmable-token-transfers-defensive", "destination": "ccip/tutorials/evm/programmable-token-transfers-defensive", @@ -2237,7 +2232,7 @@ }, { "source": "ccip/tutorials/transfer-tokens-from-eoa", - "destination": "ccip/tutorials/evm/offchain/transfer-tokens-from-eoa", + "destination": "ccip/tutorials/offchain", "statusCode": 301 }, { @@ -2567,7 +2562,107 @@ }, { "source": "ccip/tools-resources/tools", - "destination": "ccip/tools-resources/cli", + "destination": "https://docs.chain.link/ccip/tools/", + "statusCode": 301 + }, + { + "source": "ccip/tools-resources/sdk", + "destination": "https://docs.chain.link/ccip/tools/", + "statusCode": 301 + }, + { + "source": "ccip/tools-resources/cli", + "destination": "https://docs.chain.link/ccip/tools/", + "statusCode": 301 + }, + { + "source": "ccip/ccip-javascript-sdk", + "destination": "https://docs.chain.link/ccip/tools/", + "statusCode": 301 + }, + { + "source": "ccip/tools-resources/ccip-tools", + "destination": "https://docs.chain.link/ccip/tools/", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain", + "destination": "ccip/tutorials/offchain", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain/transfer-tokens-from-eoa", + "destination": "ccip/tutorials/offchain", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain/get-status-offchain", + "destination": "ccip/tutorials/offchain", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain/ccip-tools", + "destination": "ccip/tutorials/offchain", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa", + "destination": "ccip/tutorials/offchain", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain", + "destination": "ccip/tutorials/offchain", + "statusCode": 301 + }, + { + "source": "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens", + "destination": "ccip/tutorials/offchain", + "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..2c71c2123ed 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 @@ -117,10 +118,28 @@ export const getChainTypeAndFamily = (supportedChain: SupportedChain): ChainType chainFamily = "evm" break case "aptos": - chainFamily = "mvm" + chainFamily = "aptos" + break + case "sui": + chainFamily = "sui" break case "solana": - chainFamily = "svm" + chainFamily = "solana" + break + case "tron": + chainFamily = "tron" + break + case "canton": + chainFamily = "canton" + break + case "ton": + chainFamily = "ton" + break + case "stellar": + chainFamily = "stellar" + break + case "starknet": + chainFamily = "starknet" break default: throw new Error(`Unknown chain type: ${chainType}`) @@ -156,10 +175,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 +296,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 +324,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 +426,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 +540,39 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "NEXON_HENESYS_MAINNET" case "pharos-atlantic-testnet": return "PHAROS_ATLANTIC_TESTNET" + case "pharos-mainnet": + return "PHAROS_MAINNET" + 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 "tempo-testnet-moderato": + return "TEMPO_TESTNET_MODERATO" + case "arc-testnet": + return "ARC_NETWORK_TESTNET" + case "doge-os-chikyu-testnet": + case "dogeos-testnet-chikyu": + return "DOGE_OS_CHIKYU_TESTNET" + case "adi-testnet": + return "ADI_NETWORK_AB_TESTNET" + case "adi-mainnet": + return "ADI_NETWORK_MAINNET" + case "edge-testnet": + return "EDGE_TESTNET" + case "edge-mainnet": + return "EDGE_MAINNET" + case "robinhood-testnet": + return "ROBINHOOD_TESTNET" + case "ton-testnet": + return "TON_TESTNET" default: throw Error(`Chain not found ${chainInRdd}`) } @@ -595,6 +654,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 +682,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 +780,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 +892,38 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "nexon-mainnet-henesys" case "PHAROS_ATLANTIC_TESTNET": return "pharos-atlantic-testnet" + case "PHAROS_MAINNET": + return "pharos-mainnet" + 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 "TEMPO_TESTNET_MODERATO": + return "tempo-testnet-moderato" + case "ARC_NETWORK_TESTNET": + return "arc-testnet" + case "DOGE_OS_CHIKYU_TESTNET": + return "dogeos-testnet-chikyu" + case "ADI_NETWORK_AB_TESTNET": + return "adi-testnet" + case "ADI_NETWORK_MAINNET": + return "adi-mainnet" + case "EDGE_TESTNET": + return "edge-testnet" + case "EDGE_MAINNET": + return "edge-mainnet" + case "ROBINHOOD_TESTNET": + return "robinhood-testnet" + case "TON_TESTNET": + return "ton-testnet" 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/features/vrf/v2/components/Dropdown.tsx b/src/features/vrf/v2/components/Dropdown.tsx index 612b025fbf8..087d2c691a8 100644 --- a/src/features/vrf/v2/components/Dropdown.tsx +++ b/src/features/vrf/v2/components/Dropdown.tsx @@ -82,7 +82,7 @@ export const Dropdown = ({ placeholder = "Select a network...", options }: Props onInput={handleInputChange} /> Caret icon diff --git a/src/hooks/useLaneTokens.ts b/src/hooks/useLaneTokens.ts new file mode 100644 index 00000000000..5321a4458d8 --- /dev/null +++ b/src/hooks/useLaneTokens.ts @@ -0,0 +1,62 @@ +import { useMemo } from "react" +import { LaneFilter } from "~/config/data/ccip/types.ts" +import { getTokenIconUrl } from "~/features/utils/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" +import type { TokenLaneData } from "~/lib/ccip/types/index.ts" + +export interface ProcessedToken { + id: string + tokenAddress: string + decimals: number + sourcePoolType: string + destPoolType: string + 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 + rateLimitsData: Record + inOutbound: LaneFilter + searchQuery: string +} + +export function useLaneTokens({ tokens, 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 tokenLaneData = rateLimitsData[token] + if (!tokenLaneData) return null + + const logo = getTokenIconUrl(token) + const allLimits = realtimeDataService.getAllRateLimitsForDirection(tokenLaneData.rateLimits, direction) + const isPaused = allLimits.standard?.capacity === "0" + + return { + id: token, + tokenAddress: tokenLaneData.tokenAddress ?? "", + decimals: tokenLaneData.tokenDecimals ?? 0, + sourcePoolType: tokenLaneData.sourcePoolType ?? "", + destPoolType: tokenLaneData.destPoolType ?? "", + logo, + rateLimits: allLimits, + isPaused, + } + }) + .filter((token): token is ProcessedToken => token !== null) + }, [tokens, 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..997ba61a430 --- /dev/null +++ b/src/hooks/useMultiLaneRateLimits.ts @@ -0,0 +1,78 @@ +import { useState, useEffect } from "react" +import type { TokenLaneData, 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/useTokenDirectory.ts b/src/hooks/useTokenDirectory.ts new file mode 100644 index 00000000000..7fe2c106abb --- /dev/null +++ b/src/hooks/useTokenDirectory.ts @@ -0,0 +1,63 @@ +import { useState, useEffect } from "react" +import type { TokenDirectoryData, Environment } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface UseTokenDirectoryResult { + data: TokenDirectoryData | null + isLoading: boolean + error: Error | null +} + +/** + * Fetches full token directory data for a specific token/chain combination. + * A single call returns outboundLanes + inboundLanes with rate limits, verifiers, + * pool info, and custom finality — replacing N separate rate-limit requests. + * + * @param tokenCanonicalSymbol - Token canonical symbol (e.g., "LINK") + * @param chain - Source chain directory key (e.g., "mainnet", "bsc-mainnet") + * @param environment - Network environment (mainnet/testnet) + */ +export function useTokenDirectory( + tokenCanonicalSymbol: string, + chain: string, + environment: Environment +): UseTokenDirectoryResult { + const [data, setData] = useState(null) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let isMounted = true + + const fetchData = async () => { + setIsLoading(true) + setError(null) + + try { + const response = await realtimeDataService.getTokenDirectoryData(tokenCanonicalSymbol, chain, environment) + + if (isMounted) { + setData(response?.data ?? null) + } + } catch (err) { + if (isMounted) { + console.error("Error fetching token directory data:", err) + setError(err instanceof Error ? err : new Error("Failed to fetch token directory data")) + setData(null) + } + } finally { + if (isMounted) { + setIsLoading(false) + } + } + } + + fetchData() + + return () => { + isMounted = false + } + }, [tokenCanonicalSymbol, chain, environment]) + + return { data, isLoading, error } +} diff --git a/src/hooks/useTokenFinality.ts b/src/hooks/useTokenFinality.ts new file mode 100644 index 00000000000..fd0e521ae52 --- /dev/null +++ b/src/hooks/useTokenFinality.ts @@ -0,0 +1,66 @@ +import { useState, useEffect } from "react" +import type { CustomFinalityConfig, 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..f920e908095 --- /dev/null +++ b/src/hooks/useTokenRateLimits.ts @@ -0,0 +1,65 @@ +import { useState, useEffect } from "react" +import type { TokenLaneData, 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..9b7b6be9c52 --- /dev/null +++ b/src/lib/api/cacheHeaders.ts @@ -0,0 +1,64 @@ +/** + * Shared cache and CORS 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) + * + * CORS Policy: + * - Open access (Access-Control-Allow-Origin: *) + * - Public, read-only API designed for cross-origin consumption + */ + +/** + * CORS headers for cross-origin access + * Enables browser-based clients (dApps, scripts) to consume the API + */ +export const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", +} + +/** + * 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", + ...corsHeaders, + ...standardCacheHeaders, +} + +/** + * Cache headers for application/json responses + * Used by: /api/ccip/v1/* endpoints + */ +export const jsonHeaders = { + "Content-Type": "application/json", + ...corsHeaders, + ...standardCacheHeaders, +} + +/** + * Common headers without caching directives + * For endpoints that need custom cache control + */ +export const commonHeaders = { + "Content-Type": "application/json", + ...corsHeaders, +} diff --git a/src/lib/ccip/__tests__/validate-internal-id-format.test.ts b/src/lib/ccip/__tests__/validate-internal-id-format.test.ts new file mode 100644 index 00000000000..f5d22ab6f1d --- /dev/null +++ b/src/lib/ccip/__tests__/validate-internal-id-format.test.ts @@ -0,0 +1,65 @@ +import { describe, it, expect } from "@jest/globals" +import { validateInternalIdFormat, CCIPError } from "~/lib/ccip/utils.ts" + +describe("validateInternalIdFormat", () => { + describe("valid inputs", () => { + it("should accept 'selector' format", () => { + expect(validateInternalIdFormat("selector")).toBe("selector") + }) + + it("should accept 'directory' format", () => { + expect(validateInternalIdFormat("directory")).toBe("directory") + }) + }) + + describe("default behavior", () => { + it("should default to 'selector' when undefined", () => { + expect(validateInternalIdFormat(undefined)).toBe("selector") + }) + + it("should default to 'selector' for empty string", () => { + // Empty string is falsy, should trigger default + expect(validateInternalIdFormat("")).toBe("selector") + }) + }) + + describe("invalid inputs", () => { + it("should throw CCIPError for 'invalid'", () => { + expect(() => validateInternalIdFormat("invalid")).toThrow(CCIPError) + }) + + it("should throw CCIPError for 'chainId'", () => { + expect(() => validateInternalIdFormat("chainId")).toThrow(CCIPError) + }) + + it("should throw CCIPError for 'selectorName'", () => { + expect(() => validateInternalIdFormat("selectorName")).toThrow(CCIPError) + }) + + it("should throw CCIPError for 'internal'", () => { + expect(() => validateInternalIdFormat("internal")).toThrow(CCIPError) + }) + + it("should throw CCIPError for 'SELECTOR' (case-sensitive)", () => { + expect(() => validateInternalIdFormat("SELECTOR")).toThrow(CCIPError) + }) + + it("should throw CCIPError for 'DIRECTORY' (case-sensitive)", () => { + expect(() => validateInternalIdFormat("DIRECTORY")).toThrow(CCIPError) + }) + }) + + describe("error details", () => { + it("should throw CCIPError with correct message", () => { + try { + validateInternalIdFormat("invalid") + fail("Expected CCIPError to be thrown") + } catch (error) { + expect(error).toBeInstanceOf(CCIPError) + const ccipError = error as CCIPError + expect(ccipError.message).toBe('internalIdFormat must be "directory" or "selector".') + expect(ccipError.statusCode).toBe(400) + } + }) + }) +}) diff --git a/src/pages/api/ccip/faucet/adapters/index.ts b/src/lib/ccip/faucet/adapters/index.ts similarity index 80% rename from src/pages/api/ccip/faucet/adapters/index.ts rename to src/lib/ccip/faucet/adapters/index.ts index 1a27125ced8..ac5723acc41 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 @@ -11,7 +11,7 @@ export const prerender = false export class FaucetAdapterFactory { static getAdapter(family: ChainFamily): FamilyAdapter { switch (family) { - case "svm": + case "solana": return new SvmAdapter() default: throw new Error(`Faucet not available for chain family: ${family}`) @@ -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 91% rename from src/pages/api/ccip/faucet/adapters/svm-drip.ts rename to src/lib/ccip/faucet/adapters/svm-drip.ts index 4fc62dba32a..eb0fb9ae979 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 @@ -103,7 +103,7 @@ export class SvmDripAdapter { * Check if drip is available for the given chain */ isDripAvailable(chainConfig: FaucetChainConfig): boolean { - return !!(chainConfig.enabled && chainConfig.family === "svm" && chainConfig.faucetAddress) + return !!(chainConfig.enabled && chainConfig.family === "solana" && chainConfig.faucetAddress) } /** diff --git a/src/pages/api/ccip/faucet/adapters/svm.ts b/src/lib/ccip/faucet/adapters/svm.ts similarity index 98% rename from src/pages/api/ccip/faucet/adapters/svm.ts rename to src/lib/ccip/faucet/adapters/svm.ts index cf156985bf9..1096e5de69d 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" @@ -133,7 +133,7 @@ export class SvmAdapter implements FamilyAdapter { logger.error({ message: "Error during signature verification", requestId: args.requestId, - family: "svm", + family: "solana", error: error instanceof Error ? error.message : "Unknown error", step: "verification_error", }) 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/lib/ccip/graphql/__generated__/.gitkeep b/src/lib/ccip/graphql/__generated__/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/lib/ccip/graphql/__generated__/fragment-masking.ts b/src/lib/ccip/graphql/__generated__/fragment-masking.ts new file mode 100644 index 00000000000..c7b1b9749d2 --- /dev/null +++ b/src/lib/ccip/graphql/__generated__/fragment-masking.ts @@ -0,0 +1,88 @@ +/* eslint-disable */ +import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from "@graphql-typed-document-node/core" +import { FragmentDefinitionNode } from "graphql" +import { Incremental } from "./graphql.js" + +export type FragmentType> = + TDocumentType extends DocumentTypeDecoration + ? [TType] extends [{ " $fragmentName"?: infer TKey }] + ? TKey extends string + ? { " $fragmentRefs"?: { [key in TKey]: TType } } + : never + : never + : never + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> +): TType +// return nullable if `fragmentType` is undefined +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | undefined +): TType | undefined +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | null +): TType | null +// return nullable if `fragmentType` is nullable or undefined +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | null | undefined +): TType | null | undefined +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: Array>> +): Array +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: Array>> | null | undefined +): Array | null | undefined +// return readonly array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> +): ReadonlyArray +// return readonly array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> | null | undefined +): ReadonlyArray | null | undefined +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: + | FragmentType> + | Array>> + | ReadonlyArray>> + | null + | undefined +): TType | Array | ReadonlyArray | null | undefined { + return fragmentType as any +} + +export function makeFragmentData, FT extends ResultOf>( + data: FT, + _fragment: F +): FragmentType { + return data as FragmentType +} +export function isFragmentReady( + queryNode: DocumentTypeDecoration, + fragmentNode: TypedDocumentNode, + data: FragmentType, any>> | null | undefined +): data is FragmentType { + const deferredFields = (queryNode as { __meta__?: { deferredFields: Record } }).__meta__ + ?.deferredFields + + if (!deferredFields) return true + + const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined + const fragName = fragDef?.name?.value + + const fields = (fragName && deferredFields[fragName]) || [] + return fields.length > 0 && fields.every((field) => data && field in data) +} diff --git a/src/lib/ccip/graphql/__generated__/gql.ts b/src/lib/ccip/graphql/__generated__/gql.ts new file mode 100644 index 00000000000..906b5098d4b --- /dev/null +++ b/src/lib/ccip/graphql/__generated__/gql.ts @@ -0,0 +1,59 @@ +/* eslint-disable */ +import * as types from "./graphql.js" +import { TypedDocumentNode as DocumentNode } from "@graphql-typed-document-node/core" + +/** + * Map of all GraphQL operations in the project. + * + * This map has several performance disadvantages: + * 1. It is not tree-shakeable, so it will include all operations in the project. + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. + * 3. It does not support dead code elimination, so it will add unused operations. + * + * Therefore it is highly recommended to use the babel or swc plugin for production. + * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size + */ +type Documents = { + "\n query GetTokenPoolLanesWithPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolLanesWithPoolCondition\n $filter: CcipTokenPoolLanesWithPoolFilter\n ) {\n allCcipTokenPoolLanesWithPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n tokenDecimals\n remoteNetworkName\n remoteToken\n removed\n typeAndVersion\n tokenPool\n inboundCapacity\n inboundRate\n inboundEnabled\n outboundCapacity\n outboundRate\n outboundEnabled\n customInboundCapacity\n customInboundRate\n customInboundEnabled\n customOutboundCapacity\n customOutboundRate\n customOutboundEnabled\n }\n totalCount\n }\n }\n": typeof types.GetTokenPoolLanesWithPoolsDocument + "\n query GetTokenPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolCondition\n $filter: CcipTokenPoolFilter\n ) {\n allCcipTokenPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n typeAndVersion\n minBlockConfirmations\n tokenPool\n }\n totalCount\n }\n }\n": typeof types.GetTokenPoolsDocument +} +const documents: Documents = { + "\n query GetTokenPoolLanesWithPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolLanesWithPoolCondition\n $filter: CcipTokenPoolLanesWithPoolFilter\n ) {\n allCcipTokenPoolLanesWithPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n tokenDecimals\n remoteNetworkName\n remoteToken\n removed\n typeAndVersion\n tokenPool\n inboundCapacity\n inboundRate\n inboundEnabled\n outboundCapacity\n outboundRate\n outboundEnabled\n customInboundCapacity\n customInboundRate\n customInboundEnabled\n customOutboundCapacity\n customOutboundRate\n customOutboundEnabled\n }\n totalCount\n }\n }\n": + types.GetTokenPoolLanesWithPoolsDocument, + "\n query GetTokenPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolCondition\n $filter: CcipTokenPoolFilter\n ) {\n allCcipTokenPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n typeAndVersion\n minBlockConfirmations\n tokenPool\n }\n totalCount\n }\n }\n": + types.GetTokenPoolsDocument, +} + +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + * + * + * @example + * ```ts + * const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`); + * ``` + * + * The query argument is unknown! + * Please regenerate the types. + */ +export function gql(source: string): unknown + +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function gql( + source: "\n query GetTokenPoolLanesWithPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolLanesWithPoolCondition\n $filter: CcipTokenPoolLanesWithPoolFilter\n ) {\n allCcipTokenPoolLanesWithPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n tokenDecimals\n remoteNetworkName\n remoteToken\n removed\n typeAndVersion\n tokenPool\n inboundCapacity\n inboundRate\n inboundEnabled\n outboundCapacity\n outboundRate\n outboundEnabled\n customInboundCapacity\n customInboundRate\n customInboundEnabled\n customOutboundCapacity\n customOutboundRate\n customOutboundEnabled\n }\n totalCount\n }\n }\n" +): (typeof documents)["\n query GetTokenPoolLanesWithPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolLanesWithPoolCondition\n $filter: CcipTokenPoolLanesWithPoolFilter\n ) {\n allCcipTokenPoolLanesWithPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n tokenDecimals\n remoteNetworkName\n remoteToken\n removed\n typeAndVersion\n tokenPool\n inboundCapacity\n inboundRate\n inboundEnabled\n outboundCapacity\n outboundRate\n outboundEnabled\n customInboundCapacity\n customInboundRate\n customInboundEnabled\n customOutboundCapacity\n customOutboundRate\n customOutboundEnabled\n }\n totalCount\n }\n }\n"] +/** + * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function gql( + source: "\n query GetTokenPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolCondition\n $filter: CcipTokenPoolFilter\n ) {\n allCcipTokenPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n typeAndVersion\n minBlockConfirmations\n tokenPool\n }\n totalCount\n }\n }\n" +): (typeof documents)["\n query GetTokenPools(\n $first: Int\n $offset: Int\n $condition: CcipTokenPoolCondition\n $filter: CcipTokenPoolFilter\n ) {\n allCcipTokenPools(\n first: $first\n offset: $offset\n condition: $condition\n filter: $filter\n orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC]\n ) {\n nodes {\n network\n token\n tokenSymbol\n typeAndVersion\n minBlockConfirmations\n tokenPool\n }\n totalCount\n }\n }\n"] + +export function gql(source: string) { + return (documents as any)[source] ?? {} +} + +export type DocumentType> = + TDocumentNode extends DocumentNode ? TType : never diff --git a/src/lib/ccip/graphql/__generated__/graphql.ts b/src/lib/ccip/graphql/__generated__/graphql.ts new file mode 100644 index 00000000000..f82b2705373 --- /dev/null +++ b/src/lib/ccip/graphql/__generated__/graphql.ts @@ -0,0 +1,3342 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from "@graphql-typed-document-node/core" +export type Maybe = T | null +export type InputMaybe = T | null | undefined +export type Exact = { [K in keyof T]: T[K] } +export type MakeOptional = Omit & { [SubKey in K]?: Maybe } +export type MakeMaybe = Omit & { [SubKey in K]: Maybe } +export type MakeEmpty = { [_ in K]?: never } +export type Incremental = T | { [P in keyof T]?: P extends " $fragmentName" | "__typename" ? T[P] : never } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string } + String: { input: string; output: string } + Boolean: { input: boolean; output: boolean } + Int: { input: number; output: number } + Float: { input: number; output: number } + /** A floating point number that requires more precision than IEEE 754 binary 64 */ + BigFloat: { input: any; output: any } + /** + * A signed eight-byte integer. The upper big integer values are greater than the + * max value for a JavaScript number. Therefore all big integers will be output as + * strings and not numbers. + */ + BigInt: { input: any; output: any } + /** A location in a connection that can be used for resuming pagination. */ + Cursor: { input: any; output: any } + /** + * A point in time as described by the [ISO + * 8601](https://en.wikipedia.org/wiki/ISO_8601) standard. May or may not include a timezone. + */ + Datetime: { input: any; output: any } + /** The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */ + JSON: { input: any; output: any } +} + +/** A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ */ +export type BooleanFilter = { + /** Equal to the specified value. */ + equalTo?: InputMaybe + /** Greater than the specified value. */ + greaterThan?: InputMaybe + /** Greater than or equal to the specified value. */ + greaterThanOrEqualTo?: InputMaybe + /** Included in the specified list. */ + in?: InputMaybe> + /** Less than the specified value. */ + lessThan?: InputMaybe + /** Less than or equal to the specified value. */ + lessThanOrEqualTo?: InputMaybe + /** Not equal to the specified value. */ + notEqualTo?: InputMaybe +} + +export type CcipAllLaneStatus = { + __typename?: "CcipAllLaneStatus" + destNetworkName?: Maybe + routerAddress?: Maybe + sourceNetworkName?: Maybe + successRate?: Maybe +} + +/** + * A condition to be used against `CcipAllLaneStatus` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipAllLaneStatusCondition = { + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `successRate` field. */ + successRate?: InputMaybe +} + +/** A filter to be used against `CcipAllLaneStatus` object types. All fields are combined with a logical ‘and.’ */ +export type CcipAllLaneStatusFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `successRate` field. */ + successRate?: InputMaybe +} + +/** A connection to a list of `CcipAllLaneStatus` values. */ +export type CcipAllLaneStatusesConnection = { + __typename?: "CcipAllLaneStatusesConnection" + /** A list of edges which contains the `CcipAllLaneStatus` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipAllLaneStatus` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipAllLaneStatus` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipAllLaneStatus` edge in the connection. */ +export type CcipAllLaneStatusesEdge = { + __typename?: "CcipAllLaneStatusesEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipAllLaneStatus` at the end of the edge. */ + node: CcipAllLaneStatus +} + +/** Methods to use when ordering `CcipAllLaneStatus`. */ +export enum CcipAllLaneStatusesOrderBy { + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + Natural = "NATURAL", + RouterAddressAsc = "ROUTER_ADDRESS_ASC", + RouterAddressDesc = "ROUTER_ADDRESS_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + SuccessRateAsc = "SUCCESS_RATE_ASC", + SuccessRateDesc = "SUCCESS_RATE_DESC", +} + +export type CcipFastTransferFill = { + __typename?: "CcipFastTransferFill" + amount?: Maybe + fillId?: Maybe + filler?: Maybe + messageId?: Maybe + receiver?: Maybe + sendTransactionHash?: Maybe + settlementInfo?: Maybe +} + +/** + * A condition to be used against `CcipFastTransferFill` object types. All fields + * are tested for equality and combined with a logical ‘and.’ + */ +export type CcipFastTransferFillCondition = { + /** Checks for equality with the object’s `amount` field. */ + amount?: InputMaybe + /** Checks for equality with the object’s `fillId` field. */ + fillId?: InputMaybe + /** Checks for equality with the object’s `filler` field. */ + filler?: InputMaybe + /** Checks for equality with the object’s `messageId` field. */ + messageId?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `sendTransactionHash` field. */ + sendTransactionHash?: InputMaybe + /** Checks for equality with the object’s `settlementInfo` field. */ + settlementInfo?: InputMaybe +} + +/** A filter to be used against `CcipFastTransferFill` object types. All fields are combined with a logical ‘and.’ */ +export type CcipFastTransferFillFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `fillId` field. */ + fillId?: InputMaybe + /** Filter by the object’s `filler` field. */ + filler?: InputMaybe + /** Filter by the object’s `messageId` field. */ + messageId?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `sendTransactionHash` field. */ + sendTransactionHash?: InputMaybe + /** Filter by the object’s `settlementInfo` field. */ + settlementInfo?: InputMaybe +} + +/** A connection to a list of `CcipFastTransferFill` values. */ +export type CcipFastTransferFillsConnection = { + __typename?: "CcipFastTransferFillsConnection" + /** A list of edges which contains the `CcipFastTransferFill` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipFastTransferFill` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipFastTransferFill` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipFastTransferFill` edge in the connection. */ +export type CcipFastTransferFillsEdge = { + __typename?: "CcipFastTransferFillsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipFastTransferFill` at the end of the edge. */ + node: CcipFastTransferFill +} + +/** Methods to use when ordering `CcipFastTransferFill`. */ +export enum CcipFastTransferFillsOrderBy { + AmountAsc = "AMOUNT_ASC", + AmountDesc = "AMOUNT_DESC", + FillerAsc = "FILLER_ASC", + FillerDesc = "FILLER_DESC", + FillIdAsc = "FILL_ID_ASC", + FillIdDesc = "FILL_ID_DESC", + MessageIdAsc = "MESSAGE_ID_ASC", + MessageIdDesc = "MESSAGE_ID_DESC", + Natural = "NATURAL", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + SendTransactionHashAsc = "SEND_TRANSACTION_HASH_ASC", + SendTransactionHashDesc = "SEND_TRANSACTION_HASH_DESC", + SettlementInfoAsc = "SETTLEMENT_INFO_ASC", + SettlementInfoDesc = "SETTLEMENT_INFO_DESC", +} + +export type CcipLaneStatus = { + __typename?: "CcipLaneStatus" + destNetworkName?: Maybe + routerAddress?: Maybe + sourceNetworkName?: Maybe + successRate?: Maybe +} + +/** + * A condition to be used against `CcipLaneStatus` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipLaneStatusCondition = { + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `successRate` field. */ + successRate?: InputMaybe +} + +/** A filter to be used against `CcipLaneStatus` object types. All fields are combined with a logical ‘and.’ */ +export type CcipLaneStatusFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `successRate` field. */ + successRate?: InputMaybe +} + +/** A connection to a list of `CcipLaneStatus` values. */ +export type CcipLaneStatusesConnection = { + __typename?: "CcipLaneStatusesConnection" + /** A list of edges which contains the `CcipLaneStatus` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipLaneStatus` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipLaneStatus` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipLaneStatus` edge in the connection. */ +export type CcipLaneStatusesEdge = { + __typename?: "CcipLaneStatusesEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipLaneStatus` at the end of the edge. */ + node: CcipLaneStatus +} + +/** Methods to use when ordering `CcipLaneStatus`. */ +export enum CcipLaneStatusesOrderBy { + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + Natural = "NATURAL", + RouterAddressAsc = "ROUTER_ADDRESS_ASC", + RouterAddressDesc = "ROUTER_ADDRESS_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + SuccessRateAsc = "SUCCESS_RATE_ASC", + SuccessRateDesc = "SUCCESS_RATE_DESC", +} + +export type CcipLaneTimeEstimate = { + __typename?: "CcipLaneTimeEstimate" + commitMs?: Maybe + destNetworkName?: Maybe + finalityMs?: Maybe + routerAddress?: Maybe + sourceNetworkName?: Maybe + totalMs?: Maybe + transferMs?: Maybe +} + +/** + * A condition to be used against `CcipLaneTimeEstimate` object types. All fields + * are tested for equality and combined with a logical ‘and.’ + */ +export type CcipLaneTimeEstimateCondition = { + /** Checks for equality with the object’s `commitMs` field. */ + commitMs?: InputMaybe + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `finalityMs` field. */ + finalityMs?: InputMaybe + /** Checks for equality with the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `totalMs` field. */ + totalMs?: InputMaybe + /** Checks for equality with the object’s `transferMs` field. */ + transferMs?: InputMaybe +} + +/** A filter to be used against `CcipLaneTimeEstimate` object types. All fields are combined with a logical ‘and.’ */ +export type CcipLaneTimeEstimateFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe +} + +/** A connection to a list of `CcipLaneTimeEstimate` values. */ +export type CcipLaneTimeEstimatesConnection = { + __typename?: "CcipLaneTimeEstimatesConnection" + /** A list of edges which contains the `CcipLaneTimeEstimate` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipLaneTimeEstimate` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipLaneTimeEstimate` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipLaneTimeEstimate` edge in the connection. */ +export type CcipLaneTimeEstimatesEdge = { + __typename?: "CcipLaneTimeEstimatesEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipLaneTimeEstimate` at the end of the edge. */ + node: CcipLaneTimeEstimate +} + +/** Methods to use when ordering `CcipLaneTimeEstimate`. */ +export enum CcipLaneTimeEstimatesOrderBy { + CommitMsAsc = "COMMIT_MS_ASC", + CommitMsDesc = "COMMIT_MS_DESC", + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + FinalityMsAsc = "FINALITY_MS_ASC", + FinalityMsDesc = "FINALITY_MS_DESC", + Natural = "NATURAL", + RouterAddressAsc = "ROUTER_ADDRESS_ASC", + RouterAddressDesc = "ROUTER_ADDRESS_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + TotalMsAsc = "TOTAL_MS_ASC", + TotalMsDesc = "TOTAL_MS_DESC", + TransferMsAsc = "TRANSFER_MS_ASC", + TransferMsDesc = "TRANSFER_MS_DESC", +} + +export type CcipMessage = { + __typename?: "CcipMessage" + arm?: Maybe + blessBlockNumber?: Maybe + blessBlockTimestamp?: Maybe + blessLogIndex?: Maybe + blessTransactionHash?: Maybe + commitBlockNumber?: Maybe + commitBlockTimestamp?: Maybe + commitLogIndex?: Maybe + commitStore?: Maybe + commitTransactionHash?: Maybe + data?: Maybe + destChainId?: Maybe + destNetworkName?: Maybe + destRouterAddress?: Maybe + feeToken?: Maybe + feeTokenAmount?: Maybe + gasLimit?: Maybe + info?: Maybe + infoRaw?: Maybe + max?: Maybe + messageId?: Maybe + min?: Maybe + nonce?: Maybe + offrampAddress?: Maybe + onrampAddress?: Maybe + origin?: Maybe + permissionLessExecutionThresholdSeconds?: Maybe + receiptBlock?: Maybe + receiptFinalized?: Maybe + receiptLogIndex?: Maybe + receiptTimestamp?: Maybe + receiptTransactionHash?: Maybe + receiver?: Maybe + root?: Maybe + routerAddress?: Maybe + sendBlock?: Maybe + sendFinalized?: Maybe + sendLogIndex?: Maybe + sendTimestamp?: Maybe + sendTransactionHash?: Maybe + sender?: Maybe + sequenceNumber?: Maybe + sourceChainId?: Maybe + sourceNetworkName?: Maybe + state?: Maybe + strict?: Maybe + tokenAmounts?: Maybe + votes?: Maybe +} + +/** + * A condition to be used against `CcipMessage` object types. All fields are tested + * for equality and combined with a logical ‘and.’ + */ +export type CcipMessageCondition = { + /** Checks for equality with the object’s `arm` field. */ + arm?: InputMaybe + /** Checks for equality with the object’s `blessBlockNumber` field. */ + blessBlockNumber?: InputMaybe + /** Checks for equality with the object’s `blessBlockTimestamp` field. */ + blessBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `blessLogIndex` field. */ + blessLogIndex?: InputMaybe + /** Checks for equality with the object’s `blessTransactionHash` field. */ + blessTransactionHash?: InputMaybe + /** Checks for equality with the object’s `commitBlockNumber` field. */ + commitBlockNumber?: InputMaybe + /** Checks for equality with the object’s `commitBlockTimestamp` field. */ + commitBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `commitLogIndex` field. */ + commitLogIndex?: InputMaybe + /** Checks for equality with the object’s `commitStore` field. */ + commitStore?: InputMaybe + /** Checks for equality with the object’s `commitTransactionHash` field. */ + commitTransactionHash?: InputMaybe + /** Checks for equality with the object’s `data` field. */ + data?: InputMaybe + /** Checks for equality with the object’s `destChainId` field. */ + destChainId?: InputMaybe + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `destRouterAddress` field. */ + destRouterAddress?: InputMaybe + /** Checks for equality with the object’s `feeToken` field. */ + feeToken?: InputMaybe + /** Checks for equality with the object’s `feeTokenAmount` field. */ + feeTokenAmount?: InputMaybe + /** Checks for equality with the object’s `gasLimit` field. */ + gasLimit?: InputMaybe + /** Checks for equality with the object’s `info` field. */ + info?: InputMaybe + /** Checks for equality with the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Checks for equality with the object’s `max` field. */ + max?: InputMaybe + /** Checks for equality with the object’s `messageId` field. */ + messageId?: InputMaybe + /** Checks for equality with the object’s `min` field. */ + min?: InputMaybe + /** Checks for equality with the object’s `nonce` field. */ + nonce?: InputMaybe + /** Checks for equality with the object’s `offrampAddress` field. */ + offrampAddress?: InputMaybe + /** Checks for equality with the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for equality with the object’s `origin` field. */ + origin?: InputMaybe + /** Checks for equality with the object’s `permissionLessExecutionThresholdSeconds` field. */ + permissionLessExecutionThresholdSeconds?: InputMaybe + /** Checks for equality with the object’s `receiptBlock` field. */ + receiptBlock?: InputMaybe + /** Checks for equality with the object’s `receiptFinalized` field. */ + receiptFinalized?: InputMaybe + /** Checks for equality with the object’s `receiptLogIndex` field. */ + receiptLogIndex?: InputMaybe + /** Checks for equality with the object’s `receiptTimestamp` field. */ + receiptTimestamp?: InputMaybe + /** Checks for equality with the object’s `receiptTransactionHash` field. */ + receiptTransactionHash?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `root` field. */ + root?: InputMaybe + /** Checks for equality with the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Checks for equality with the object’s `sendBlock` field. */ + sendBlock?: InputMaybe + /** Checks for equality with the object’s `sendFinalized` field. */ + sendFinalized?: InputMaybe + /** Checks for equality with the object’s `sendLogIndex` field. */ + sendLogIndex?: InputMaybe + /** Checks for equality with the object’s `sendTimestamp` field. */ + sendTimestamp?: InputMaybe + /** Checks for equality with the object’s `sendTransactionHash` field. */ + sendTransactionHash?: InputMaybe + /** Checks for equality with the object’s `sender` field. */ + sender?: InputMaybe + /** Checks for equality with the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Checks for equality with the object’s `sourceChainId` field. */ + sourceChainId?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `state` field. */ + state?: InputMaybe + /** Checks for equality with the object’s `strict` field. */ + strict?: InputMaybe + /** Checks for equality with the object’s `tokenAmounts` field. */ + tokenAmounts?: InputMaybe + /** Checks for equality with the object’s `votes` field. */ + votes?: InputMaybe +} + +/** A filter to be used against `CcipMessage` object types. All fields are combined with a logical ‘and.’ */ +export type CcipMessageFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `arm` field. */ + arm?: InputMaybe + /** Filter by the object’s `blessBlockNumber` field. */ + blessBlockNumber?: InputMaybe + /** Filter by the object’s `blessLogIndex` field. */ + blessLogIndex?: InputMaybe + /** Filter by the object’s `blessTransactionHash` field. */ + blessTransactionHash?: InputMaybe + /** Filter by the object’s `commitBlockNumber` field. */ + commitBlockNumber?: InputMaybe + /** Filter by the object’s `commitLogIndex` field. */ + commitLogIndex?: InputMaybe + /** Filter by the object’s `commitStore` field. */ + commitStore?: InputMaybe + /** Filter by the object’s `commitTransactionHash` field. */ + commitTransactionHash?: InputMaybe + /** Filter by the object’s `data` field. */ + data?: InputMaybe + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Filter by the object’s `destRouterAddress` field. */ + destRouterAddress?: InputMaybe + /** Filter by the object’s `feeToken` field. */ + feeToken?: InputMaybe + /** Filter by the object’s `feeTokenAmount` field. */ + feeTokenAmount?: InputMaybe + /** Filter by the object’s `info` field. */ + info?: InputMaybe + /** Filter by the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Filter by the object’s `messageId` field. */ + messageId?: InputMaybe + /** Filter by the object’s `nonce` field. */ + nonce?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Filter by the object’s `offrampAddress` field. */ + offrampAddress?: InputMaybe + /** Filter by the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `origin` field. */ + origin?: InputMaybe + /** Filter by the object’s `permissionLessExecutionThresholdSeconds` field. */ + permissionLessExecutionThresholdSeconds?: InputMaybe + /** Filter by the object’s `receiptBlock` field. */ + receiptBlock?: InputMaybe + /** Filter by the object’s `receiptLogIndex` field. */ + receiptLogIndex?: InputMaybe + /** Filter by the object’s `receiptTransactionHash` field. */ + receiptTransactionHash?: InputMaybe + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `root` field. */ + root?: InputMaybe + /** Filter by the object’s `routerAddress` field. */ + routerAddress?: InputMaybe + /** Filter by the object’s `sendBlock` field. */ + sendBlock?: InputMaybe + /** Filter by the object’s `sendLogIndex` field. */ + sendLogIndex?: InputMaybe + /** Filter by the object’s `sendTransactionHash` field. */ + sendTransactionHash?: InputMaybe + /** Filter by the object’s `sender` field. */ + sender?: InputMaybe + /** Filter by the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `state` field. */ + state?: InputMaybe + /** Filter by the object’s `strict` field. */ + strict?: InputMaybe + /** Filter by the object’s `tokenAmounts` field. */ + tokenAmounts?: InputMaybe + /** Filter by the object’s `votes` field. */ + votes?: InputMaybe +} + +/** A connection to a list of `CcipMessage` values. */ +export type CcipMessagesConnection = { + __typename?: "CcipMessagesConnection" + /** A list of edges which contains the `CcipMessage` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipMessage` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipMessage` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipMessage` edge in the connection. */ +export type CcipMessagesEdge = { + __typename?: "CcipMessagesEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipMessage` at the end of the edge. */ + node: CcipMessage +} + +export type CcipMessagesFlat = { + __typename?: "CcipMessagesFlat" + blessBlockHash?: Maybe + blessBlockNumber?: Maybe + blessBlockTimestamp?: Maybe + blessLogIndex?: Maybe + blessTransactionHash?: Maybe + commitBlockHash?: Maybe + commitBlockNumber?: Maybe + commitBlockTimestamp?: Maybe + commitLogIndex?: Maybe + commitStore?: Maybe + commitTransactionHash?: Maybe + createdAt?: Maybe + data?: Maybe + destChainId?: Maybe + destNetworkName?: Maybe + destRouter?: Maybe + firstReceiptBlockHash?: Maybe + firstReceiptBlockNumber?: Maybe + firstReceiptBlockTimestamp?: Maybe + firstReceiptInfo?: Maybe + firstReceiptLogIndex?: Maybe + firstReceiptTransactionHash?: Maybe + infoRaw?: Maybe + max?: Maybe + messageId?: Maybe + min?: Maybe + ofInterest?: Maybe>> + offramp?: Maybe + onramp?: Maybe + origin?: Maybe + receiptBlockHash?: Maybe + receiptBlockNumber?: Maybe + receiptBlockTimestamp?: Maybe + receiptInfo?: Maybe + receiptLogIndex?: Maybe + receiptTransactionHash?: Maybe + receiver?: Maybe + rmn?: Maybe + root?: Maybe + sendBlockHash?: Maybe + sendBlockNumber?: Maybe + sendBlockTimestamp?: Maybe + sendFinalized?: Maybe + sendLogIndex?: Maybe + sendTransactionHash?: Maybe + sender?: Maybe + sequenceNumber?: Maybe + sourceChainId?: Maybe + sourceNetworkName?: Maybe + sourceRouter?: Maybe + sourceSchema?: Maybe + state?: Maybe + updatedAt?: Maybe + votes?: Maybe +} + +/** + * A condition to be used against `CcipMessagesFlat` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipMessagesFlatCondition = { + /** Checks for equality with the object’s `blessBlockHash` field. */ + blessBlockHash?: InputMaybe + /** Checks for equality with the object’s `blessBlockNumber` field. */ + blessBlockNumber?: InputMaybe + /** Checks for equality with the object’s `blessBlockTimestamp` field. */ + blessBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `blessLogIndex` field. */ + blessLogIndex?: InputMaybe + /** Checks for equality with the object’s `blessTransactionHash` field. */ + blessTransactionHash?: InputMaybe + /** Checks for equality with the object’s `commitBlockHash` field. */ + commitBlockHash?: InputMaybe + /** Checks for equality with the object’s `commitBlockNumber` field. */ + commitBlockNumber?: InputMaybe + /** Checks for equality with the object’s `commitBlockTimestamp` field. */ + commitBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `commitLogIndex` field. */ + commitLogIndex?: InputMaybe + /** Checks for equality with the object’s `commitStore` field. */ + commitStore?: InputMaybe + /** Checks for equality with the object’s `commitTransactionHash` field. */ + commitTransactionHash?: InputMaybe + /** Checks for equality with the object’s `createdAt` field. */ + createdAt?: InputMaybe + /** Checks for equality with the object’s `data` field. */ + data?: InputMaybe + /** Checks for equality with the object’s `destChainId` field. */ + destChainId?: InputMaybe + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `destRouter` field. */ + destRouter?: InputMaybe + /** Checks for equality with the object’s `firstReceiptBlockHash` field. */ + firstReceiptBlockHash?: InputMaybe + /** Checks for equality with the object’s `firstReceiptBlockNumber` field. */ + firstReceiptBlockNumber?: InputMaybe + /** Checks for equality with the object’s `firstReceiptBlockTimestamp` field. */ + firstReceiptBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `firstReceiptInfo` field. */ + firstReceiptInfo?: InputMaybe + /** Checks for equality with the object’s `firstReceiptLogIndex` field. */ + firstReceiptLogIndex?: InputMaybe + /** Checks for equality with the object’s `firstReceiptTransactionHash` field. */ + firstReceiptTransactionHash?: InputMaybe + /** Checks for equality with the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Checks for equality with the object’s `max` field. */ + max?: InputMaybe + /** Checks for equality with the object’s `messageId` field. */ + messageId?: InputMaybe + /** Checks for equality with the object’s `min` field. */ + min?: InputMaybe + /** Checks for equality with the object’s `ofInterest` field. */ + ofInterest?: InputMaybe>> + /** Checks for equality with the object’s `offramp` field. */ + offramp?: InputMaybe + /** Checks for equality with the object’s `onramp` field. */ + onramp?: InputMaybe + /** Checks for equality with the object’s `origin` field. */ + origin?: InputMaybe + /** Checks for equality with the object’s `receiptBlockHash` field. */ + receiptBlockHash?: InputMaybe + /** Checks for equality with the object’s `receiptBlockNumber` field. */ + receiptBlockNumber?: InputMaybe + /** Checks for equality with the object’s `receiptBlockTimestamp` field. */ + receiptBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `receiptInfo` field. */ + receiptInfo?: InputMaybe + /** Checks for equality with the object’s `receiptLogIndex` field. */ + receiptLogIndex?: InputMaybe + /** Checks for equality with the object’s `receiptTransactionHash` field. */ + receiptTransactionHash?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `rmn` field. */ + rmn?: InputMaybe + /** Checks for equality with the object’s `root` field. */ + root?: InputMaybe + /** Checks for equality with the object’s `sendBlockHash` field. */ + sendBlockHash?: InputMaybe + /** Checks for equality with the object’s `sendBlockNumber` field. */ + sendBlockNumber?: InputMaybe + /** Checks for equality with the object’s `sendBlockTimestamp` field. */ + sendBlockTimestamp?: InputMaybe + /** Checks for equality with the object’s `sendFinalized` field. */ + sendFinalized?: InputMaybe + /** Checks for equality with the object’s `sendLogIndex` field. */ + sendLogIndex?: InputMaybe + /** Checks for equality with the object’s `sendTransactionHash` field. */ + sendTransactionHash?: InputMaybe + /** Checks for equality with the object’s `sender` field. */ + sender?: InputMaybe + /** Checks for equality with the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Checks for equality with the object’s `sourceChainId` field. */ + sourceChainId?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `sourceRouter` field. */ + sourceRouter?: InputMaybe + /** Checks for equality with the object’s `sourceSchema` field. */ + sourceSchema?: InputMaybe + /** Checks for equality with the object’s `state` field. */ + state?: InputMaybe + /** Checks for equality with the object’s `updatedAt` field. */ + updatedAt?: InputMaybe + /** Checks for equality with the object’s `votes` field. */ + votes?: InputMaybe +} + +/** A filter to be used against `CcipMessagesFlat` object types. All fields are combined with a logical ‘and.’ */ +export type CcipMessagesFlatFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `blessBlockHash` field. */ + blessBlockHash?: InputMaybe + /** Filter by the object’s `blessBlockNumber` field. */ + blessBlockNumber?: InputMaybe + /** Filter by the object’s `blessLogIndex` field. */ + blessLogIndex?: InputMaybe + /** Filter by the object’s `blessTransactionHash` field. */ + blessTransactionHash?: InputMaybe + /** Filter by the object’s `commitBlockHash` field. */ + commitBlockHash?: InputMaybe + /** Filter by the object’s `commitBlockNumber` field. */ + commitBlockNumber?: InputMaybe + /** Filter by the object’s `commitLogIndex` field. */ + commitLogIndex?: InputMaybe + /** Filter by the object’s `commitStore` field. */ + commitStore?: InputMaybe + /** Filter by the object’s `commitTransactionHash` field. */ + commitTransactionHash?: InputMaybe + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Filter by the object’s `destRouter` field. */ + destRouter?: InputMaybe + /** Filter by the object’s `firstReceiptBlockHash` field. */ + firstReceiptBlockHash?: InputMaybe + /** Filter by the object’s `firstReceiptBlockNumber` field. */ + firstReceiptBlockNumber?: InputMaybe + /** Filter by the object’s `firstReceiptInfo` field. */ + firstReceiptInfo?: InputMaybe + /** Filter by the object’s `firstReceiptLogIndex` field. */ + firstReceiptLogIndex?: InputMaybe + /** Filter by the object’s `firstReceiptTransactionHash` field. */ + firstReceiptTransactionHash?: InputMaybe + /** Filter by the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Filter by the object’s `max` field. */ + max?: InputMaybe + /** Filter by the object’s `messageId` field. */ + messageId?: InputMaybe + /** Filter by the object’s `min` field. */ + min?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Filter by the object’s `ofInterest` field. */ + ofInterest?: InputMaybe + /** Filter by the object’s `offramp` field. */ + offramp?: InputMaybe + /** Filter by the object’s `onramp` field. */ + onramp?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `origin` field. */ + origin?: InputMaybe + /** Filter by the object’s `receiptBlockHash` field. */ + receiptBlockHash?: InputMaybe + /** Filter by the object’s `receiptBlockNumber` field. */ + receiptBlockNumber?: InputMaybe + /** Filter by the object’s `receiptInfo` field. */ + receiptInfo?: InputMaybe + /** Filter by the object’s `receiptLogIndex` field. */ + receiptLogIndex?: InputMaybe + /** Filter by the object’s `receiptTransactionHash` field. */ + receiptTransactionHash?: InputMaybe + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `rmn` field. */ + rmn?: InputMaybe + /** Filter by the object’s `root` field. */ + root?: InputMaybe + /** Filter by the object’s `sendBlockHash` field. */ + sendBlockHash?: InputMaybe + /** Filter by the object’s `sendBlockNumber` field. */ + sendBlockNumber?: InputMaybe + /** Filter by the object’s `sendLogIndex` field. */ + sendLogIndex?: InputMaybe + /** Filter by the object’s `sendTransactionHash` field. */ + sendTransactionHash?: InputMaybe + /** Filter by the object’s `sender` field. */ + sender?: InputMaybe + /** Filter by the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `sourceRouter` field. */ + sourceRouter?: InputMaybe + /** Filter by the object’s `sourceSchema` field. */ + sourceSchema?: InputMaybe + /** Filter by the object’s `state` field. */ + state?: InputMaybe + /** Filter by the object’s `votes` field. */ + votes?: InputMaybe +} + +/** A connection to a list of `CcipMessagesFlat` values. */ +export type CcipMessagesFlatsConnection = { + __typename?: "CcipMessagesFlatsConnection" + /** A list of edges which contains the `CcipMessagesFlat` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipMessagesFlat` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipMessagesFlat` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipMessagesFlat` edge in the connection. */ +export type CcipMessagesFlatsEdge = { + __typename?: "CcipMessagesFlatsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipMessagesFlat` at the end of the edge. */ + node: CcipMessagesFlat +} + +/** Methods to use when ordering `CcipMessagesFlat`. */ +export enum CcipMessagesFlatsOrderBy { + BlessBlockHashAsc = "BLESS_BLOCK_HASH_ASC", + BlessBlockHashDesc = "BLESS_BLOCK_HASH_DESC", + BlessBlockNumberAsc = "BLESS_BLOCK_NUMBER_ASC", + BlessBlockNumberDesc = "BLESS_BLOCK_NUMBER_DESC", + BlessBlockTimestampAsc = "BLESS_BLOCK_TIMESTAMP_ASC", + BlessBlockTimestampDesc = "BLESS_BLOCK_TIMESTAMP_DESC", + BlessLogIndexAsc = "BLESS_LOG_INDEX_ASC", + BlessLogIndexDesc = "BLESS_LOG_INDEX_DESC", + BlessTransactionHashAsc = "BLESS_TRANSACTION_HASH_ASC", + BlessTransactionHashDesc = "BLESS_TRANSACTION_HASH_DESC", + CommitBlockHashAsc = "COMMIT_BLOCK_HASH_ASC", + CommitBlockHashDesc = "COMMIT_BLOCK_HASH_DESC", + CommitBlockNumberAsc = "COMMIT_BLOCK_NUMBER_ASC", + CommitBlockNumberDesc = "COMMIT_BLOCK_NUMBER_DESC", + CommitBlockTimestampAsc = "COMMIT_BLOCK_TIMESTAMP_ASC", + CommitBlockTimestampDesc = "COMMIT_BLOCK_TIMESTAMP_DESC", + CommitLogIndexAsc = "COMMIT_LOG_INDEX_ASC", + CommitLogIndexDesc = "COMMIT_LOG_INDEX_DESC", + CommitStoreAsc = "COMMIT_STORE_ASC", + CommitStoreDesc = "COMMIT_STORE_DESC", + CommitTransactionHashAsc = "COMMIT_TRANSACTION_HASH_ASC", + CommitTransactionHashDesc = "COMMIT_TRANSACTION_HASH_DESC", + CreatedAtAsc = "CREATED_AT_ASC", + CreatedAtDesc = "CREATED_AT_DESC", + DataAsc = "DATA_ASC", + DataDesc = "DATA_DESC", + DestChainIdAsc = "DEST_CHAIN_ID_ASC", + DestChainIdDesc = "DEST_CHAIN_ID_DESC", + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + DestRouterAsc = "DEST_ROUTER_ASC", + DestRouterDesc = "DEST_ROUTER_DESC", + FirstReceiptBlockHashAsc = "FIRST_RECEIPT_BLOCK_HASH_ASC", + FirstReceiptBlockHashDesc = "FIRST_RECEIPT_BLOCK_HASH_DESC", + FirstReceiptBlockNumberAsc = "FIRST_RECEIPT_BLOCK_NUMBER_ASC", + FirstReceiptBlockNumberDesc = "FIRST_RECEIPT_BLOCK_NUMBER_DESC", + FirstReceiptBlockTimestampAsc = "FIRST_RECEIPT_BLOCK_TIMESTAMP_ASC", + FirstReceiptBlockTimestampDesc = "FIRST_RECEIPT_BLOCK_TIMESTAMP_DESC", + FirstReceiptInfoAsc = "FIRST_RECEIPT_INFO_ASC", + FirstReceiptInfoDesc = "FIRST_RECEIPT_INFO_DESC", + FirstReceiptLogIndexAsc = "FIRST_RECEIPT_LOG_INDEX_ASC", + FirstReceiptLogIndexDesc = "FIRST_RECEIPT_LOG_INDEX_DESC", + FirstReceiptTransactionHashAsc = "FIRST_RECEIPT_TRANSACTION_HASH_ASC", + FirstReceiptTransactionHashDesc = "FIRST_RECEIPT_TRANSACTION_HASH_DESC", + InfoRawAsc = "INFO_RAW_ASC", + InfoRawDesc = "INFO_RAW_DESC", + MaxAsc = "MAX_ASC", + MaxDesc = "MAX_DESC", + MessageIdAsc = "MESSAGE_ID_ASC", + MessageIdDesc = "MESSAGE_ID_DESC", + MinAsc = "MIN_ASC", + MinDesc = "MIN_DESC", + Natural = "NATURAL", + OfframpAsc = "OFFRAMP_ASC", + OfframpDesc = "OFFRAMP_DESC", + OfInterestAsc = "OF_INTEREST_ASC", + OfInterestDesc = "OF_INTEREST_DESC", + OnrampAsc = "ONRAMP_ASC", + OnrampDesc = "ONRAMP_DESC", + OriginAsc = "ORIGIN_ASC", + OriginDesc = "ORIGIN_DESC", + ReceiptBlockHashAsc = "RECEIPT_BLOCK_HASH_ASC", + ReceiptBlockHashDesc = "RECEIPT_BLOCK_HASH_DESC", + ReceiptBlockNumberAsc = "RECEIPT_BLOCK_NUMBER_ASC", + ReceiptBlockNumberDesc = "RECEIPT_BLOCK_NUMBER_DESC", + ReceiptBlockTimestampAsc = "RECEIPT_BLOCK_TIMESTAMP_ASC", + ReceiptBlockTimestampDesc = "RECEIPT_BLOCK_TIMESTAMP_DESC", + ReceiptInfoAsc = "RECEIPT_INFO_ASC", + ReceiptInfoDesc = "RECEIPT_INFO_DESC", + ReceiptLogIndexAsc = "RECEIPT_LOG_INDEX_ASC", + ReceiptLogIndexDesc = "RECEIPT_LOG_INDEX_DESC", + ReceiptTransactionHashAsc = "RECEIPT_TRANSACTION_HASH_ASC", + ReceiptTransactionHashDesc = "RECEIPT_TRANSACTION_HASH_DESC", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + RmnAsc = "RMN_ASC", + RmnDesc = "RMN_DESC", + RootAsc = "ROOT_ASC", + RootDesc = "ROOT_DESC", + SenderAsc = "SENDER_ASC", + SenderDesc = "SENDER_DESC", + SendBlockHashAsc = "SEND_BLOCK_HASH_ASC", + SendBlockHashDesc = "SEND_BLOCK_HASH_DESC", + SendBlockNumberAsc = "SEND_BLOCK_NUMBER_ASC", + SendBlockNumberDesc = "SEND_BLOCK_NUMBER_DESC", + SendBlockTimestampAsc = "SEND_BLOCK_TIMESTAMP_ASC", + SendBlockTimestampDesc = "SEND_BLOCK_TIMESTAMP_DESC", + SendFinalizedAsc = "SEND_FINALIZED_ASC", + SendFinalizedDesc = "SEND_FINALIZED_DESC", + SendLogIndexAsc = "SEND_LOG_INDEX_ASC", + SendLogIndexDesc = "SEND_LOG_INDEX_DESC", + SendTransactionHashAsc = "SEND_TRANSACTION_HASH_ASC", + SendTransactionHashDesc = "SEND_TRANSACTION_HASH_DESC", + SequenceNumberAsc = "SEQUENCE_NUMBER_ASC", + SequenceNumberDesc = "SEQUENCE_NUMBER_DESC", + SourceChainIdAsc = "SOURCE_CHAIN_ID_ASC", + SourceChainIdDesc = "SOURCE_CHAIN_ID_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + SourceRouterAsc = "SOURCE_ROUTER_ASC", + SourceRouterDesc = "SOURCE_ROUTER_DESC", + SourceSchemaAsc = "SOURCE_SCHEMA_ASC", + SourceSchemaDesc = "SOURCE_SCHEMA_DESC", + StateAsc = "STATE_ASC", + StateDesc = "STATE_DESC", + UpdatedAtAsc = "UPDATED_AT_ASC", + UpdatedAtDesc = "UPDATED_AT_DESC", + VotesAsc = "VOTES_ASC", + VotesDesc = "VOTES_DESC", +} + +/** Methods to use when ordering `CcipMessage`. */ +export enum CcipMessagesOrderBy { + ArmAsc = "ARM_ASC", + ArmDesc = "ARM_DESC", + BlessBlockNumberAsc = "BLESS_BLOCK_NUMBER_ASC", + BlessBlockNumberDesc = "BLESS_BLOCK_NUMBER_DESC", + BlessBlockTimestampAsc = "BLESS_BLOCK_TIMESTAMP_ASC", + BlessBlockTimestampDesc = "BLESS_BLOCK_TIMESTAMP_DESC", + BlessLogIndexAsc = "BLESS_LOG_INDEX_ASC", + BlessLogIndexDesc = "BLESS_LOG_INDEX_DESC", + BlessTransactionHashAsc = "BLESS_TRANSACTION_HASH_ASC", + BlessTransactionHashDesc = "BLESS_TRANSACTION_HASH_DESC", + CommitBlockNumberAsc = "COMMIT_BLOCK_NUMBER_ASC", + CommitBlockNumberDesc = "COMMIT_BLOCK_NUMBER_DESC", + CommitBlockTimestampAsc = "COMMIT_BLOCK_TIMESTAMP_ASC", + CommitBlockTimestampDesc = "COMMIT_BLOCK_TIMESTAMP_DESC", + CommitLogIndexAsc = "COMMIT_LOG_INDEX_ASC", + CommitLogIndexDesc = "COMMIT_LOG_INDEX_DESC", + CommitStoreAsc = "COMMIT_STORE_ASC", + CommitStoreDesc = "COMMIT_STORE_DESC", + CommitTransactionHashAsc = "COMMIT_TRANSACTION_HASH_ASC", + CommitTransactionHashDesc = "COMMIT_TRANSACTION_HASH_DESC", + DataAsc = "DATA_ASC", + DataDesc = "DATA_DESC", + DestChainIdAsc = "DEST_CHAIN_ID_ASC", + DestChainIdDesc = "DEST_CHAIN_ID_DESC", + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + DestRouterAddressAsc = "DEST_ROUTER_ADDRESS_ASC", + DestRouterAddressDesc = "DEST_ROUTER_ADDRESS_DESC", + FeeTokenAmountAsc = "FEE_TOKEN_AMOUNT_ASC", + FeeTokenAmountDesc = "FEE_TOKEN_AMOUNT_DESC", + FeeTokenAsc = "FEE_TOKEN_ASC", + FeeTokenDesc = "FEE_TOKEN_DESC", + GasLimitAsc = "GAS_LIMIT_ASC", + GasLimitDesc = "GAS_LIMIT_DESC", + InfoAsc = "INFO_ASC", + InfoDesc = "INFO_DESC", + InfoRawAsc = "INFO_RAW_ASC", + InfoRawDesc = "INFO_RAW_DESC", + MaxAsc = "MAX_ASC", + MaxDesc = "MAX_DESC", + MessageIdAsc = "MESSAGE_ID_ASC", + MessageIdDesc = "MESSAGE_ID_DESC", + MinAsc = "MIN_ASC", + MinDesc = "MIN_DESC", + Natural = "NATURAL", + NonceAsc = "NONCE_ASC", + NonceDesc = "NONCE_DESC", + OfframpAddressAsc = "OFFRAMP_ADDRESS_ASC", + OfframpAddressDesc = "OFFRAMP_ADDRESS_DESC", + OnrampAddressAsc = "ONRAMP_ADDRESS_ASC", + OnrampAddressDesc = "ONRAMP_ADDRESS_DESC", + OriginAsc = "ORIGIN_ASC", + OriginDesc = "ORIGIN_DESC", + PermissionLessExecutionThresholdSecondsAsc = "PERMISSION_LESS_EXECUTION_THRESHOLD_SECONDS_ASC", + PermissionLessExecutionThresholdSecondsDesc = "PERMISSION_LESS_EXECUTION_THRESHOLD_SECONDS_DESC", + ReceiptBlockAsc = "RECEIPT_BLOCK_ASC", + ReceiptBlockDesc = "RECEIPT_BLOCK_DESC", + ReceiptFinalizedAsc = "RECEIPT_FINALIZED_ASC", + ReceiptFinalizedDesc = "RECEIPT_FINALIZED_DESC", + ReceiptLogIndexAsc = "RECEIPT_LOG_INDEX_ASC", + ReceiptLogIndexDesc = "RECEIPT_LOG_INDEX_DESC", + ReceiptTimestampAsc = "RECEIPT_TIMESTAMP_ASC", + ReceiptTimestampDesc = "RECEIPT_TIMESTAMP_DESC", + ReceiptTransactionHashAsc = "RECEIPT_TRANSACTION_HASH_ASC", + ReceiptTransactionHashDesc = "RECEIPT_TRANSACTION_HASH_DESC", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + RootAsc = "ROOT_ASC", + RootDesc = "ROOT_DESC", + RouterAddressAsc = "ROUTER_ADDRESS_ASC", + RouterAddressDesc = "ROUTER_ADDRESS_DESC", + SenderAsc = "SENDER_ASC", + SenderDesc = "SENDER_DESC", + SendBlockAsc = "SEND_BLOCK_ASC", + SendBlockDesc = "SEND_BLOCK_DESC", + SendFinalizedAsc = "SEND_FINALIZED_ASC", + SendFinalizedDesc = "SEND_FINALIZED_DESC", + SendLogIndexAsc = "SEND_LOG_INDEX_ASC", + SendLogIndexDesc = "SEND_LOG_INDEX_DESC", + SendTimestampAsc = "SEND_TIMESTAMP_ASC", + SendTimestampDesc = "SEND_TIMESTAMP_DESC", + SendTransactionHashAsc = "SEND_TRANSACTION_HASH_ASC", + SendTransactionHashDesc = "SEND_TRANSACTION_HASH_DESC", + SequenceNumberAsc = "SEQUENCE_NUMBER_ASC", + SequenceNumberDesc = "SEQUENCE_NUMBER_DESC", + SourceChainIdAsc = "SOURCE_CHAIN_ID_ASC", + SourceChainIdDesc = "SOURCE_CHAIN_ID_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + StateAsc = "STATE_ASC", + StateDesc = "STATE_DESC", + StrictAsc = "STRICT_ASC", + StrictDesc = "STRICT_DESC", + TokenAmountsAsc = "TOKEN_AMOUNTS_ASC", + TokenAmountsDesc = "TOKEN_AMOUNTS_DESC", + VotesAsc = "VOTES_ASC", + VotesDesc = "VOTES_DESC", +} + +export type CcipSend = { + __typename?: "CcipSend" + data?: Maybe + feeToken?: Maybe + feeTokenAmount?: Maybe + gasLimit?: Maybe + messageId?: Maybe + nonce?: Maybe + onrampAddress?: Maybe + receiver?: Maybe + sender?: Maybe + sequenceNumber?: Maybe + sourceChainSelector?: Maybe + sourceNetworkName?: Maybe + sourceTokenData?: Maybe + strict?: Maybe + tokenAmounts?: Maybe +} + +/** + * A condition to be used against `CcipSend` object types. All fields are tested + * for equality and combined with a logical ‘and.’ + */ +export type CcipSendCondition = { + /** Checks for equality with the object’s `data` field. */ + data?: InputMaybe + /** Checks for equality with the object’s `feeToken` field. */ + feeToken?: InputMaybe + /** Checks for equality with the object’s `feeTokenAmount` field. */ + feeTokenAmount?: InputMaybe + /** Checks for equality with the object’s `gasLimit` field. */ + gasLimit?: InputMaybe + /** Checks for equality with the object’s `messageId` field. */ + messageId?: InputMaybe + /** Checks for equality with the object’s `nonce` field. */ + nonce?: InputMaybe + /** Checks for equality with the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `sender` field. */ + sender?: InputMaybe + /** Checks for equality with the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Checks for equality with the object’s `sourceChainSelector` field. */ + sourceChainSelector?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `sourceTokenData` field. */ + sourceTokenData?: InputMaybe + /** Checks for equality with the object’s `strict` field. */ + strict?: InputMaybe + /** Checks for equality with the object’s `tokenAmounts` field. */ + tokenAmounts?: InputMaybe +} + +/** A filter to be used against `CcipSend` object types. All fields are combined with a logical ‘and.’ */ +export type CcipSendFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `data` field. */ + data?: InputMaybe + /** Filter by the object’s `feeToken` field. */ + feeToken?: InputMaybe + /** Filter by the object’s `feeTokenAmount` field. */ + feeTokenAmount?: InputMaybe + /** Filter by the object’s `messageId` field. */ + messageId?: InputMaybe + /** Filter by the object’s `nonce` field. */ + nonce?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Filter by the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `sender` field. */ + sender?: InputMaybe + /** Filter by the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Filter by the object’s `sourceChainSelector` field. */ + sourceChainSelector?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `sourceTokenData` field. */ + sourceTokenData?: InputMaybe + /** Filter by the object’s `strict` field. */ + strict?: InputMaybe + /** Filter by the object’s `tokenAmounts` field. */ + tokenAmounts?: InputMaybe +} + +/** A connection to a list of `CcipSend` values. */ +export type CcipSendsConnection = { + __typename?: "CcipSendsConnection" + /** A list of edges which contains the `CcipSend` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipSend` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipSend` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipSend` edge in the connection. */ +export type CcipSendsEdge = { + __typename?: "CcipSendsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipSend` at the end of the edge. */ + node: CcipSend +} + +/** Methods to use when ordering `CcipSend`. */ +export enum CcipSendsOrderBy { + DataAsc = "DATA_ASC", + DataDesc = "DATA_DESC", + FeeTokenAmountAsc = "FEE_TOKEN_AMOUNT_ASC", + FeeTokenAmountDesc = "FEE_TOKEN_AMOUNT_DESC", + FeeTokenAsc = "FEE_TOKEN_ASC", + FeeTokenDesc = "FEE_TOKEN_DESC", + GasLimitAsc = "GAS_LIMIT_ASC", + GasLimitDesc = "GAS_LIMIT_DESC", + MessageIdAsc = "MESSAGE_ID_ASC", + MessageIdDesc = "MESSAGE_ID_DESC", + Natural = "NATURAL", + NonceAsc = "NONCE_ASC", + NonceDesc = "NONCE_DESC", + OnrampAddressAsc = "ONRAMP_ADDRESS_ASC", + OnrampAddressDesc = "ONRAMP_ADDRESS_DESC", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + SenderAsc = "SENDER_ASC", + SenderDesc = "SENDER_DESC", + SequenceNumberAsc = "SEQUENCE_NUMBER_ASC", + SequenceNumberDesc = "SEQUENCE_NUMBER_DESC", + SourceChainSelectorAsc = "SOURCE_CHAIN_SELECTOR_ASC", + SourceChainSelectorDesc = "SOURCE_CHAIN_SELECTOR_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + SourceTokenDataAsc = "SOURCE_TOKEN_DATA_ASC", + SourceTokenDataDesc = "SOURCE_TOKEN_DATA_DESC", + StrictAsc = "STRICT_ASC", + StrictDesc = "STRICT_DESC", + TokenAmountsAsc = "TOKEN_AMOUNTS_ASC", + TokenAmountsDesc = "TOKEN_AMOUNTS_DESC", +} + +export type CcipTokenPool = { + __typename?: "CcipTokenPool" + administrator?: Maybe + allowlist?: Maybe + blockHash?: Maybe + blockNumber?: Maybe + blockTimestamp?: Maybe + createdAt?: Maybe + logIndex?: Maybe + minBlockConfirmations?: Maybe + network?: Maybe + owner?: Maybe + pendingAdministrator?: Maybe + pendingOwner?: Maybe + previousPool?: Maybe + previousPoolTypeAndVersion?: Maybe + registry?: Maybe + router?: Maybe + token?: Maybe + tokenDecimals?: Maybe + tokenName?: Maybe + tokenPool?: Maybe + tokenSymbol?: Maybe + transactionHash?: Maybe + typeAndVersion?: Maybe + updatedAt?: Maybe +} + +/** + * A condition to be used against `CcipTokenPool` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipTokenPoolCondition = { + /** Checks for equality with the object’s `administrator` field. */ + administrator?: InputMaybe + /** Checks for equality with the object’s `allowlist` field. */ + allowlist?: InputMaybe + /** Checks for equality with the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Checks for equality with the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Checks for equality with the object’s `blockTimestamp` field. */ + blockTimestamp?: InputMaybe + /** Checks for equality with the object’s `createdAt` field. */ + createdAt?: InputMaybe + /** Checks for equality with the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Checks for equality with the object’s `minBlockConfirmations` field. */ + minBlockConfirmations?: InputMaybe + /** Checks for equality with the object’s `network` field. */ + network?: InputMaybe + /** Checks for equality with the object’s `owner` field. */ + owner?: InputMaybe + /** Checks for equality with the object’s `pendingAdministrator` field. */ + pendingAdministrator?: InputMaybe + /** Checks for equality with the object’s `pendingOwner` field. */ + pendingOwner?: InputMaybe + /** Checks for equality with the object’s `previousPool` field. */ + previousPool?: InputMaybe + /** Checks for equality with the object’s `previousPoolTypeAndVersion` field. */ + previousPoolTypeAndVersion?: InputMaybe + /** Checks for equality with the object’s `registry` field. */ + registry?: InputMaybe + /** Checks for equality with the object’s `router` field. */ + router?: InputMaybe + /** Checks for equality with the object’s `token` field. */ + token?: InputMaybe + /** Checks for equality with the object’s `tokenDecimals` field. */ + tokenDecimals?: InputMaybe + /** Checks for equality with the object’s `tokenName` field. */ + tokenName?: InputMaybe + /** Checks for equality with the object’s `tokenPool` field. */ + tokenPool?: InputMaybe + /** Checks for equality with the object’s `tokenSymbol` field. */ + tokenSymbol?: InputMaybe + /** Checks for equality with the object’s `transactionHash` field. */ + transactionHash?: InputMaybe + /** Checks for equality with the object’s `typeAndVersion` field. */ + typeAndVersion?: InputMaybe + /** Checks for equality with the object’s `updatedAt` field. */ + updatedAt?: InputMaybe +} + +export type CcipTokenPoolEvent = { + __typename?: "CcipTokenPoolEvent" + amount?: Maybe + blockHash?: Maybe + blockNumber?: Maybe + blockTimestamp?: Maybe + createdAt?: Maybe + event?: Maybe + logIndex?: Maybe + network?: Maybe + receiver?: Maybe + removed?: Maybe + sender?: Maybe + tokenAddress?: Maybe + tokenPoolAddress?: Maybe + transactionHash?: Maybe + updatedAt?: Maybe +} + +/** + * A condition to be used against `CcipTokenPoolEvent` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipTokenPoolEventCondition = { + /** Checks for equality with the object’s `amount` field. */ + amount?: InputMaybe + /** Checks for equality with the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Checks for equality with the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Checks for equality with the object’s `blockTimestamp` field. */ + blockTimestamp?: InputMaybe + /** Checks for equality with the object’s `createdAt` field. */ + createdAt?: InputMaybe + /** Checks for equality with the object’s `event` field. */ + event?: InputMaybe + /** Checks for equality with the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Checks for equality with the object’s `network` field. */ + network?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `removed` field. */ + removed?: InputMaybe + /** Checks for equality with the object’s `sender` field. */ + sender?: InputMaybe + /** Checks for equality with the object’s `tokenAddress` field. */ + tokenAddress?: InputMaybe + /** Checks for equality with the object’s `tokenPoolAddress` field. */ + tokenPoolAddress?: InputMaybe + /** Checks for equality with the object’s `transactionHash` field. */ + transactionHash?: InputMaybe + /** Checks for equality with the object’s `updatedAt` field. */ + updatedAt?: InputMaybe +} + +/** A filter to be used against `CcipTokenPoolEvent` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTokenPoolEventFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Filter by the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Filter by the object’s `event` field. */ + event?: InputMaybe + /** Filter by the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Filter by the object’s `network` field. */ + network?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `removed` field. */ + removed?: InputMaybe + /** Filter by the object’s `sender` field. */ + sender?: InputMaybe + /** Filter by the object’s `tokenAddress` field. */ + tokenAddress?: InputMaybe + /** Filter by the object’s `tokenPoolAddress` field. */ + tokenPoolAddress?: InputMaybe + /** Filter by the object’s `transactionHash` field. */ + transactionHash?: InputMaybe +} + +/** A connection to a list of `CcipTokenPoolEvent` values. */ +export type CcipTokenPoolEventsConnection = { + __typename?: "CcipTokenPoolEventsConnection" + /** A list of edges which contains the `CcipTokenPoolEvent` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTokenPoolEvent` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTokenPoolEvent` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTokenPoolEvent` edge in the connection. */ +export type CcipTokenPoolEventsEdge = { + __typename?: "CcipTokenPoolEventsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTokenPoolEvent` at the end of the edge. */ + node: CcipTokenPoolEvent +} + +/** Methods to use when ordering `CcipTokenPoolEvent`. */ +export enum CcipTokenPoolEventsOrderBy { + AmountAsc = "AMOUNT_ASC", + AmountDesc = "AMOUNT_DESC", + BlockHashAsc = "BLOCK_HASH_ASC", + BlockHashDesc = "BLOCK_HASH_DESC", + BlockNumberAsc = "BLOCK_NUMBER_ASC", + BlockNumberDesc = "BLOCK_NUMBER_DESC", + BlockTimestampAsc = "BLOCK_TIMESTAMP_ASC", + BlockTimestampDesc = "BLOCK_TIMESTAMP_DESC", + CreatedAtAsc = "CREATED_AT_ASC", + CreatedAtDesc = "CREATED_AT_DESC", + EventAsc = "EVENT_ASC", + EventDesc = "EVENT_DESC", + LogIndexAsc = "LOG_INDEX_ASC", + LogIndexDesc = "LOG_INDEX_DESC", + Natural = "NATURAL", + NetworkAsc = "NETWORK_ASC", + NetworkDesc = "NETWORK_DESC", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + RemovedAsc = "REMOVED_ASC", + RemovedDesc = "REMOVED_DESC", + SenderAsc = "SENDER_ASC", + SenderDesc = "SENDER_DESC", + TokenAddressAsc = "TOKEN_ADDRESS_ASC", + TokenAddressDesc = "TOKEN_ADDRESS_DESC", + TokenPoolAddressAsc = "TOKEN_POOL_ADDRESS_ASC", + TokenPoolAddressDesc = "TOKEN_POOL_ADDRESS_DESC", + TransactionHashAsc = "TRANSACTION_HASH_ASC", + TransactionHashDesc = "TRANSACTION_HASH_DESC", + UpdatedAtAsc = "UPDATED_AT_ASC", + UpdatedAtDesc = "UPDATED_AT_DESC", +} + +/** A filter to be used against `CcipTokenPool` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTokenPoolFilter = { + /** Filter by the object’s `administrator` field. */ + administrator?: InputMaybe + /** Filter by the object’s `allowlist` field. */ + allowlist?: InputMaybe + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Filter by the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Filter by the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Filter by the object’s `minBlockConfirmations` field. */ + minBlockConfirmations?: InputMaybe + /** Filter by the object’s `network` field. */ + network?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `owner` field. */ + owner?: InputMaybe + /** Filter by the object’s `pendingAdministrator` field. */ + pendingAdministrator?: InputMaybe + /** Filter by the object’s `pendingOwner` field. */ + pendingOwner?: InputMaybe + /** Filter by the object’s `previousPool` field. */ + previousPool?: InputMaybe + /** Filter by the object’s `previousPoolTypeAndVersion` field. */ + previousPoolTypeAndVersion?: InputMaybe + /** Filter by the object’s `registry` field. */ + registry?: InputMaybe + /** Filter by the object’s `router` field. */ + router?: InputMaybe + /** Filter by the object’s `token` field. */ + token?: InputMaybe + /** Filter by the object’s `tokenDecimals` field. */ + tokenDecimals?: InputMaybe + /** Filter by the object’s `tokenName` field. */ + tokenName?: InputMaybe + /** Filter by the object’s `tokenPool` field. */ + tokenPool?: InputMaybe + /** Filter by the object’s `tokenSymbol` field. */ + tokenSymbol?: InputMaybe + /** Filter by the object’s `transactionHash` field. */ + transactionHash?: InputMaybe + /** Filter by the object’s `typeAndVersion` field. */ + typeAndVersion?: InputMaybe +} + +export type CcipTokenPoolLane = { + __typename?: "CcipTokenPoolLane" + blockHash?: Maybe + blockNumber?: Maybe + blockTimestamp?: Maybe + createdAt?: Maybe + customInboundCapacity?: Maybe + customInboundEnabled?: Maybe + customInboundRate?: Maybe + customOutboundCapacity?: Maybe + customOutboundEnabled?: Maybe + customOutboundRate?: Maybe + inboundCapacity?: Maybe + inboundEnabled?: Maybe + inboundRate?: Maybe + logIndex?: Maybe + network?: Maybe + outboundCapacity?: Maybe + outboundEnabled?: Maybe + outboundRate?: Maybe + remoteNetworkName?: Maybe + remoteToken?: Maybe + remoteTokenPools?: Maybe>> + removed?: Maybe + token?: Maybe + tokenPool?: Maybe + transactionHash?: Maybe + updatedAt?: Maybe +} + +/** + * A condition to be used against `CcipTokenPoolLane` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipTokenPoolLaneCondition = { + /** Checks for equality with the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Checks for equality with the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Checks for equality with the object’s `blockTimestamp` field. */ + blockTimestamp?: InputMaybe + /** Checks for equality with the object’s `createdAt` field. */ + createdAt?: InputMaybe + /** Checks for equality with the object’s `customInboundCapacity` field. */ + customInboundCapacity?: InputMaybe + /** Checks for equality with the object’s `customInboundEnabled` field. */ + customInboundEnabled?: InputMaybe + /** Checks for equality with the object’s `customInboundRate` field. */ + customInboundRate?: InputMaybe + /** Checks for equality with the object’s `customOutboundCapacity` field. */ + customOutboundCapacity?: InputMaybe + /** Checks for equality with the object’s `customOutboundEnabled` field. */ + customOutboundEnabled?: InputMaybe + /** Checks for equality with the object’s `customOutboundRate` field. */ + customOutboundRate?: InputMaybe + /** Checks for equality with the object’s `inboundCapacity` field. */ + inboundCapacity?: InputMaybe + /** Checks for equality with the object’s `inboundEnabled` field. */ + inboundEnabled?: InputMaybe + /** Checks for equality with the object’s `inboundRate` field. */ + inboundRate?: InputMaybe + /** Checks for equality with the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Checks for equality with the object’s `network` field. */ + network?: InputMaybe + /** Checks for equality with the object’s `outboundCapacity` field. */ + outboundCapacity?: InputMaybe + /** Checks for equality with the object’s `outboundEnabled` field. */ + outboundEnabled?: InputMaybe + /** Checks for equality with the object’s `outboundRate` field. */ + outboundRate?: InputMaybe + /** Checks for equality with the object’s `remoteNetworkName` field. */ + remoteNetworkName?: InputMaybe + /** Checks for equality with the object’s `remoteToken` field. */ + remoteToken?: InputMaybe + /** Checks for equality with the object’s `remoteTokenPools` field. */ + remoteTokenPools?: InputMaybe>> + /** Checks for equality with the object’s `removed` field. */ + removed?: InputMaybe + /** Checks for equality with the object’s `token` field. */ + token?: InputMaybe + /** Checks for equality with the object’s `tokenPool` field. */ + tokenPool?: InputMaybe + /** Checks for equality with the object’s `transactionHash` field. */ + transactionHash?: InputMaybe + /** Checks for equality with the object’s `updatedAt` field. */ + updatedAt?: InputMaybe +} + +/** A filter to be used against `CcipTokenPoolLane` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTokenPoolLaneFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Filter by the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Filter by the object’s `customInboundEnabled` field. */ + customInboundEnabled?: InputMaybe + /** Filter by the object’s `customOutboundEnabled` field. */ + customOutboundEnabled?: InputMaybe + /** Filter by the object’s `inboundEnabled` field. */ + inboundEnabled?: InputMaybe + /** Filter by the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Filter by the object’s `network` field. */ + network?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `outboundEnabled` field. */ + outboundEnabled?: InputMaybe + /** Filter by the object’s `remoteNetworkName` field. */ + remoteNetworkName?: InputMaybe + /** Filter by the object’s `remoteToken` field. */ + remoteToken?: InputMaybe + /** Filter by the object’s `remoteTokenPools` field. */ + remoteTokenPools?: InputMaybe + /** Filter by the object’s `removed` field. */ + removed?: InputMaybe + /** Filter by the object’s `token` field. */ + token?: InputMaybe + /** Filter by the object’s `tokenPool` field. */ + tokenPool?: InputMaybe + /** Filter by the object’s `transactionHash` field. */ + transactionHash?: InputMaybe +} + +/** A connection to a list of `CcipTokenPoolLane` values. */ +export type CcipTokenPoolLanesConnection = { + __typename?: "CcipTokenPoolLanesConnection" + /** A list of edges which contains the `CcipTokenPoolLane` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTokenPoolLane` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTokenPoolLane` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTokenPoolLane` edge in the connection. */ +export type CcipTokenPoolLanesEdge = { + __typename?: "CcipTokenPoolLanesEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTokenPoolLane` at the end of the edge. */ + node: CcipTokenPoolLane +} + +export type CcipTokenPoolLanesGroup = { + __typename?: "CcipTokenPoolLanesGroup" + admins?: Maybe>> + createdAt?: Maybe + owners?: Maybe>> + pk?: Maybe + tokenGroup?: Maybe + updatedAt?: Maybe +} + +/** + * A condition to be used against `CcipTokenPoolLanesGroup` object types. All + * fields are tested for equality and combined with a logical ‘and.’ + */ +export type CcipTokenPoolLanesGroupCondition = { + /** Checks for equality with the object’s `admins` field. */ + admins?: InputMaybe>> + /** Checks for equality with the object’s `createdAt` field. */ + createdAt?: InputMaybe + /** Checks for equality with the object’s `owners` field. */ + owners?: InputMaybe>> + /** Checks for equality with the object’s `pk` field. */ + pk?: InputMaybe + /** Checks for equality with the object’s `tokenGroup` field. */ + tokenGroup?: InputMaybe + /** Checks for equality with the object’s `updatedAt` field. */ + updatedAt?: InputMaybe +} + +/** A filter to be used against `CcipTokenPoolLanesGroup` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTokenPoolLanesGroupFilter = { + /** Filter by the object’s `admins` field. */ + admins?: InputMaybe + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `owners` field. */ + owners?: InputMaybe + /** Filter by the object’s `pk` field. */ + pk?: InputMaybe + /** Filter by the object’s `tokenGroup` field. */ + tokenGroup?: InputMaybe +} + +/** A connection to a list of `CcipTokenPoolLanesGroup` values. */ +export type CcipTokenPoolLanesGroupsConnection = { + __typename?: "CcipTokenPoolLanesGroupsConnection" + /** A list of edges which contains the `CcipTokenPoolLanesGroup` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTokenPoolLanesGroup` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTokenPoolLanesGroup` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTokenPoolLanesGroup` edge in the connection. */ +export type CcipTokenPoolLanesGroupsEdge = { + __typename?: "CcipTokenPoolLanesGroupsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTokenPoolLanesGroup` at the end of the edge. */ + node: CcipTokenPoolLanesGroup +} + +/** Methods to use when ordering `CcipTokenPoolLanesGroup`. */ +export enum CcipTokenPoolLanesGroupsOrderBy { + AdminsAsc = "ADMINS_ASC", + AdminsDesc = "ADMINS_DESC", + CreatedAtAsc = "CREATED_AT_ASC", + CreatedAtDesc = "CREATED_AT_DESC", + Natural = "NATURAL", + OwnersAsc = "OWNERS_ASC", + OwnersDesc = "OWNERS_DESC", + PkAsc = "PK_ASC", + PkDesc = "PK_DESC", + TokenGroupAsc = "TOKEN_GROUP_ASC", + TokenGroupDesc = "TOKEN_GROUP_DESC", + UpdatedAtAsc = "UPDATED_AT_ASC", + UpdatedAtDesc = "UPDATED_AT_DESC", +} + +/** Methods to use when ordering `CcipTokenPoolLane`. */ +export enum CcipTokenPoolLanesOrderBy { + BlockHashAsc = "BLOCK_HASH_ASC", + BlockHashDesc = "BLOCK_HASH_DESC", + BlockNumberAsc = "BLOCK_NUMBER_ASC", + BlockNumberDesc = "BLOCK_NUMBER_DESC", + BlockTimestampAsc = "BLOCK_TIMESTAMP_ASC", + BlockTimestampDesc = "BLOCK_TIMESTAMP_DESC", + CreatedAtAsc = "CREATED_AT_ASC", + CreatedAtDesc = "CREATED_AT_DESC", + CustomInboundCapacityAsc = "CUSTOM_INBOUND_CAPACITY_ASC", + CustomInboundCapacityDesc = "CUSTOM_INBOUND_CAPACITY_DESC", + CustomInboundEnabledAsc = "CUSTOM_INBOUND_ENABLED_ASC", + CustomInboundEnabledDesc = "CUSTOM_INBOUND_ENABLED_DESC", + CustomInboundRateAsc = "CUSTOM_INBOUND_RATE_ASC", + CustomInboundRateDesc = "CUSTOM_INBOUND_RATE_DESC", + CustomOutboundCapacityAsc = "CUSTOM_OUTBOUND_CAPACITY_ASC", + CustomOutboundCapacityDesc = "CUSTOM_OUTBOUND_CAPACITY_DESC", + CustomOutboundEnabledAsc = "CUSTOM_OUTBOUND_ENABLED_ASC", + CustomOutboundEnabledDesc = "CUSTOM_OUTBOUND_ENABLED_DESC", + CustomOutboundRateAsc = "CUSTOM_OUTBOUND_RATE_ASC", + CustomOutboundRateDesc = "CUSTOM_OUTBOUND_RATE_DESC", + InboundCapacityAsc = "INBOUND_CAPACITY_ASC", + InboundCapacityDesc = "INBOUND_CAPACITY_DESC", + InboundEnabledAsc = "INBOUND_ENABLED_ASC", + InboundEnabledDesc = "INBOUND_ENABLED_DESC", + InboundRateAsc = "INBOUND_RATE_ASC", + InboundRateDesc = "INBOUND_RATE_DESC", + LogIndexAsc = "LOG_INDEX_ASC", + LogIndexDesc = "LOG_INDEX_DESC", + Natural = "NATURAL", + NetworkAsc = "NETWORK_ASC", + NetworkDesc = "NETWORK_DESC", + OutboundCapacityAsc = "OUTBOUND_CAPACITY_ASC", + OutboundCapacityDesc = "OUTBOUND_CAPACITY_DESC", + OutboundEnabledAsc = "OUTBOUND_ENABLED_ASC", + OutboundEnabledDesc = "OUTBOUND_ENABLED_DESC", + OutboundRateAsc = "OUTBOUND_RATE_ASC", + OutboundRateDesc = "OUTBOUND_RATE_DESC", + RemoteNetworkNameAsc = "REMOTE_NETWORK_NAME_ASC", + RemoteNetworkNameDesc = "REMOTE_NETWORK_NAME_DESC", + RemoteTokenAsc = "REMOTE_TOKEN_ASC", + RemoteTokenDesc = "REMOTE_TOKEN_DESC", + RemoteTokenPoolsAsc = "REMOTE_TOKEN_POOLS_ASC", + RemoteTokenPoolsDesc = "REMOTE_TOKEN_POOLS_DESC", + RemovedAsc = "REMOVED_ASC", + RemovedDesc = "REMOVED_DESC", + TokenAsc = "TOKEN_ASC", + TokenDesc = "TOKEN_DESC", + TokenPoolAsc = "TOKEN_POOL_ASC", + TokenPoolDesc = "TOKEN_POOL_DESC", + TransactionHashAsc = "TRANSACTION_HASH_ASC", + TransactionHashDesc = "TRANSACTION_HASH_DESC", + UpdatedAtAsc = "UPDATED_AT_ASC", + UpdatedAtDesc = "UPDATED_AT_DESC", +} + +export type CcipTokenPoolLanesWithPool = { + __typename?: "CcipTokenPoolLanesWithPool" + administrator?: Maybe + allowlist?: Maybe + blockHash?: Maybe + blockNumber?: Maybe + blockTimestamp?: Maybe + createdAt?: Maybe + customInboundCapacity?: Maybe + customInboundEnabled?: Maybe + customInboundRate?: Maybe + customOutboundCapacity?: Maybe + customOutboundEnabled?: Maybe + customOutboundRate?: Maybe + inboundCapacity?: Maybe + inboundEnabled?: Maybe + inboundRate?: Maybe + logIndex?: Maybe + network?: Maybe + outboundCapacity?: Maybe + outboundEnabled?: Maybe + outboundRate?: Maybe + owner?: Maybe + pendingAdministrator?: Maybe + pendingOwner?: Maybe + previousPool?: Maybe + previousPoolTypeAndVersion?: Maybe + registry?: Maybe + remoteNetworkName?: Maybe + remoteToken?: Maybe + remoteTokenPools?: Maybe>> + removed?: Maybe + router?: Maybe + token?: Maybe + tokenDecimals?: Maybe + tokenName?: Maybe + tokenPool?: Maybe + tokenRegisteredAt?: Maybe + tokenSymbol?: Maybe + transactionHash?: Maybe + typeAndVersion?: Maybe + updatedAt?: Maybe +} + +/** + * A condition to be used against `CcipTokenPoolLanesWithPool` object types. All + * fields are tested for equality and combined with a logical ‘and.’ + */ +export type CcipTokenPoolLanesWithPoolCondition = { + /** Checks for equality with the object’s `administrator` field. */ + administrator?: InputMaybe + /** Checks for equality with the object’s `allowlist` field. */ + allowlist?: InputMaybe + /** Checks for equality with the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Checks for equality with the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Checks for equality with the object’s `blockTimestamp` field. */ + blockTimestamp?: InputMaybe + /** Checks for equality with the object’s `createdAt` field. */ + createdAt?: InputMaybe + /** Checks for equality with the object’s `customInboundCapacity` field. */ + customInboundCapacity?: InputMaybe + /** Checks for equality with the object’s `customInboundEnabled` field. */ + customInboundEnabled?: InputMaybe + /** Checks for equality with the object’s `customInboundRate` field. */ + customInboundRate?: InputMaybe + /** Checks for equality with the object’s `customOutboundCapacity` field. */ + customOutboundCapacity?: InputMaybe + /** Checks for equality with the object’s `customOutboundEnabled` field. */ + customOutboundEnabled?: InputMaybe + /** Checks for equality with the object’s `customOutboundRate` field. */ + customOutboundRate?: InputMaybe + /** Checks for equality with the object’s `inboundCapacity` field. */ + inboundCapacity?: InputMaybe + /** Checks for equality with the object’s `inboundEnabled` field. */ + inboundEnabled?: InputMaybe + /** Checks for equality with the object’s `inboundRate` field. */ + inboundRate?: InputMaybe + /** Checks for equality with the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Checks for equality with the object’s `network` field. */ + network?: InputMaybe + /** Checks for equality with the object’s `outboundCapacity` field. */ + outboundCapacity?: InputMaybe + /** Checks for equality with the object’s `outboundEnabled` field. */ + outboundEnabled?: InputMaybe + /** Checks for equality with the object’s `outboundRate` field. */ + outboundRate?: InputMaybe + /** Checks for equality with the object’s `owner` field. */ + owner?: InputMaybe + /** Checks for equality with the object’s `pendingAdministrator` field. */ + pendingAdministrator?: InputMaybe + /** Checks for equality with the object’s `pendingOwner` field. */ + pendingOwner?: InputMaybe + /** Checks for equality with the object’s `previousPool` field. */ + previousPool?: InputMaybe + /** Checks for equality with the object’s `previousPoolTypeAndVersion` field. */ + previousPoolTypeAndVersion?: InputMaybe + /** Checks for equality with the object’s `registry` field. */ + registry?: InputMaybe + /** Checks for equality with the object’s `remoteNetworkName` field. */ + remoteNetworkName?: InputMaybe + /** Checks for equality with the object’s `remoteToken` field. */ + remoteToken?: InputMaybe + /** Checks for equality with the object’s `remoteTokenPools` field. */ + remoteTokenPools?: InputMaybe>> + /** Checks for equality with the object’s `removed` field. */ + removed?: InputMaybe + /** Checks for equality with the object’s `router` field. */ + router?: InputMaybe + /** Checks for equality with the object’s `token` field. */ + token?: InputMaybe + /** Checks for equality with the object’s `tokenDecimals` field. */ + tokenDecimals?: InputMaybe + /** Checks for equality with the object’s `tokenName` field. */ + tokenName?: InputMaybe + /** Checks for equality with the object’s `tokenPool` field. */ + tokenPool?: InputMaybe + /** Checks for equality with the object’s `tokenRegisteredAt` field. */ + tokenRegisteredAt?: InputMaybe + /** Checks for equality with the object’s `tokenSymbol` field. */ + tokenSymbol?: InputMaybe + /** Checks for equality with the object’s `transactionHash` field. */ + transactionHash?: InputMaybe + /** Checks for equality with the object’s `typeAndVersion` field. */ + typeAndVersion?: InputMaybe + /** Checks for equality with the object’s `updatedAt` field. */ + updatedAt?: InputMaybe +} + +/** A filter to be used against `CcipTokenPoolLanesWithPool` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTokenPoolLanesWithPoolFilter = { + /** Filter by the object’s `administrator` field. */ + administrator?: InputMaybe + /** Filter by the object’s `allowlist` field. */ + allowlist?: InputMaybe + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `blockHash` field. */ + blockHash?: InputMaybe + /** Filter by the object’s `blockNumber` field. */ + blockNumber?: InputMaybe + /** Filter by the object’s `customInboundEnabled` field. */ + customInboundEnabled?: InputMaybe + /** Filter by the object’s `customOutboundEnabled` field. */ + customOutboundEnabled?: InputMaybe + /** Filter by the object’s `inboundEnabled` field. */ + inboundEnabled?: InputMaybe + /** Filter by the object’s `logIndex` field. */ + logIndex?: InputMaybe + /** Filter by the object’s `network` field. */ + network?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `outboundEnabled` field. */ + outboundEnabled?: InputMaybe + /** Filter by the object’s `owner` field. */ + owner?: InputMaybe + /** Filter by the object’s `pendingAdministrator` field. */ + pendingAdministrator?: InputMaybe + /** Filter by the object’s `pendingOwner` field. */ + pendingOwner?: InputMaybe + /** Filter by the object’s `previousPool` field. */ + previousPool?: InputMaybe + /** Filter by the object’s `previousPoolTypeAndVersion` field. */ + previousPoolTypeAndVersion?: InputMaybe + /** Filter by the object’s `registry` field. */ + registry?: InputMaybe + /** Filter by the object’s `remoteNetworkName` field. */ + remoteNetworkName?: InputMaybe + /** Filter by the object’s `remoteToken` field. */ + remoteToken?: InputMaybe + /** Filter by the object’s `remoteTokenPools` field. */ + remoteTokenPools?: InputMaybe + /** Filter by the object’s `removed` field. */ + removed?: InputMaybe + /** Filter by the object’s `router` field. */ + router?: InputMaybe + /** Filter by the object’s `token` field. */ + token?: InputMaybe + /** Filter by the object’s `tokenDecimals` field. */ + tokenDecimals?: InputMaybe + /** Filter by the object’s `tokenName` field. */ + tokenName?: InputMaybe + /** Filter by the object’s `tokenPool` field. */ + tokenPool?: InputMaybe + /** Filter by the object’s `tokenSymbol` field. */ + tokenSymbol?: InputMaybe + /** Filter by the object’s `transactionHash` field. */ + transactionHash?: InputMaybe + /** Filter by the object’s `typeAndVersion` field. */ + typeAndVersion?: InputMaybe +} + +/** A connection to a list of `CcipTokenPoolLanesWithPool` values. */ +export type CcipTokenPoolLanesWithPoolsConnection = { + __typename?: "CcipTokenPoolLanesWithPoolsConnection" + /** A list of edges which contains the `CcipTokenPoolLanesWithPool` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTokenPoolLanesWithPool` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTokenPoolLanesWithPool` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTokenPoolLanesWithPool` edge in the connection. */ +export type CcipTokenPoolLanesWithPoolsEdge = { + __typename?: "CcipTokenPoolLanesWithPoolsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTokenPoolLanesWithPool` at the end of the edge. */ + node: CcipTokenPoolLanesWithPool +} + +/** Methods to use when ordering `CcipTokenPoolLanesWithPool`. */ +export enum CcipTokenPoolLanesWithPoolsOrderBy { + AdministratorAsc = "ADMINISTRATOR_ASC", + AdministratorDesc = "ADMINISTRATOR_DESC", + AllowlistAsc = "ALLOWLIST_ASC", + AllowlistDesc = "ALLOWLIST_DESC", + BlockHashAsc = "BLOCK_HASH_ASC", + BlockHashDesc = "BLOCK_HASH_DESC", + BlockNumberAsc = "BLOCK_NUMBER_ASC", + BlockNumberDesc = "BLOCK_NUMBER_DESC", + BlockTimestampAsc = "BLOCK_TIMESTAMP_ASC", + BlockTimestampDesc = "BLOCK_TIMESTAMP_DESC", + CreatedAtAsc = "CREATED_AT_ASC", + CreatedAtDesc = "CREATED_AT_DESC", + CustomInboundCapacityAsc = "CUSTOM_INBOUND_CAPACITY_ASC", + CustomInboundCapacityDesc = "CUSTOM_INBOUND_CAPACITY_DESC", + CustomInboundEnabledAsc = "CUSTOM_INBOUND_ENABLED_ASC", + CustomInboundEnabledDesc = "CUSTOM_INBOUND_ENABLED_DESC", + CustomInboundRateAsc = "CUSTOM_INBOUND_RATE_ASC", + CustomInboundRateDesc = "CUSTOM_INBOUND_RATE_DESC", + CustomOutboundCapacityAsc = "CUSTOM_OUTBOUND_CAPACITY_ASC", + CustomOutboundCapacityDesc = "CUSTOM_OUTBOUND_CAPACITY_DESC", + CustomOutboundEnabledAsc = "CUSTOM_OUTBOUND_ENABLED_ASC", + CustomOutboundEnabledDesc = "CUSTOM_OUTBOUND_ENABLED_DESC", + CustomOutboundRateAsc = "CUSTOM_OUTBOUND_RATE_ASC", + CustomOutboundRateDesc = "CUSTOM_OUTBOUND_RATE_DESC", + InboundCapacityAsc = "INBOUND_CAPACITY_ASC", + InboundCapacityDesc = "INBOUND_CAPACITY_DESC", + InboundEnabledAsc = "INBOUND_ENABLED_ASC", + InboundEnabledDesc = "INBOUND_ENABLED_DESC", + InboundRateAsc = "INBOUND_RATE_ASC", + InboundRateDesc = "INBOUND_RATE_DESC", + LogIndexAsc = "LOG_INDEX_ASC", + LogIndexDesc = "LOG_INDEX_DESC", + Natural = "NATURAL", + NetworkAsc = "NETWORK_ASC", + NetworkDesc = "NETWORK_DESC", + OutboundCapacityAsc = "OUTBOUND_CAPACITY_ASC", + OutboundCapacityDesc = "OUTBOUND_CAPACITY_DESC", + OutboundEnabledAsc = "OUTBOUND_ENABLED_ASC", + OutboundEnabledDesc = "OUTBOUND_ENABLED_DESC", + OutboundRateAsc = "OUTBOUND_RATE_ASC", + OutboundRateDesc = "OUTBOUND_RATE_DESC", + OwnerAsc = "OWNER_ASC", + OwnerDesc = "OWNER_DESC", + PendingAdministratorAsc = "PENDING_ADMINISTRATOR_ASC", + PendingAdministratorDesc = "PENDING_ADMINISTRATOR_DESC", + PendingOwnerAsc = "PENDING_OWNER_ASC", + PendingOwnerDesc = "PENDING_OWNER_DESC", + PreviousPoolAsc = "PREVIOUS_POOL_ASC", + PreviousPoolDesc = "PREVIOUS_POOL_DESC", + PreviousPoolTypeAndVersionAsc = "PREVIOUS_POOL_TYPE_AND_VERSION_ASC", + PreviousPoolTypeAndVersionDesc = "PREVIOUS_POOL_TYPE_AND_VERSION_DESC", + RegistryAsc = "REGISTRY_ASC", + RegistryDesc = "REGISTRY_DESC", + RemoteNetworkNameAsc = "REMOTE_NETWORK_NAME_ASC", + RemoteNetworkNameDesc = "REMOTE_NETWORK_NAME_DESC", + RemoteTokenAsc = "REMOTE_TOKEN_ASC", + RemoteTokenDesc = "REMOTE_TOKEN_DESC", + RemoteTokenPoolsAsc = "REMOTE_TOKEN_POOLS_ASC", + RemoteTokenPoolsDesc = "REMOTE_TOKEN_POOLS_DESC", + RemovedAsc = "REMOVED_ASC", + RemovedDesc = "REMOVED_DESC", + RouterAsc = "ROUTER_ASC", + RouterDesc = "ROUTER_DESC", + TokenAsc = "TOKEN_ASC", + TokenDecimalsAsc = "TOKEN_DECIMALS_ASC", + TokenDecimalsDesc = "TOKEN_DECIMALS_DESC", + TokenDesc = "TOKEN_DESC", + TokenNameAsc = "TOKEN_NAME_ASC", + TokenNameDesc = "TOKEN_NAME_DESC", + TokenPoolAsc = "TOKEN_POOL_ASC", + TokenPoolDesc = "TOKEN_POOL_DESC", + TokenRegisteredAtAsc = "TOKEN_REGISTERED_AT_ASC", + TokenRegisteredAtDesc = "TOKEN_REGISTERED_AT_DESC", + TokenSymbolAsc = "TOKEN_SYMBOL_ASC", + TokenSymbolDesc = "TOKEN_SYMBOL_DESC", + TransactionHashAsc = "TRANSACTION_HASH_ASC", + TransactionHashDesc = "TRANSACTION_HASH_DESC", + TypeAndVersionAsc = "TYPE_AND_VERSION_ASC", + TypeAndVersionDesc = "TYPE_AND_VERSION_DESC", + UpdatedAtAsc = "UPDATED_AT_ASC", + UpdatedAtDesc = "UPDATED_AT_DESC", +} + +/** A connection to a list of `CcipTokenPool` values. */ +export type CcipTokenPoolsConnection = { + __typename?: "CcipTokenPoolsConnection" + /** A list of edges which contains the `CcipTokenPool` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTokenPool` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTokenPool` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTokenPool` edge in the connection. */ +export type CcipTokenPoolsEdge = { + __typename?: "CcipTokenPoolsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTokenPool` at the end of the edge. */ + node: CcipTokenPool +} + +/** Methods to use when ordering `CcipTokenPool`. */ +export enum CcipTokenPoolsOrderBy { + AdministratorAsc = "ADMINISTRATOR_ASC", + AdministratorDesc = "ADMINISTRATOR_DESC", + AllowlistAsc = "ALLOWLIST_ASC", + AllowlistDesc = "ALLOWLIST_DESC", + BlockHashAsc = "BLOCK_HASH_ASC", + BlockHashDesc = "BLOCK_HASH_DESC", + BlockNumberAsc = "BLOCK_NUMBER_ASC", + BlockNumberDesc = "BLOCK_NUMBER_DESC", + BlockTimestampAsc = "BLOCK_TIMESTAMP_ASC", + BlockTimestampDesc = "BLOCK_TIMESTAMP_DESC", + CreatedAtAsc = "CREATED_AT_ASC", + CreatedAtDesc = "CREATED_AT_DESC", + LogIndexAsc = "LOG_INDEX_ASC", + LogIndexDesc = "LOG_INDEX_DESC", + MinBlockConfirmationsAsc = "MIN_BLOCK_CONFIRMATIONS_ASC", + MinBlockConfirmationsDesc = "MIN_BLOCK_CONFIRMATIONS_DESC", + Natural = "NATURAL", + NetworkAsc = "NETWORK_ASC", + NetworkDesc = "NETWORK_DESC", + OwnerAsc = "OWNER_ASC", + OwnerDesc = "OWNER_DESC", + PendingAdministratorAsc = "PENDING_ADMINISTRATOR_ASC", + PendingAdministratorDesc = "PENDING_ADMINISTRATOR_DESC", + PendingOwnerAsc = "PENDING_OWNER_ASC", + PendingOwnerDesc = "PENDING_OWNER_DESC", + PreviousPoolAsc = "PREVIOUS_POOL_ASC", + PreviousPoolDesc = "PREVIOUS_POOL_DESC", + PreviousPoolTypeAndVersionAsc = "PREVIOUS_POOL_TYPE_AND_VERSION_ASC", + PreviousPoolTypeAndVersionDesc = "PREVIOUS_POOL_TYPE_AND_VERSION_DESC", + RegistryAsc = "REGISTRY_ASC", + RegistryDesc = "REGISTRY_DESC", + RouterAsc = "ROUTER_ASC", + RouterDesc = "ROUTER_DESC", + TokenAsc = "TOKEN_ASC", + TokenDecimalsAsc = "TOKEN_DECIMALS_ASC", + TokenDecimalsDesc = "TOKEN_DECIMALS_DESC", + TokenDesc = "TOKEN_DESC", + TokenNameAsc = "TOKEN_NAME_ASC", + TokenNameDesc = "TOKEN_NAME_DESC", + TokenPoolAsc = "TOKEN_POOL_ASC", + TokenPoolDesc = "TOKEN_POOL_DESC", + TokenSymbolAsc = "TOKEN_SYMBOL_ASC", + TokenSymbolDesc = "TOKEN_SYMBOL_DESC", + TransactionHashAsc = "TRANSACTION_HASH_ASC", + TransactionHashDesc = "TRANSACTION_HASH_DESC", + TypeAndVersionAsc = "TYPE_AND_VERSION_ASC", + TypeAndVersionDesc = "TYPE_AND_VERSION_DESC", + UpdatedAtAsc = "UPDATED_AT_ASC", + UpdatedAtDesc = "UPDATED_AT_DESC", +} + +export type CcipTransaction = { + __typename?: "CcipTransaction" + blockTimestamp?: Maybe + commitStoreAddress?: Maybe + destChainId?: Maybe + destNetworkName?: Maybe + destRouterAddress?: Maybe + destTransactionHash?: Maybe + info?: Maybe + infoRaw?: Maybe + messageId?: Maybe + offrampAddress?: Maybe + onrampAddress?: Maybe + origin?: Maybe + receiptTimestamp?: Maybe + receiver?: Maybe + sender?: Maybe + sequenceNumber?: Maybe + sourceChainId?: Maybe + sourceNetworkName?: Maybe + sourceRouterAddress?: Maybe + state?: Maybe + transactionHash?: Maybe +} + +/** + * A condition to be used against `CcipTransaction` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type CcipTransactionCondition = { + /** Checks for equality with the object’s `blockTimestamp` field. */ + blockTimestamp?: InputMaybe + /** Checks for equality with the object’s `commitStoreAddress` field. */ + commitStoreAddress?: InputMaybe + /** Checks for equality with the object’s `destChainId` field. */ + destChainId?: InputMaybe + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `destRouterAddress` field. */ + destRouterAddress?: InputMaybe + /** Checks for equality with the object’s `destTransactionHash` field. */ + destTransactionHash?: InputMaybe + /** Checks for equality with the object’s `info` field. */ + info?: InputMaybe + /** Checks for equality with the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Checks for equality with the object’s `messageId` field. */ + messageId?: InputMaybe + /** Checks for equality with the object’s `offrampAddress` field. */ + offrampAddress?: InputMaybe + /** Checks for equality with the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for equality with the object’s `origin` field. */ + origin?: InputMaybe + /** Checks for equality with the object’s `receiptTimestamp` field. */ + receiptTimestamp?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `sender` field. */ + sender?: InputMaybe + /** Checks for equality with the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Checks for equality with the object’s `sourceChainId` field. */ + sourceChainId?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `sourceRouterAddress` field. */ + sourceRouterAddress?: InputMaybe + /** Checks for equality with the object’s `state` field. */ + state?: InputMaybe + /** Checks for equality with the object’s `transactionHash` field. */ + transactionHash?: InputMaybe +} + +/** A filter to be used against `CcipTransaction` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTransactionFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `commitStoreAddress` field. */ + commitStoreAddress?: InputMaybe + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Filter by the object’s `destRouterAddress` field. */ + destRouterAddress?: InputMaybe + /** Filter by the object’s `destTransactionHash` field. */ + destTransactionHash?: InputMaybe + /** Filter by the object’s `info` field. */ + info?: InputMaybe + /** Filter by the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Filter by the object’s `messageId` field. */ + messageId?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Filter by the object’s `offrampAddress` field. */ + offrampAddress?: InputMaybe + /** Filter by the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `origin` field. */ + origin?: InputMaybe + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `sender` field. */ + sender?: InputMaybe + /** Filter by the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `sourceRouterAddress` field. */ + sourceRouterAddress?: InputMaybe + /** Filter by the object’s `state` field. */ + state?: InputMaybe + /** Filter by the object’s `transactionHash` field. */ + transactionHash?: InputMaybe +} + +/** A connection to a list of `CcipTransaction` values. */ +export type CcipTransactionsConnection = { + __typename?: "CcipTransactionsConnection" + /** A list of edges which contains the `CcipTransaction` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTransaction` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTransaction` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTransaction` edge in the connection. */ +export type CcipTransactionsEdge = { + __typename?: "CcipTransactionsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTransaction` at the end of the edge. */ + node: CcipTransaction +} + +export type CcipTransactionsFlat = { + __typename?: "CcipTransactionsFlat" + blockTimestamp?: Maybe + commitStoreAddress?: Maybe + data?: Maybe + destChainId?: Maybe + destNetworkName?: Maybe + destRouterAddress?: Maybe + destTransactionHash?: Maybe + feeToken?: Maybe + feeTokenAmount?: Maybe + gasLimit?: Maybe + info?: Maybe + infoRaw?: Maybe + messageId?: Maybe + nonce?: Maybe + offrampAddress?: Maybe + onrampAddress?: Maybe + origin?: Maybe + receiptTimestamp?: Maybe + receiver?: Maybe + sender?: Maybe + sequenceNumber?: Maybe + sourceChainId?: Maybe + sourceNetworkName?: Maybe + sourceRouterAddress?: Maybe + state?: Maybe + strict?: Maybe + tokenAmounts?: Maybe + transactionHash?: Maybe +} + +/** + * A condition to be used against `CcipTransactionsFlat` object types. All fields + * are tested for equality and combined with a logical ‘and.’ + */ +export type CcipTransactionsFlatCondition = { + /** Checks for equality with the object’s `blockTimestamp` field. */ + blockTimestamp?: InputMaybe + /** Checks for equality with the object’s `commitStoreAddress` field. */ + commitStoreAddress?: InputMaybe + /** Checks for equality with the object’s `data` field. */ + data?: InputMaybe + /** Checks for equality with the object’s `destChainId` field. */ + destChainId?: InputMaybe + /** Checks for equality with the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Checks for equality with the object’s `destRouterAddress` field. */ + destRouterAddress?: InputMaybe + /** Checks for equality with the object’s `destTransactionHash` field. */ + destTransactionHash?: InputMaybe + /** Checks for equality with the object’s `feeToken` field. */ + feeToken?: InputMaybe + /** Checks for equality with the object’s `feeTokenAmount` field. */ + feeTokenAmount?: InputMaybe + /** Checks for equality with the object’s `gasLimit` field. */ + gasLimit?: InputMaybe + /** Checks for equality with the object’s `info` field. */ + info?: InputMaybe + /** Checks for equality with the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Checks for equality with the object’s `messageId` field. */ + messageId?: InputMaybe + /** Checks for equality with the object’s `nonce` field. */ + nonce?: InputMaybe + /** Checks for equality with the object’s `offrampAddress` field. */ + offrampAddress?: InputMaybe + /** Checks for equality with the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for equality with the object’s `origin` field. */ + origin?: InputMaybe + /** Checks for equality with the object’s `receiptTimestamp` field. */ + receiptTimestamp?: InputMaybe + /** Checks for equality with the object’s `receiver` field. */ + receiver?: InputMaybe + /** Checks for equality with the object’s `sender` field. */ + sender?: InputMaybe + /** Checks for equality with the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Checks for equality with the object’s `sourceChainId` field. */ + sourceChainId?: InputMaybe + /** Checks for equality with the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Checks for equality with the object’s `sourceRouterAddress` field. */ + sourceRouterAddress?: InputMaybe + /** Checks for equality with the object’s `state` field. */ + state?: InputMaybe + /** Checks for equality with the object’s `strict` field. */ + strict?: InputMaybe + /** Checks for equality with the object’s `tokenAmounts` field. */ + tokenAmounts?: InputMaybe + /** Checks for equality with the object’s `transactionHash` field. */ + transactionHash?: InputMaybe +} + +/** A filter to be used against `CcipTransactionsFlat` object types. All fields are combined with a logical ‘and.’ */ +export type CcipTransactionsFlatFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Filter by the object’s `commitStoreAddress` field. */ + commitStoreAddress?: InputMaybe + /** Filter by the object’s `data` field. */ + data?: InputMaybe + /** Filter by the object’s `destNetworkName` field. */ + destNetworkName?: InputMaybe + /** Filter by the object’s `destRouterAddress` field. */ + destRouterAddress?: InputMaybe + /** Filter by the object’s `destTransactionHash` field. */ + destTransactionHash?: InputMaybe + /** Filter by the object’s `feeToken` field. */ + feeToken?: InputMaybe + /** Filter by the object’s `feeTokenAmount` field. */ + feeTokenAmount?: InputMaybe + /** Filter by the object’s `info` field. */ + info?: InputMaybe + /** Filter by the object’s `infoRaw` field. */ + infoRaw?: InputMaybe + /** Filter by the object’s `messageId` field. */ + messageId?: InputMaybe + /** Filter by the object’s `nonce` field. */ + nonce?: InputMaybe + /** Negates the expression. */ + not?: InputMaybe + /** Filter by the object’s `offrampAddress` field. */ + offrampAddress?: InputMaybe + /** Filter by the object’s `onrampAddress` field. */ + onrampAddress?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `origin` field. */ + origin?: InputMaybe + /** Filter by the object’s `receiver` field. */ + receiver?: InputMaybe + /** Filter by the object’s `sender` field. */ + sender?: InputMaybe + /** Filter by the object’s `sequenceNumber` field. */ + sequenceNumber?: InputMaybe + /** Filter by the object’s `sourceNetworkName` field. */ + sourceNetworkName?: InputMaybe + /** Filter by the object’s `sourceRouterAddress` field. */ + sourceRouterAddress?: InputMaybe + /** Filter by the object’s `state` field. */ + state?: InputMaybe + /** Filter by the object’s `strict` field. */ + strict?: InputMaybe + /** Filter by the object’s `tokenAmounts` field. */ + tokenAmounts?: InputMaybe + /** Filter by the object’s `transactionHash` field. */ + transactionHash?: InputMaybe +} + +/** A connection to a list of `CcipTransactionsFlat` values. */ +export type CcipTransactionsFlatsConnection = { + __typename?: "CcipTransactionsFlatsConnection" + /** A list of edges which contains the `CcipTransactionsFlat` and cursor to aid in pagination. */ + edges: Array + /** A list of `CcipTransactionsFlat` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `CcipTransactionsFlat` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `CcipTransactionsFlat` edge in the connection. */ +export type CcipTransactionsFlatsEdge = { + __typename?: "CcipTransactionsFlatsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `CcipTransactionsFlat` at the end of the edge. */ + node: CcipTransactionsFlat +} + +/** Methods to use when ordering `CcipTransactionsFlat`. */ +export enum CcipTransactionsFlatsOrderBy { + BlockTimestampAsc = "BLOCK_TIMESTAMP_ASC", + BlockTimestampDesc = "BLOCK_TIMESTAMP_DESC", + CommitStoreAddressAsc = "COMMIT_STORE_ADDRESS_ASC", + CommitStoreAddressDesc = "COMMIT_STORE_ADDRESS_DESC", + DataAsc = "DATA_ASC", + DataDesc = "DATA_DESC", + DestChainIdAsc = "DEST_CHAIN_ID_ASC", + DestChainIdDesc = "DEST_CHAIN_ID_DESC", + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + DestRouterAddressAsc = "DEST_ROUTER_ADDRESS_ASC", + DestRouterAddressDesc = "DEST_ROUTER_ADDRESS_DESC", + DestTransactionHashAsc = "DEST_TRANSACTION_HASH_ASC", + DestTransactionHashDesc = "DEST_TRANSACTION_HASH_DESC", + FeeTokenAmountAsc = "FEE_TOKEN_AMOUNT_ASC", + FeeTokenAmountDesc = "FEE_TOKEN_AMOUNT_DESC", + FeeTokenAsc = "FEE_TOKEN_ASC", + FeeTokenDesc = "FEE_TOKEN_DESC", + GasLimitAsc = "GAS_LIMIT_ASC", + GasLimitDesc = "GAS_LIMIT_DESC", + InfoAsc = "INFO_ASC", + InfoDesc = "INFO_DESC", + InfoRawAsc = "INFO_RAW_ASC", + InfoRawDesc = "INFO_RAW_DESC", + MessageIdAsc = "MESSAGE_ID_ASC", + MessageIdDesc = "MESSAGE_ID_DESC", + Natural = "NATURAL", + NonceAsc = "NONCE_ASC", + NonceDesc = "NONCE_DESC", + OfframpAddressAsc = "OFFRAMP_ADDRESS_ASC", + OfframpAddressDesc = "OFFRAMP_ADDRESS_DESC", + OnrampAddressAsc = "ONRAMP_ADDRESS_ASC", + OnrampAddressDesc = "ONRAMP_ADDRESS_DESC", + OriginAsc = "ORIGIN_ASC", + OriginDesc = "ORIGIN_DESC", + ReceiptTimestampAsc = "RECEIPT_TIMESTAMP_ASC", + ReceiptTimestampDesc = "RECEIPT_TIMESTAMP_DESC", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + SenderAsc = "SENDER_ASC", + SenderDesc = "SENDER_DESC", + SequenceNumberAsc = "SEQUENCE_NUMBER_ASC", + SequenceNumberDesc = "SEQUENCE_NUMBER_DESC", + SourceChainIdAsc = "SOURCE_CHAIN_ID_ASC", + SourceChainIdDesc = "SOURCE_CHAIN_ID_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + SourceRouterAddressAsc = "SOURCE_ROUTER_ADDRESS_ASC", + SourceRouterAddressDesc = "SOURCE_ROUTER_ADDRESS_DESC", + StateAsc = "STATE_ASC", + StateDesc = "STATE_DESC", + StrictAsc = "STRICT_ASC", + StrictDesc = "STRICT_DESC", + TokenAmountsAsc = "TOKEN_AMOUNTS_ASC", + TokenAmountsDesc = "TOKEN_AMOUNTS_DESC", + TransactionHashAsc = "TRANSACTION_HASH_ASC", + TransactionHashDesc = "TRANSACTION_HASH_DESC", +} + +/** Methods to use when ordering `CcipTransaction`. */ +export enum CcipTransactionsOrderBy { + BlockTimestampAsc = "BLOCK_TIMESTAMP_ASC", + BlockTimestampDesc = "BLOCK_TIMESTAMP_DESC", + CommitStoreAddressAsc = "COMMIT_STORE_ADDRESS_ASC", + CommitStoreAddressDesc = "COMMIT_STORE_ADDRESS_DESC", + DestChainIdAsc = "DEST_CHAIN_ID_ASC", + DestChainIdDesc = "DEST_CHAIN_ID_DESC", + DestNetworkNameAsc = "DEST_NETWORK_NAME_ASC", + DestNetworkNameDesc = "DEST_NETWORK_NAME_DESC", + DestRouterAddressAsc = "DEST_ROUTER_ADDRESS_ASC", + DestRouterAddressDesc = "DEST_ROUTER_ADDRESS_DESC", + DestTransactionHashAsc = "DEST_TRANSACTION_HASH_ASC", + DestTransactionHashDesc = "DEST_TRANSACTION_HASH_DESC", + InfoAsc = "INFO_ASC", + InfoDesc = "INFO_DESC", + InfoRawAsc = "INFO_RAW_ASC", + InfoRawDesc = "INFO_RAW_DESC", + MessageIdAsc = "MESSAGE_ID_ASC", + MessageIdDesc = "MESSAGE_ID_DESC", + Natural = "NATURAL", + OfframpAddressAsc = "OFFRAMP_ADDRESS_ASC", + OfframpAddressDesc = "OFFRAMP_ADDRESS_DESC", + OnrampAddressAsc = "ONRAMP_ADDRESS_ASC", + OnrampAddressDesc = "ONRAMP_ADDRESS_DESC", + OriginAsc = "ORIGIN_ASC", + OriginDesc = "ORIGIN_DESC", + ReceiptTimestampAsc = "RECEIPT_TIMESTAMP_ASC", + ReceiptTimestampDesc = "RECEIPT_TIMESTAMP_DESC", + ReceiverAsc = "RECEIVER_ASC", + ReceiverDesc = "RECEIVER_DESC", + SenderAsc = "SENDER_ASC", + SenderDesc = "SENDER_DESC", + SequenceNumberAsc = "SEQUENCE_NUMBER_ASC", + SequenceNumberDesc = "SEQUENCE_NUMBER_DESC", + SourceChainIdAsc = "SOURCE_CHAIN_ID_ASC", + SourceChainIdDesc = "SOURCE_CHAIN_ID_DESC", + SourceNetworkNameAsc = "SOURCE_NETWORK_NAME_ASC", + SourceNetworkNameDesc = "SOURCE_NETWORK_NAME_DESC", + SourceRouterAddressAsc = "SOURCE_ROUTER_ADDRESS_ASC", + SourceRouterAddressDesc = "SOURCE_ROUTER_ADDRESS_DESC", + StateAsc = "STATE_ASC", + StateDesc = "STATE_DESC", + TransactionHashAsc = "TRANSACTION_HASH_ASC", + TransactionHashDesc = "TRANSACTION_HASH_DESC", +} + +/** A filter to be used against Int fields. All fields are combined with a logical ‘and.’ */ +export type IntFilter = { + /** Equal to the specified value. */ + equalTo?: InputMaybe + /** Greater than the specified value. */ + greaterThan?: InputMaybe + /** Greater than or equal to the specified value. */ + greaterThanOrEqualTo?: InputMaybe + /** Included in the specified list. */ + in?: InputMaybe> + /** Less than the specified value. */ + lessThan?: InputMaybe + /** Less than or equal to the specified value. */ + lessThanOrEqualTo?: InputMaybe + /** Not equal to the specified value. */ + notEqualTo?: InputMaybe +} + +/** A filter to be used against JSON fields. All fields are combined with a logical ‘and.’ */ +export type JsonFilter = { + /** Contains the specified JSON. */ + contains?: InputMaybe + /** Equal to the specified value. */ + equalTo?: InputMaybe + /** Greater than the specified value. */ + greaterThan?: InputMaybe + /** Greater than or equal to the specified value. */ + greaterThanOrEqualTo?: InputMaybe + /** Included in the specified list. */ + in?: InputMaybe> + /** Less than the specified value. */ + lessThan?: InputMaybe + /** Less than or equal to the specified value. */ + lessThanOrEqualTo?: InputMaybe + /** Not equal to the specified value. */ + notEqualTo?: InputMaybe +} + +/** An object with a globally unique `ID`. */ +export type Node = { + /** A globally unique identifier. Can be used in various places throughout the system to identify this single value. */ + nodeId: Scalars["ID"]["output"] +} + +/** Information about pagination in a connection. */ +export type PageInfo = { + __typename?: "PageInfo" + /** When paginating forwards, the cursor to continue. */ + endCursor?: Maybe + /** When paginating forwards, are there more items? */ + hasNextPage: Scalars["Boolean"]["output"] + /** When paginating backwards, are there more items? */ + hasPreviousPage: Scalars["Boolean"]["output"] + /** When paginating backwards, the cursor to continue. */ + startCursor?: Maybe +} + +/** The root query type which gives access points into the data universe. */ +export type Query = Node & { + __typename?: "Query" + /** Reads and enables pagination through a set of `CcipAllLaneStatus`. */ + allCcipAllLaneStatuses?: Maybe + /** Reads and enables pagination through a set of `CcipFastTransferFill`. */ + allCcipFastTransferFills?: Maybe + /** Reads and enables pagination through a set of `CcipLaneStatus`. */ + allCcipLaneStatuses?: Maybe + /** Reads and enables pagination through a set of `CcipLaneTimeEstimate`. */ + allCcipLaneTimeEstimates?: Maybe + /** Reads and enables pagination through a set of `CcipMessage`. */ + allCcipMessages?: Maybe + /** Reads and enables pagination through a set of `CcipMessagesFlat`. */ + allCcipMessagesFlats?: Maybe + /** Reads and enables pagination through a set of `CcipSend`. */ + allCcipSends?: Maybe + /** Reads and enables pagination through a set of `CcipTokenPoolEvent`. */ + allCcipTokenPoolEvents?: Maybe + /** Reads and enables pagination through a set of `CcipTokenPoolLane`. */ + allCcipTokenPoolLanes?: Maybe + /** Reads and enables pagination through a set of `CcipTokenPoolLanesGroup`. */ + allCcipTokenPoolLanesGroups?: Maybe + /** Reads and enables pagination through a set of `CcipTokenPoolLanesWithPool`. */ + allCcipTokenPoolLanesWithPools?: Maybe + /** Reads and enables pagination through a set of `CcipTokenPool`. */ + allCcipTokenPools?: Maybe + /** Reads and enables pagination through a set of `CcipTransaction`. */ + allCcipTransactions?: Maybe + /** Reads and enables pagination through a set of `CcipTransactionsFlat`. */ + allCcipTransactionsFlats?: Maybe + /** Reads and enables pagination through a set of `SchemaMigration`. */ + allSchemaMigrations?: Maybe + /** Fetches an object given its globally unique `ID`. */ + node?: Maybe + /** The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`. */ + nodeId: Scalars["ID"]["output"] + /** + * Exposes the root query type nested one level down. This is helpful for Relay 1 + * which can only query top level fields if they are in a particular form. + */ + query: Query + /** Reads a single `SchemaMigration` using its globally unique `ID`. */ + schemaMigration?: Maybe + schemaMigrationByVersion?: Maybe +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipAllLaneStatusesArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipFastTransferFillsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipLaneStatusesArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipLaneTimeEstimatesArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipMessagesArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipMessagesFlatsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipSendsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTokenPoolEventsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTokenPoolLanesArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTokenPoolLanesGroupsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTokenPoolLanesWithPoolsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTokenPoolsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTransactionsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllCcipTransactionsFlatsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryAllSchemaMigrationsArgs = { + after?: InputMaybe + before?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe + first?: InputMaybe + last?: InputMaybe + offset?: InputMaybe + orderBy?: InputMaybe> +} + +/** The root query type which gives access points into the data universe. */ +export type QueryNodeArgs = { + nodeId: Scalars["ID"]["input"] +} + +/** The root query type which gives access points into the data universe. */ +export type QuerySchemaMigrationArgs = { + nodeId: Scalars["ID"]["input"] +} + +/** The root query type which gives access points into the data universe. */ +export type QuerySchemaMigrationByVersionArgs = { + version: Scalars["String"]["input"] +} + +export type SchemaMigration = Node & { + __typename?: "SchemaMigration" + /** A globally unique identifier. Can be used in various places throughout the system to identify this single value. */ + nodeId: Scalars["ID"]["output"] + version: Scalars["String"]["output"] +} + +/** + * A condition to be used against `SchemaMigration` object types. All fields are + * tested for equality and combined with a logical ‘and.’ + */ +export type SchemaMigrationCondition = { + /** Checks for equality with the object’s `version` field. */ + version?: InputMaybe +} + +/** A filter to be used against `SchemaMigration` object types. All fields are combined with a logical ‘and.’ */ +export type SchemaMigrationFilter = { + /** Checks for all expressions in this list. */ + and?: InputMaybe> + /** Negates the expression. */ + not?: InputMaybe + /** Checks for any expressions in this list. */ + or?: InputMaybe> + /** Filter by the object’s `version` field. */ + version?: InputMaybe +} + +/** A connection to a list of `SchemaMigration` values. */ +export type SchemaMigrationsConnection = { + __typename?: "SchemaMigrationsConnection" + /** A list of edges which contains the `SchemaMigration` and cursor to aid in pagination. */ + edges: Array + /** A list of `SchemaMigration` objects. */ + nodes: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** The count of *all* `SchemaMigration` you could get from the connection. */ + totalCount: Scalars["Int"]["output"] +} + +/** A `SchemaMigration` edge in the connection. */ +export type SchemaMigrationsEdge = { + __typename?: "SchemaMigrationsEdge" + /** A cursor for use in pagination. */ + cursor?: Maybe + /** The `SchemaMigration` at the end of the edge. */ + node: SchemaMigration +} + +/** Methods to use when ordering `SchemaMigration`. */ +export enum SchemaMigrationsOrderBy { + Natural = "NATURAL", + PrimaryKeyAsc = "PRIMARY_KEY_ASC", + PrimaryKeyDesc = "PRIMARY_KEY_DESC", + VersionAsc = "VERSION_ASC", + VersionDesc = "VERSION_DESC", +} + +/** A filter to be used against String fields. All fields are combined with a logical ‘and.’ */ +export type StringFilter = { + /** Equal to the specified value. */ + equalTo?: InputMaybe + /** Greater than the specified value. */ + greaterThan?: InputMaybe + /** Greater than or equal to the specified value. */ + greaterThanOrEqualTo?: InputMaybe + /** Included in the specified list. */ + in?: InputMaybe> + /** Less than the specified value. */ + lessThan?: InputMaybe + /** Less than or equal to the specified value. */ + lessThanOrEqualTo?: InputMaybe + /** Not equal to the specified value. */ + notEqualTo?: InputMaybe +} + +/** A filter to be used against String List fields. All fields are combined with a logical ‘and.’ */ +export type StringListFilter = { + /** Contains the specified list of values. */ + contains?: InputMaybe>> + /** Equal to the specified value. */ + equalTo?: InputMaybe>> + /** Greater than the specified value. */ + greaterThan?: InputMaybe>> + /** Greater than or equal to the specified value. */ + greaterThanOrEqualTo?: InputMaybe>> + /** Less than the specified value. */ + lessThan?: InputMaybe>> + /** Less than or equal to the specified value. */ + lessThanOrEqualTo?: InputMaybe>> + /** Not equal to the specified value. */ + notEqualTo?: InputMaybe>> +} + +export type GetTokenPoolLanesWithPoolsQueryVariables = Exact<{ + first?: InputMaybe + offset?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe +}> + +export type GetTokenPoolLanesWithPoolsQuery = { + __typename?: "Query" + allCcipTokenPoolLanesWithPools?: { + __typename?: "CcipTokenPoolLanesWithPoolsConnection" + totalCount: number + nodes: Array<{ + __typename?: "CcipTokenPoolLanesWithPool" + network?: string | null + token?: string | null + tokenSymbol?: string | null + tokenDecimals?: number | null + remoteNetworkName?: string | null + remoteToken?: string | null + removed?: boolean | null + typeAndVersion?: string | null + tokenPool?: string | null + inboundCapacity?: any | null + inboundRate?: any | null + inboundEnabled?: boolean | null + outboundCapacity?: any | null + outboundRate?: any | null + outboundEnabled?: boolean | null + customInboundCapacity?: any | null + customInboundRate?: any | null + customInboundEnabled?: boolean | null + customOutboundCapacity?: any | null + customOutboundRate?: any | null + customOutboundEnabled?: boolean | null + }> + } | null +} + +export type GetTokenPoolsQueryVariables = Exact<{ + first?: InputMaybe + offset?: InputMaybe + condition?: InputMaybe + filter?: InputMaybe +}> + +export type GetTokenPoolsQuery = { + __typename?: "Query" + allCcipTokenPools?: { + __typename?: "CcipTokenPoolsConnection" + totalCount: number + nodes: Array<{ + __typename?: "CcipTokenPool" + network?: string | null + token?: string | null + tokenSymbol?: string | null + typeAndVersion?: string | null + minBlockConfirmations?: number | null + tokenPool?: string | null + }> + } | null +} + +export const GetTokenPoolLanesWithPoolsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "GetTokenPoolLanesWithPools" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "first" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "offset" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "condition" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "CcipTokenPoolLanesWithPoolCondition" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "filter" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "CcipTokenPoolLanesWithPoolFilter" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "allCcipTokenPoolLanesWithPools" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "Variable", name: { kind: "Name", value: "first" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "offset" }, + value: { kind: "Variable", name: { kind: "Name", value: "offset" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "condition" }, + value: { kind: "Variable", name: { kind: "Name", value: "condition" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "filter" }, + value: { kind: "Variable", name: { kind: "Name", value: "filter" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "orderBy" }, + value: { + kind: "ListValue", + values: [ + { kind: "EnumValue", value: "NETWORK_ASC" }, + { kind: "EnumValue", value: "TOKEN_SYMBOL_ASC" }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "nodes" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "network" } }, + { kind: "Field", name: { kind: "Name", value: "token" } }, + { kind: "Field", name: { kind: "Name", value: "tokenSymbol" } }, + { kind: "Field", name: { kind: "Name", value: "tokenDecimals" } }, + { kind: "Field", name: { kind: "Name", value: "remoteNetworkName" } }, + { kind: "Field", name: { kind: "Name", value: "remoteToken" } }, + { kind: "Field", name: { kind: "Name", value: "removed" } }, + { kind: "Field", name: { kind: "Name", value: "typeAndVersion" } }, + { kind: "Field", name: { kind: "Name", value: "tokenPool" } }, + { kind: "Field", name: { kind: "Name", value: "inboundCapacity" } }, + { kind: "Field", name: { kind: "Name", value: "inboundRate" } }, + { kind: "Field", name: { kind: "Name", value: "inboundEnabled" } }, + { kind: "Field", name: { kind: "Name", value: "outboundCapacity" } }, + { kind: "Field", name: { kind: "Name", value: "outboundRate" } }, + { kind: "Field", name: { kind: "Name", value: "outboundEnabled" } }, + { kind: "Field", name: { kind: "Name", value: "customInboundCapacity" } }, + { kind: "Field", name: { kind: "Name", value: "customInboundRate" } }, + { kind: "Field", name: { kind: "Name", value: "customInboundEnabled" } }, + { kind: "Field", name: { kind: "Name", value: "customOutboundCapacity" } }, + { kind: "Field", name: { kind: "Name", value: "customOutboundRate" } }, + { kind: "Field", name: { kind: "Name", value: "customOutboundEnabled" } }, + ], + }, + }, + { kind: "Field", name: { kind: "Name", value: "totalCount" } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode +export const GetTokenPoolsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "GetTokenPools" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "first" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "offset" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "condition" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "CcipTokenPoolCondition" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "filter" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "CcipTokenPoolFilter" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "allCcipTokenPools" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "Variable", name: { kind: "Name", value: "first" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "offset" }, + value: { kind: "Variable", name: { kind: "Name", value: "offset" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "condition" }, + value: { kind: "Variable", name: { kind: "Name", value: "condition" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "filter" }, + value: { kind: "Variable", name: { kind: "Name", value: "filter" } }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "orderBy" }, + value: { + kind: "ListValue", + values: [ + { kind: "EnumValue", value: "NETWORK_ASC" }, + { kind: "EnumValue", value: "TOKEN_SYMBOL_ASC" }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "nodes" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { kind: "Field", name: { kind: "Name", value: "network" } }, + { kind: "Field", name: { kind: "Name", value: "token" } }, + { kind: "Field", name: { kind: "Name", value: "tokenSymbol" } }, + { kind: "Field", name: { kind: "Name", value: "typeAndVersion" } }, + { kind: "Field", name: { kind: "Name", value: "minBlockConfirmations" } }, + { kind: "Field", name: { kind: "Name", value: "tokenPool" } }, + ], + }, + }, + { kind: "Field", name: { kind: "Name", value: "totalCount" } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode diff --git a/src/lib/ccip/graphql/__generated__/index.ts b/src/lib/ccip/graphql/__generated__/index.ts new file mode 100644 index 00000000000..4d7cb2fa01b --- /dev/null +++ b/src/lib/ccip/graphql/__generated__/index.ts @@ -0,0 +1,2 @@ +export * from "./fragment-masking.js" +export * from "./gql.js" diff --git a/src/lib/ccip/graphql/client.ts b/src/lib/ccip/graphql/client.ts new file mode 100644 index 00000000000..81226a81eae --- /dev/null +++ b/src/lib/ccip/graphql/client.ts @@ -0,0 +1,54 @@ +import { GraphQLClient } from "graphql-request" +import type { TypedDocumentNode } from "@graphql-typed-document-node/core" + +const GRAPHQL_CONFIG = { + MAX_RETRIES: 3, + RETRY_DELAY_MS: 1000, +} as const + +async function executeWithRetry( + operation: () => Promise, + maxRetries: number = GRAPHQL_CONFIG.MAX_RETRIES +): Promise { + let lastError: unknown + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + return await operation() + } catch (error) { + lastError = error + if (attempt < maxRetries) { + console.warn(`[CCIP GraphQL] Request failed, retrying (${attempt}/${maxRetries})...`) + await new Promise((resolve) => setTimeout(resolve, GRAPHQL_CONFIG.RETRY_DELAY_MS)) + } + } + } + throw lastError +} + +let clientInstance: GraphQLClient | null = null + +export function getGraphQLClient(): GraphQLClient { + if (clientInstance) return clientInstance + + const endpoint = import.meta.env.CCIP_GRAPHQL_ENDPOINT + const apiKey = import.meta.env.CCIP_GRAPHQL_API_KEY + + if (!endpoint) throw new Error("CCIP_GRAPHQL_ENDPOINT is not configured") + if (!apiKey) throw new Error("CCIP_GRAPHQL_API_KEY is not configured") + + clientInstance = new GraphQLClient(endpoint, { + headers: { + Authorization: `${apiKey}`, + }, + }) + + return clientInstance +} + +export async function executeGraphQLQuery>( + document: TypedDocumentNode, + variables?: TVariables +): Promise { + const client = getGraphQLClient() + return executeWithRetry(() => client.request(document, variables)) +} diff --git a/src/lib/ccip/graphql/proxy/cache.ts b/src/lib/ccip/graphql/proxy/cache.ts new file mode 100644 index 00000000000..35cacaafc8e --- /dev/null +++ b/src/lib/ccip/graphql/proxy/cache.ts @@ -0,0 +1,19 @@ +import { LRUCache } from "lru-cache" + +const proxyCache = new LRUCache>({ + max: 200, + ttl: 60_000, +}) + +export function getCached(key: string): Record | undefined { + return proxyCache.get(key) +} + +export function setCache(key: string, data: Record): void { + proxyCache.set(key, data) +} + +export function buildCacheKey(query: string, variables?: Record): string { + const varsStr = variables ? JSON.stringify(variables, Object.keys(variables).sort()) : "" + return `proxy:${query}:${varsStr}` +} diff --git a/src/lib/ccip/graphql/proxy/introspection.ts b/src/lib/ccip/graphql/proxy/introspection.ts new file mode 100644 index 00000000000..67e808bde9c --- /dev/null +++ b/src/lib/ccip/graphql/proxy/introspection.ts @@ -0,0 +1,9 @@ +import schemaJson from "~/lib/ccip/graphql/schema.graphql.json" with { type: "json" } + +export function isIntrospectionQuery(query: string): boolean { + return query.includes("__schema") || query.includes("__type") +} + +export function getIntrospectionResponse(): { data: unknown } { + return { data: schemaJson } +} diff --git a/src/lib/ccip/graphql/proxy/whitelist.ts b/src/lib/ccip/graphql/proxy/whitelist.ts new file mode 100644 index 00000000000..08afd6fcc33 --- /dev/null +++ b/src/lib/ccip/graphql/proxy/whitelist.ts @@ -0,0 +1,32 @@ +import { parse, Kind } from "graphql" + +const ALLOWED_ROOT_FIELDS = new Set(["allCcipTokenPools", "allCcipTokenPoolLanesWithPools"]) + +export interface ValidationResult { + valid: boolean + reason?: string +} + +export function validateQuery(query: string): ValidationResult { + let doc + try { + doc = parse(query) + } catch { + return { valid: false, reason: "Invalid GraphQL syntax" } + } + + for (const def of doc.definitions) { + if (def.kind === Kind.OPERATION_DEFINITION) { + if (def.operation !== "query") { + return { valid: false, reason: `Operation type '${def.operation}' is not allowed` } + } + for (const sel of def.selectionSet.selections) { + if (sel.kind === Kind.FIELD && !ALLOWED_ROOT_FIELDS.has(sel.name.value)) { + return { valid: false, reason: `Query field '${sel.name.value}' is not allowed` } + } + } + } + } + + return { valid: true } +} diff --git a/src/lib/ccip/graphql/queries/.gitkeep b/src/lib/ccip/graphql/queries/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/lib/ccip/graphql/queries/token-pool-lanes.ts b/src/lib/ccip/graphql/queries/token-pool-lanes.ts new file mode 100644 index 00000000000..a80b024565d --- /dev/null +++ b/src/lib/ccip/graphql/queries/token-pool-lanes.ts @@ -0,0 +1,43 @@ +import { gql } from "../__generated__/index.ts" + +export const TOKEN_POOL_LANES_WITH_POOLS_QUERY = gql(` + query GetTokenPoolLanesWithPools( + $first: Int + $offset: Int + $condition: CcipTokenPoolLanesWithPoolCondition + $filter: CcipTokenPoolLanesWithPoolFilter + ) { + allCcipTokenPoolLanesWithPools( + first: $first + offset: $offset + condition: $condition + filter: $filter + orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC] + ) { + nodes { + network + token + tokenSymbol + tokenDecimals + remoteNetworkName + remoteToken + removed + typeAndVersion + tokenPool + inboundCapacity + inboundRate + inboundEnabled + outboundCapacity + outboundRate + outboundEnabled + customInboundCapacity + customInboundRate + customInboundEnabled + customOutboundCapacity + customOutboundRate + customOutboundEnabled + } + totalCount + } + } +`) diff --git a/src/lib/ccip/graphql/queries/token-pools.ts b/src/lib/ccip/graphql/queries/token-pools.ts new file mode 100644 index 00000000000..1152bbef502 --- /dev/null +++ b/src/lib/ccip/graphql/queries/token-pools.ts @@ -0,0 +1,28 @@ +import { gql } from "../__generated__/index.ts" + +export const TOKEN_POOLS_QUERY = gql(` + query GetTokenPools( + $first: Int + $offset: Int + $condition: CcipTokenPoolCondition + $filter: CcipTokenPoolFilter + ) { + allCcipTokenPools( + first: $first + offset: $offset + condition: $condition + filter: $filter + orderBy: [NETWORK_ASC, TOKEN_SYMBOL_ASC] + ) { + nodes { + network + token + tokenSymbol + typeAndVersion + minBlockConfirmations + tokenPool + } + totalCount + } + } +`) diff --git a/src/lib/ccip/graphql/schema.graphql.json b/src/lib/ccip/graphql/schema.graphql.json new file mode 100644 index 00000000000..7b0649c21b9 --- /dev/null +++ b/src/lib/ccip/graphql/schema.graphql.json @@ -0,0 +1,20914 @@ +{ + "__schema": { + "queryType": { + "name": "Query", + "kind": "OBJECT" + }, + "mutationType": null, + "subscriptionType": null, + "types": [ + { + "kind": "SCALAR", + "name": "BigFloat", + "description": "A floating point number that requires more precision than IEEE 754 binary 64", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "BigInt", + "description": "A signed eight-byte integer. The upper big integer values are greater than the\nmax value for a JavaScript number. Therefore all big integers will be output as\nstrings and not numbers.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Boolean", + "description": "The `Boolean` scalar type represents `true` or `false`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "description": "A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipAllLaneStatus", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "successRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusCondition", + "description": "A condition to be used against `CcipAllLaneStatus` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Checks for equality with the object’s `routerAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "successRate", + "description": "Checks for equality with the object’s `successRate` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusFilter", + "description": "A filter to be used against `CcipAllLaneStatus` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Filter by the object’s `routerAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "successRate", + "description": "Filter by the object’s `successRate` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipAllLaneStatusesConnection", + "description": "A connection to a list of `CcipAllLaneStatus` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipAllLaneStatus` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipAllLaneStatusesEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipAllLaneStatus` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipAllLaneStatus", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipAllLaneStatus` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipAllLaneStatusesEdge", + "description": "A `CcipAllLaneStatus` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipAllLaneStatus` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipAllLaneStatus", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipAllLaneStatusesOrderBy", + "description": "Methods to use when ordering `CcipAllLaneStatus`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SUCCESS_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SUCCESS_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipFastTransferFill", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "amount", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "fillId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filler", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "settlementInfo", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillCondition", + "description": "A condition to be used against `CcipFastTransferFill` object types. All fields\nare tested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "amount", + "description": "Checks for equality with the object’s `amount` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "fillId", + "description": "Checks for equality with the object’s `fillId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filler", + "description": "Checks for equality with the object’s `filler` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Checks for equality with the object’s `messageId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": "Checks for equality with the object’s `sendTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "settlementInfo", + "description": "Checks for equality with the object’s `settlementInfo` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillFilter", + "description": "A filter to be used against `CcipFastTransferFill` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "fillId", + "description": "Filter by the object’s `fillId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filler", + "description": "Filter by the object’s `filler` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Filter by the object’s `messageId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": "Filter by the object’s `sendTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "settlementInfo", + "description": "Filter by the object’s `settlementInfo` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipFastTransferFillsConnection", + "description": "A connection to a list of `CcipFastTransferFill` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipFastTransferFill` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipFastTransferFillsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipFastTransferFill` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipFastTransferFill", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipFastTransferFill` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipFastTransferFillsEdge", + "description": "A `CcipFastTransferFill` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipFastTransferFill` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipFastTransferFill", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipFastTransferFillsOrderBy", + "description": "Methods to use when ordering `CcipFastTransferFill`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "AMOUNT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "AMOUNT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FILLER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FILLER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FILL_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FILL_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SETTLEMENT_INFO_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SETTLEMENT_INFO_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipLaneStatus", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "successRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusCondition", + "description": "A condition to be used against `CcipLaneStatus` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Checks for equality with the object’s `routerAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "successRate", + "description": "Checks for equality with the object’s `successRate` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusFilter", + "description": "A filter to be used against `CcipLaneStatus` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Filter by the object’s `routerAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "successRate", + "description": "Filter by the object’s `successRate` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipLaneStatusesConnection", + "description": "A connection to a list of `CcipLaneStatus` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipLaneStatus` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipLaneStatusesEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipLaneStatus` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipLaneStatus", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipLaneStatus` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipLaneStatusesEdge", + "description": "A `CcipLaneStatus` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipLaneStatus` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipLaneStatus", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipLaneStatusesOrderBy", + "description": "Methods to use when ordering `CcipLaneStatus`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SUCCESS_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SUCCESS_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimate", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "commitMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "finalityMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transferMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateCondition", + "description": "A condition to be used against `CcipLaneTimeEstimate` object types. All fields\nare tested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "commitMs", + "description": "Checks for equality with the object’s `commitMs` field.", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "finalityMs", + "description": "Checks for equality with the object’s `finalityMs` field.", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Checks for equality with the object’s `routerAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalMs", + "description": "Checks for equality with the object’s `totalMs` field.", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transferMs", + "description": "Checks for equality with the object’s `transferMs` field.", + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateFilter", + "description": "A filter to be used against `CcipLaneTimeEstimate` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Filter by the object’s `routerAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimatesConnection", + "description": "A connection to a list of `CcipLaneTimeEstimate` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipLaneTimeEstimate` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimatesEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipLaneTimeEstimate` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimate", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipLaneTimeEstimate` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimatesEdge", + "description": "A `CcipLaneTimeEstimate` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipLaneTimeEstimate` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimate", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipLaneTimeEstimatesOrderBy", + "description": "Methods to use when ordering `CcipLaneTimeEstimate`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "COMMIT_MS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_MS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FINALITY_MS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FINALITY_MS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOTAL_MS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOTAL_MS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSFER_MS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSFER_MS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipMessage", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "arm", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStore", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gasLimit", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "max", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "min", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "permissionLessExecutionThresholdSeconds", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlock", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptFinalized", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "root", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlock", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendFinalized", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "votes", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipMessageCondition", + "description": "A condition to be used against `CcipMessage` object types. All fields are tested\nfor equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "arm", + "description": "Checks for equality with the object’s `arm` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockNumber", + "description": "Checks for equality with the object’s `blessBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockTimestamp", + "description": "Checks for equality with the object’s `blessBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessLogIndex", + "description": "Checks for equality with the object’s `blessLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessTransactionHash", + "description": "Checks for equality with the object’s `blessTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockNumber", + "description": "Checks for equality with the object’s `commitBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockTimestamp", + "description": "Checks for equality with the object’s `commitBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitLogIndex", + "description": "Checks for equality with the object’s `commitLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStore", + "description": "Checks for equality with the object’s `commitStore` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitTransactionHash", + "description": "Checks for equality with the object’s `commitTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": "Checks for equality with the object’s `data` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": "Checks for equality with the object’s `destChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": "Checks for equality with the object’s `destRouterAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": "Checks for equality with the object’s `feeToken` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": "Checks for equality with the object’s `feeTokenAmount` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gasLimit", + "description": "Checks for equality with the object’s `gasLimit` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": "Checks for equality with the object’s `info` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Checks for equality with the object’s `infoRaw` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "max", + "description": "Checks for equality with the object’s `max` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Checks for equality with the object’s `messageId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "min", + "description": "Checks for equality with the object’s `min` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "Checks for equality with the object’s `nonce` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": "Checks for equality with the object’s `offrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Checks for equality with the object’s `onrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Checks for equality with the object’s `origin` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "permissionLessExecutionThresholdSeconds", + "description": "Checks for equality with the object’s `permissionLessExecutionThresholdSeconds` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlock", + "description": "Checks for equality with the object’s `receiptBlock` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptFinalized", + "description": "Checks for equality with the object’s `receiptFinalized` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptLogIndex", + "description": "Checks for equality with the object’s `receiptLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTimestamp", + "description": "Checks for equality with the object’s `receiptTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTransactionHash", + "description": "Checks for equality with the object’s `receiptTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "root", + "description": "Checks for equality with the object’s `root` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Checks for equality with the object’s `routerAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlock", + "description": "Checks for equality with the object’s `sendBlock` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendFinalized", + "description": "Checks for equality with the object’s `sendFinalized` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendLogIndex", + "description": "Checks for equality with the object’s `sendLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTimestamp", + "description": "Checks for equality with the object’s `sendTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": "Checks for equality with the object’s `sendTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Checks for equality with the object’s `sender` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Checks for equality with the object’s `sequenceNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": "Checks for equality with the object’s `sourceChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Checks for equality with the object’s `state` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": "Checks for equality with the object’s `strict` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": "Checks for equality with the object’s `tokenAmounts` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "votes", + "description": "Checks for equality with the object’s `votes` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipMessageFilter", + "description": "A filter to be used against `CcipMessage` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipMessageFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "arm", + "description": "Filter by the object’s `arm` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockNumber", + "description": "Filter by the object’s `blessBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessLogIndex", + "description": "Filter by the object’s `blessLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessTransactionHash", + "description": "Filter by the object’s `blessTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockNumber", + "description": "Filter by the object’s `commitBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitLogIndex", + "description": "Filter by the object’s `commitLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStore", + "description": "Filter by the object’s `commitStore` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitTransactionHash", + "description": "Filter by the object’s `commitTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": "Filter by the object’s `data` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": "Filter by the object’s `destRouterAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": "Filter by the object’s `feeToken` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": "Filter by the object’s `feeTokenAmount` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": "Filter by the object’s `info` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Filter by the object’s `infoRaw` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Filter by the object’s `messageId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "Filter by the object’s `nonce` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipMessageFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": "Filter by the object’s `offrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Filter by the object’s `onrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipMessageFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Filter by the object’s `origin` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "permissionLessExecutionThresholdSeconds", + "description": "Filter by the object’s `permissionLessExecutionThresholdSeconds` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlock", + "description": "Filter by the object’s `receiptBlock` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptLogIndex", + "description": "Filter by the object’s `receiptLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTransactionHash", + "description": "Filter by the object’s `receiptTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "root", + "description": "Filter by the object’s `root` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "routerAddress", + "description": "Filter by the object’s `routerAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlock", + "description": "Filter by the object’s `sendBlock` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendLogIndex", + "description": "Filter by the object’s `sendLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": "Filter by the object’s `sendTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Filter by the object’s `sender` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Filter by the object’s `sequenceNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Filter by the object’s `state` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": "Filter by the object’s `strict` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": "Filter by the object’s `tokenAmounts` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "votes", + "description": "Filter by the object’s `votes` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipMessagesConnection", + "description": "A connection to a list of `CcipMessage` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipMessage` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipMessagesEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipMessage` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipMessage", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipMessage` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipMessagesEdge", + "description": "A `CcipMessage` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipMessage` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipMessage", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipMessagesFlat", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "blessBlockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStore", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouter", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptInfo", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "max", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "min", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ofInterest", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offramp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onramp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptInfo", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "rmn", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "root", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendFinalized", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendLogIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouter", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceSchema", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "votes", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatCondition", + "description": "A condition to be used against `CcipMessagesFlat` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "blessBlockHash", + "description": "Checks for equality with the object’s `blessBlockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockNumber", + "description": "Checks for equality with the object’s `blessBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockTimestamp", + "description": "Checks for equality with the object’s `blessBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessLogIndex", + "description": "Checks for equality with the object’s `blessLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessTransactionHash", + "description": "Checks for equality with the object’s `blessTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockHash", + "description": "Checks for equality with the object’s `commitBlockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockNumber", + "description": "Checks for equality with the object’s `commitBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockTimestamp", + "description": "Checks for equality with the object’s `commitBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitLogIndex", + "description": "Checks for equality with the object’s `commitLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStore", + "description": "Checks for equality with the object’s `commitStore` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitTransactionHash", + "description": "Checks for equality with the object’s `commitTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": "Checks for equality with the object’s `createdAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": "Checks for equality with the object’s `data` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": "Checks for equality with the object’s `destChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouter", + "description": "Checks for equality with the object’s `destRouter` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockHash", + "description": "Checks for equality with the object’s `firstReceiptBlockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockNumber", + "description": "Checks for equality with the object’s `firstReceiptBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockTimestamp", + "description": "Checks for equality with the object’s `firstReceiptBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptInfo", + "description": "Checks for equality with the object’s `firstReceiptInfo` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptLogIndex", + "description": "Checks for equality with the object’s `firstReceiptLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptTransactionHash", + "description": "Checks for equality with the object’s `firstReceiptTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Checks for equality with the object’s `infoRaw` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "max", + "description": "Checks for equality with the object’s `max` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Checks for equality with the object’s `messageId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "min", + "description": "Checks for equality with the object’s `min` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ofInterest", + "description": "Checks for equality with the object’s `ofInterest` field.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offramp", + "description": "Checks for equality with the object’s `offramp` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onramp", + "description": "Checks for equality with the object’s `onramp` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Checks for equality with the object’s `origin` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockHash", + "description": "Checks for equality with the object’s `receiptBlockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockNumber", + "description": "Checks for equality with the object’s `receiptBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockTimestamp", + "description": "Checks for equality with the object’s `receiptBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptInfo", + "description": "Checks for equality with the object’s `receiptInfo` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptLogIndex", + "description": "Checks for equality with the object’s `receiptLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTransactionHash", + "description": "Checks for equality with the object’s `receiptTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "rmn", + "description": "Checks for equality with the object’s `rmn` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "root", + "description": "Checks for equality with the object’s `root` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockHash", + "description": "Checks for equality with the object’s `sendBlockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockNumber", + "description": "Checks for equality with the object’s `sendBlockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockTimestamp", + "description": "Checks for equality with the object’s `sendBlockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendFinalized", + "description": "Checks for equality with the object’s `sendFinalized` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendLogIndex", + "description": "Checks for equality with the object’s `sendLogIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": "Checks for equality with the object’s `sendTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Checks for equality with the object’s `sender` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Checks for equality with the object’s `sequenceNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": "Checks for equality with the object’s `sourceChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouter", + "description": "Checks for equality with the object’s `sourceRouter` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceSchema", + "description": "Checks for equality with the object’s `sourceSchema` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Checks for equality with the object’s `state` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": "Checks for equality with the object’s `updatedAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "votes", + "description": "Checks for equality with the object’s `votes` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatFilter", + "description": "A filter to be used against `CcipMessagesFlat` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockHash", + "description": "Filter by the object’s `blessBlockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessBlockNumber", + "description": "Filter by the object’s `blessBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessLogIndex", + "description": "Filter by the object’s `blessLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blessTransactionHash", + "description": "Filter by the object’s `blessTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockHash", + "description": "Filter by the object’s `commitBlockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitBlockNumber", + "description": "Filter by the object’s `commitBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitLogIndex", + "description": "Filter by the object’s `commitLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStore", + "description": "Filter by the object’s `commitStore` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitTransactionHash", + "description": "Filter by the object’s `commitTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouter", + "description": "Filter by the object’s `destRouter` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockHash", + "description": "Filter by the object’s `firstReceiptBlockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptBlockNumber", + "description": "Filter by the object’s `firstReceiptBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptInfo", + "description": "Filter by the object’s `firstReceiptInfo` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptLogIndex", + "description": "Filter by the object’s `firstReceiptLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReceiptTransactionHash", + "description": "Filter by the object’s `firstReceiptTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Filter by the object’s `infoRaw` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "max", + "description": "Filter by the object’s `max` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Filter by the object’s `messageId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "min", + "description": "Filter by the object’s `min` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ofInterest", + "description": "Filter by the object’s `ofInterest` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringListFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offramp", + "description": "Filter by the object’s `offramp` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onramp", + "description": "Filter by the object’s `onramp` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Filter by the object’s `origin` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockHash", + "description": "Filter by the object’s `receiptBlockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptBlockNumber", + "description": "Filter by the object’s `receiptBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptInfo", + "description": "Filter by the object’s `receiptInfo` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptLogIndex", + "description": "Filter by the object’s `receiptLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTransactionHash", + "description": "Filter by the object’s `receiptTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "rmn", + "description": "Filter by the object’s `rmn` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "root", + "description": "Filter by the object’s `root` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockHash", + "description": "Filter by the object’s `sendBlockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendBlockNumber", + "description": "Filter by the object’s `sendBlockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendLogIndex", + "description": "Filter by the object’s `sendLogIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sendTransactionHash", + "description": "Filter by the object’s `sendTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Filter by the object’s `sender` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Filter by the object’s `sequenceNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouter", + "description": "Filter by the object’s `sourceRouter` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceSchema", + "description": "Filter by the object’s `sourceSchema` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Filter by the object’s `state` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "votes", + "description": "Filter by the object’s `votes` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipMessagesFlatsConnection", + "description": "A connection to a list of `CcipMessagesFlat` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipMessagesFlat` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipMessagesFlatsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipMessagesFlat` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipMessagesFlat", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipMessagesFlat` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipMessagesFlatsEdge", + "description": "A `CcipMessagesFlat` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipMessagesFlat` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipMessagesFlat", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipMessagesFlatsOrderBy", + "description": "Methods to use when ordering `CcipMessagesFlat`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "BLESS_BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_INFO_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_INFO_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIRST_RECEIPT_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MAX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MAX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OF_INTEREST_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OF_INTEREST_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_INFO_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_INFO_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RMN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RMN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROOT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROOT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_FINALIZED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_FINALIZED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_ROUTER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_ROUTER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_SCHEMA_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_SCHEMA_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VOTES_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VOTES_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipMessagesOrderBy", + "description": "Methods to use when ordering `CcipMessage`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "ARM_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ARM_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLESS_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_AMOUNT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_AMOUNT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "GAS_LIMIT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "GAS_LIMIT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MAX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MAX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NONCE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NONCE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PERMISSION_LESS_EXECUTION_THRESHOLD_SECONDS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PERMISSION_LESS_EXECUTION_THRESHOLD_SECONDS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_BLOCK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_FINALIZED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_FINALIZED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROOT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROOT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_BLOCK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_FINALIZED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_FINALIZED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEND_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STRICT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STRICT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_AMOUNTS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_AMOUNTS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VOTES_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VOTES_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipSend", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "data", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gasLimit", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainSelector", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceTokenData", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipSendCondition", + "description": "A condition to be used against `CcipSend` object types. All fields are tested\nfor equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "data", + "description": "Checks for equality with the object’s `data` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": "Checks for equality with the object’s `feeToken` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": "Checks for equality with the object’s `feeTokenAmount` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gasLimit", + "description": "Checks for equality with the object’s `gasLimit` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Checks for equality with the object’s `messageId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "Checks for equality with the object’s `nonce` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Checks for equality with the object’s `onrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Checks for equality with the object’s `sender` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Checks for equality with the object’s `sequenceNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainSelector", + "description": "Checks for equality with the object’s `sourceChainSelector` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceTokenData", + "description": "Checks for equality with the object’s `sourceTokenData` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": "Checks for equality with the object’s `strict` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": "Checks for equality with the object’s `tokenAmounts` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipSendFilter", + "description": "A filter to be used against `CcipSend` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipSendFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": "Filter by the object’s `data` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": "Filter by the object’s `feeToken` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": "Filter by the object’s `feeTokenAmount` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Filter by the object’s `messageId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "Filter by the object’s `nonce` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipSendFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Filter by the object’s `onrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipSendFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Filter by the object’s `sender` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Filter by the object’s `sequenceNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainSelector", + "description": "Filter by the object’s `sourceChainSelector` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceTokenData", + "description": "Filter by the object’s `sourceTokenData` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": "Filter by the object’s `strict` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": "Filter by the object’s `tokenAmounts` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipSendsConnection", + "description": "A connection to a list of `CcipSend` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipSend` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipSendsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipSend` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipSend", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipSend` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipSendsEdge", + "description": "A `CcipSend` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipSend` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipSend", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipSendsOrderBy", + "description": "Methods to use when ordering `CcipSend`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "DATA_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_AMOUNT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_AMOUNT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "GAS_LIMIT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "GAS_LIMIT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NONCE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NONCE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_SELECTOR_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_SELECTOR_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_TOKEN_DATA_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_TOKEN_DATA_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STRICT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STRICT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_AMOUNTS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_AMOUNTS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPool", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "administrator", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allowlist", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "minBlockConfirmations", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owner", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingAdministrator", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingOwner", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPool", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPoolTypeAndVersion", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registry", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "router", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenDecimals", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenSymbol", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeAndVersion", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolCondition", + "description": "A condition to be used against `CcipTokenPool` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "administrator", + "description": "Checks for equality with the object’s `administrator` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allowlist", + "description": "Checks for equality with the object’s `allowlist` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Checks for equality with the object’s `blockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Checks for equality with the object’s `blockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": "Checks for equality with the object’s `blockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": "Checks for equality with the object’s `createdAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Checks for equality with the object’s `logIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "minBlockConfirmations", + "description": "Checks for equality with the object’s `minBlockConfirmations` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Checks for equality with the object’s `network` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owner", + "description": "Checks for equality with the object’s `owner` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingAdministrator", + "description": "Checks for equality with the object’s `pendingAdministrator` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingOwner", + "description": "Checks for equality with the object’s `pendingOwner` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPool", + "description": "Checks for equality with the object’s `previousPool` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPoolTypeAndVersion", + "description": "Checks for equality with the object’s `previousPoolTypeAndVersion` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registry", + "description": "Checks for equality with the object’s `registry` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "router", + "description": "Checks for equality with the object’s `router` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": "Checks for equality with the object’s `token` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenDecimals", + "description": "Checks for equality with the object’s `tokenDecimals` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenName", + "description": "Checks for equality with the object’s `tokenName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": "Checks for equality with the object’s `tokenPool` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenSymbol", + "description": "Checks for equality with the object’s `tokenSymbol` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Checks for equality with the object’s `transactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeAndVersion", + "description": "Checks for equality with the object’s `typeAndVersion` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": "Checks for equality with the object’s `updatedAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolEvent", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "amount", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "event", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPoolAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventCondition", + "description": "A condition to be used against `CcipTokenPoolEvent` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "amount", + "description": "Checks for equality with the object’s `amount` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Checks for equality with the object’s `blockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Checks for equality with the object’s `blockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": "Checks for equality with the object’s `blockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": "Checks for equality with the object’s `createdAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "event", + "description": "Checks for equality with the object’s `event` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Checks for equality with the object’s `logIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Checks for equality with the object’s `network` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": "Checks for equality with the object’s `removed` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Checks for equality with the object’s `sender` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAddress", + "description": "Checks for equality with the object’s `tokenAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPoolAddress", + "description": "Checks for equality with the object’s `tokenPoolAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Checks for equality with the object’s `transactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": "Checks for equality with the object’s `updatedAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventFilter", + "description": "A filter to be used against `CcipTokenPoolEvent` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Filter by the object’s `blockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Filter by the object’s `blockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "event", + "description": "Filter by the object’s `event` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Filter by the object’s `logIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Filter by the object’s `network` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": "Filter by the object’s `removed` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Filter by the object’s `sender` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAddress", + "description": "Filter by the object’s `tokenAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPoolAddress", + "description": "Filter by the object’s `tokenPoolAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Filter by the object’s `transactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolEventsConnection", + "description": "A connection to a list of `CcipTokenPoolEvent` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTokenPoolEvent` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolEventsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTokenPoolEvent` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolEvent", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTokenPoolEvent` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolEventsEdge", + "description": "A `CcipTokenPoolEvent` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTokenPoolEvent` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolEvent", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTokenPoolEventsOrderBy", + "description": "Methods to use when ordering `CcipTokenPoolEvent`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "AMOUNT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "AMOUNT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "EVENT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "EVENT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOVED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOVED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolFilter", + "description": "A filter to be used against `CcipTokenPool` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "administrator", + "description": "Filter by the object’s `administrator` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allowlist", + "description": "Filter by the object’s `allowlist` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Filter by the object’s `blockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Filter by the object’s `blockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Filter by the object’s `logIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "minBlockConfirmations", + "description": "Filter by the object’s `minBlockConfirmations` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Filter by the object’s `network` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owner", + "description": "Filter by the object’s `owner` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingAdministrator", + "description": "Filter by the object’s `pendingAdministrator` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingOwner", + "description": "Filter by the object’s `pendingOwner` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPool", + "description": "Filter by the object’s `previousPool` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPoolTypeAndVersion", + "description": "Filter by the object’s `previousPoolTypeAndVersion` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registry", + "description": "Filter by the object’s `registry` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "router", + "description": "Filter by the object’s `router` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": "Filter by the object’s `token` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenDecimals", + "description": "Filter by the object’s `tokenDecimals` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenName", + "description": "Filter by the object’s `tokenName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": "Filter by the object’s `tokenPool` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenSymbol", + "description": "Filter by the object’s `tokenSymbol` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Filter by the object’s `transactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeAndVersion", + "description": "Filter by the object’s `typeAndVersion` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLane", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "blockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteToken", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteTokenPools", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneCondition", + "description": "A condition to be used against `CcipTokenPoolLane` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "blockHash", + "description": "Checks for equality with the object’s `blockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Checks for equality with the object’s `blockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": "Checks for equality with the object’s `blockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": "Checks for equality with the object’s `createdAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundCapacity", + "description": "Checks for equality with the object’s `customInboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundEnabled", + "description": "Checks for equality with the object’s `customInboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundRate", + "description": "Checks for equality with the object’s `customInboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundCapacity", + "description": "Checks for equality with the object’s `customOutboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundEnabled", + "description": "Checks for equality with the object’s `customOutboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundRate", + "description": "Checks for equality with the object’s `customOutboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundCapacity", + "description": "Checks for equality with the object’s `inboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundEnabled", + "description": "Checks for equality with the object’s `inboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundRate", + "description": "Checks for equality with the object’s `inboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Checks for equality with the object’s `logIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Checks for equality with the object’s `network` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundCapacity", + "description": "Checks for equality with the object’s `outboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundEnabled", + "description": "Checks for equality with the object’s `outboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundRate", + "description": "Checks for equality with the object’s `outboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteNetworkName", + "description": "Checks for equality with the object’s `remoteNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteToken", + "description": "Checks for equality with the object’s `remoteToken` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteTokenPools", + "description": "Checks for equality with the object’s `remoteTokenPools` field.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": "Checks for equality with the object’s `removed` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": "Checks for equality with the object’s `token` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": "Checks for equality with the object’s `tokenPool` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Checks for equality with the object’s `transactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": "Checks for equality with the object’s `updatedAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneFilter", + "description": "A filter to be used against `CcipTokenPoolLane` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Filter by the object’s `blockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Filter by the object’s `blockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundEnabled", + "description": "Filter by the object’s `customInboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundEnabled", + "description": "Filter by the object’s `customOutboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundEnabled", + "description": "Filter by the object’s `inboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Filter by the object’s `logIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Filter by the object’s `network` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundEnabled", + "description": "Filter by the object’s `outboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteNetworkName", + "description": "Filter by the object’s `remoteNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteToken", + "description": "Filter by the object’s `remoteToken` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteTokenPools", + "description": "Filter by the object’s `remoteTokenPools` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringListFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": "Filter by the object’s `removed` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": "Filter by the object’s `token` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": "Filter by the object’s `tokenPool` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Filter by the object’s `transactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesConnection", + "description": "A connection to a list of `CcipTokenPoolLane` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTokenPoolLane` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTokenPoolLane` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLane", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTokenPoolLane` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesEdge", + "description": "A `CcipTokenPoolLane` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTokenPoolLane` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLane", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroup", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "admins", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owners", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pk", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenGroup", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupCondition", + "description": "A condition to be used against `CcipTokenPoolLanesGroup` object types. All\nfields are tested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "admins", + "description": "Checks for equality with the object’s `admins` field.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": "Checks for equality with the object’s `createdAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owners", + "description": "Checks for equality with the object’s `owners` field.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pk", + "description": "Checks for equality with the object’s `pk` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenGroup", + "description": "Checks for equality with the object’s `tokenGroup` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": "Checks for equality with the object’s `updatedAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupFilter", + "description": "A filter to be used against `CcipTokenPoolLanesGroup` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "admins", + "description": "Filter by the object’s `admins` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringListFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owners", + "description": "Filter by the object’s `owners` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringListFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pk", + "description": "Filter by the object’s `pk` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenGroup", + "description": "Filter by the object’s `tokenGroup` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroupsConnection", + "description": "A connection to a list of `CcipTokenPoolLanesGroup` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTokenPoolLanesGroup` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroupsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTokenPoolLanesGroup` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroup", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTokenPoolLanesGroup` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroupsEdge", + "description": "A `CcipTokenPoolLanesGroup` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTokenPoolLanesGroup` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroup", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTokenPoolLanesGroupsOrderBy", + "description": "Methods to use when ordering `CcipTokenPoolLanesGroup`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "ADMINS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ADMINS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OWNERS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OWNERS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_GROUP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_GROUP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTokenPoolLanesOrderBy", + "description": "Methods to use when ordering `CcipTokenPoolLane`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_POOLS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_POOLS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOVED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOVED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPool", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "administrator", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allowlist", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundCapacity", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundEnabled", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundRate", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owner", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingAdministrator", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingOwner", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPool", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPoolTypeAndVersion", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registry", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteToken", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteTokenPools", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "router", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenDecimals", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenRegisteredAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenSymbol", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeAndVersion", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolCondition", + "description": "A condition to be used against `CcipTokenPoolLanesWithPool` object types. All\nfields are tested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "administrator", + "description": "Checks for equality with the object’s `administrator` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allowlist", + "description": "Checks for equality with the object’s `allowlist` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Checks for equality with the object’s `blockHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Checks for equality with the object’s `blockNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockTimestamp", + "description": "Checks for equality with the object’s `blockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": "Checks for equality with the object’s `createdAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundCapacity", + "description": "Checks for equality with the object’s `customInboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundEnabled", + "description": "Checks for equality with the object’s `customInboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundRate", + "description": "Checks for equality with the object’s `customInboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundCapacity", + "description": "Checks for equality with the object’s `customOutboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundEnabled", + "description": "Checks for equality with the object’s `customOutboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundRate", + "description": "Checks for equality with the object’s `customOutboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundCapacity", + "description": "Checks for equality with the object’s `inboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundEnabled", + "description": "Checks for equality with the object’s `inboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundRate", + "description": "Checks for equality with the object’s `inboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Checks for equality with the object’s `logIndex` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Checks for equality with the object’s `network` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundCapacity", + "description": "Checks for equality with the object’s `outboundCapacity` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundEnabled", + "description": "Checks for equality with the object’s `outboundEnabled` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundRate", + "description": "Checks for equality with the object’s `outboundRate` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owner", + "description": "Checks for equality with the object’s `owner` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingAdministrator", + "description": "Checks for equality with the object’s `pendingAdministrator` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingOwner", + "description": "Checks for equality with the object’s `pendingOwner` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPool", + "description": "Checks for equality with the object’s `previousPool` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPoolTypeAndVersion", + "description": "Checks for equality with the object’s `previousPoolTypeAndVersion` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registry", + "description": "Checks for equality with the object’s `registry` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteNetworkName", + "description": "Checks for equality with the object’s `remoteNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteToken", + "description": "Checks for equality with the object’s `remoteToken` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteTokenPools", + "description": "Checks for equality with the object’s `remoteTokenPools` field.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": "Checks for equality with the object’s `removed` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "router", + "description": "Checks for equality with the object’s `router` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": "Checks for equality with the object’s `token` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenDecimals", + "description": "Checks for equality with the object’s `tokenDecimals` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenName", + "description": "Checks for equality with the object’s `tokenName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": "Checks for equality with the object’s `tokenPool` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenRegisteredAt", + "description": "Checks for equality with the object’s `tokenRegisteredAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenSymbol", + "description": "Checks for equality with the object’s `tokenSymbol` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Checks for equality with the object’s `transactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeAndVersion", + "description": "Checks for equality with the object’s `typeAndVersion` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": "Checks for equality with the object’s `updatedAt` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolFilter", + "description": "A filter to be used against `CcipTokenPoolLanesWithPool` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "administrator", + "description": "Filter by the object’s `administrator` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allowlist", + "description": "Filter by the object’s `allowlist` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockHash", + "description": "Filter by the object’s `blockHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "blockNumber", + "description": "Filter by the object’s `blockNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customInboundEnabled", + "description": "Filter by the object’s `customInboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "customOutboundEnabled", + "description": "Filter by the object’s `customOutboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inboundEnabled", + "description": "Filter by the object’s `inboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logIndex", + "description": "Filter by the object’s `logIndex` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "network", + "description": "Filter by the object’s `network` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "outboundEnabled", + "description": "Filter by the object’s `outboundEnabled` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "owner", + "description": "Filter by the object’s `owner` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingAdministrator", + "description": "Filter by the object’s `pendingAdministrator` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pendingOwner", + "description": "Filter by the object’s `pendingOwner` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPool", + "description": "Filter by the object’s `previousPool` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousPoolTypeAndVersion", + "description": "Filter by the object’s `previousPoolTypeAndVersion` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registry", + "description": "Filter by the object’s `registry` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteNetworkName", + "description": "Filter by the object’s `remoteNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteToken", + "description": "Filter by the object’s `remoteToken` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "remoteTokenPools", + "description": "Filter by the object’s `remoteTokenPools` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringListFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "removed", + "description": "Filter by the object’s `removed` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "router", + "description": "Filter by the object’s `router` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "token", + "description": "Filter by the object’s `token` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenDecimals", + "description": "Filter by the object’s `tokenDecimals` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenName", + "description": "Filter by the object’s `tokenName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenPool", + "description": "Filter by the object’s `tokenPool` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenSymbol", + "description": "Filter by the object’s `tokenSymbol` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Filter by the object’s `transactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeAndVersion", + "description": "Filter by the object’s `typeAndVersion` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPoolsConnection", + "description": "A connection to a list of `CcipTokenPoolLanesWithPool` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTokenPoolLanesWithPool` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPoolsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTokenPoolLanesWithPool` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPool", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTokenPoolLanesWithPool` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPoolsEdge", + "description": "A `CcipTokenPoolLanesWithPool` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTokenPoolLanesWithPool` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPool", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTokenPoolLanesWithPoolsOrderBy", + "description": "Methods to use when ordering `CcipTokenPoolLanesWithPool`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "ADMINISTRATOR_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ADMINISTRATOR_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ALLOWLIST_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ALLOWLIST_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_INBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CUSTOM_OUTBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_CAPACITY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_CAPACITY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_ENABLED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_ENABLED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_RATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OUTBOUND_RATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OWNER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OWNER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_ADMINISTRATOR_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_ADMINISTRATOR_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_OWNER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_OWNER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_TYPE_AND_VERSION_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_TYPE_AND_VERSION_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REGISTRY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REGISTRY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_POOLS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOTE_TOKEN_POOLS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOVED_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMOVED_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DECIMALS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DECIMALS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_REGISTERED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_REGISTERED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_SYMBOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_SYMBOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TYPE_AND_VERSION_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TYPE_AND_VERSION_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolsConnection", + "description": "A connection to a list of `CcipTokenPool` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTokenPool` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPoolsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTokenPool` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPool", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTokenPool` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTokenPoolsEdge", + "description": "A `CcipTokenPool` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTokenPool` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTokenPool", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTokenPoolsOrderBy", + "description": "Methods to use when ordering `CcipTokenPool`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "ADMINISTRATOR_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ADMINISTRATOR_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ALLOWLIST_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ALLOWLIST_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "CREATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LOG_INDEX_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIN_BLOCK_CONFIRMATIONS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIN_BLOCK_CONFIRMATIONS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NETWORK_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OWNER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OWNER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_ADMINISTRATOR_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_ADMINISTRATOR_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_OWNER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PENDING_OWNER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_TYPE_AND_VERSION_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PREVIOUS_POOL_TYPE_AND_VERSION_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REGISTRY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REGISTRY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ROUTER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DECIMALS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DECIMALS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_POOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_SYMBOL_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_SYMBOL_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TYPE_AND_VERSION_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TYPE_AND_VERSION_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UPDATED_AT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTransaction", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "blockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStoreAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouterAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionCondition", + "description": "A condition to be used against `CcipTransaction` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "blockTimestamp", + "description": "Checks for equality with the object’s `blockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStoreAddress", + "description": "Checks for equality with the object’s `commitStoreAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": "Checks for equality with the object’s `destChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": "Checks for equality with the object’s `destRouterAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destTransactionHash", + "description": "Checks for equality with the object’s `destTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": "Checks for equality with the object’s `info` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Checks for equality with the object’s `infoRaw` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Checks for equality with the object’s `messageId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": "Checks for equality with the object’s `offrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Checks for equality with the object’s `onrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Checks for equality with the object’s `origin` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTimestamp", + "description": "Checks for equality with the object’s `receiptTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Checks for equality with the object’s `sender` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Checks for equality with the object’s `sequenceNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": "Checks for equality with the object’s `sourceChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouterAddress", + "description": "Checks for equality with the object’s `sourceRouterAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Checks for equality with the object’s `state` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Checks for equality with the object’s `transactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionFilter", + "description": "A filter to be used against `CcipTransaction` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStoreAddress", + "description": "Filter by the object’s `commitStoreAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": "Filter by the object’s `destRouterAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destTransactionHash", + "description": "Filter by the object’s `destTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": "Filter by the object’s `info` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Filter by the object’s `infoRaw` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Filter by the object’s `messageId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": "Filter by the object’s `offrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Filter by the object’s `onrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Filter by the object’s `origin` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Filter by the object’s `sender` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Filter by the object’s `sequenceNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouterAddress", + "description": "Filter by the object’s `sourceRouterAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Filter by the object’s `state` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Filter by the object’s `transactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTransactionsConnection", + "description": "A connection to a list of `CcipTransaction` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTransaction` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTransactionsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTransaction` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTransaction", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTransaction` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTransactionsEdge", + "description": "A `CcipTransaction` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTransaction` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTransaction", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTransactionsFlat", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "blockTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStoreAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destTransactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gasLimit", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTimestamp", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouterAddress", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatCondition", + "description": "A condition to be used against `CcipTransactionsFlat` object types. All fields\nare tested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "blockTimestamp", + "description": "Checks for equality with the object’s `blockTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStoreAddress", + "description": "Checks for equality with the object’s `commitStoreAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": "Checks for equality with the object’s `data` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destChainId", + "description": "Checks for equality with the object’s `destChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Checks for equality with the object’s `destNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": "Checks for equality with the object’s `destRouterAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destTransactionHash", + "description": "Checks for equality with the object’s `destTransactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": "Checks for equality with the object’s `feeToken` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": "Checks for equality with the object’s `feeTokenAmount` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gasLimit", + "description": "Checks for equality with the object’s `gasLimit` field.", + "type": { + "kind": "SCALAR", + "name": "BigFloat", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": "Checks for equality with the object’s `info` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Checks for equality with the object’s `infoRaw` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Checks for equality with the object’s `messageId` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "Checks for equality with the object’s `nonce` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": "Checks for equality with the object’s `offrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Checks for equality with the object’s `onrampAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Checks for equality with the object’s `origin` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiptTimestamp", + "description": "Checks for equality with the object’s `receiptTimestamp` field.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Checks for equality with the object’s `receiver` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Checks for equality with the object’s `sender` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Checks for equality with the object’s `sequenceNumber` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceChainId", + "description": "Checks for equality with the object’s `sourceChainId` field.", + "type": { + "kind": "SCALAR", + "name": "BigInt", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Checks for equality with the object’s `sourceNetworkName` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouterAddress", + "description": "Checks for equality with the object’s `sourceRouterAddress` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Checks for equality with the object’s `state` field.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": "Checks for equality with the object’s `strict` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": "Checks for equality with the object’s `tokenAmounts` field.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Checks for equality with the object’s `transactionHash` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatFilter", + "description": "A filter to be used against `CcipTransactionsFlat` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "commitStoreAddress", + "description": "Filter by the object’s `commitStoreAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "data", + "description": "Filter by the object’s `data` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destNetworkName", + "description": "Filter by the object’s `destNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destRouterAddress", + "description": "Filter by the object’s `destRouterAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "destTransactionHash", + "description": "Filter by the object’s `destTransactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeToken", + "description": "Filter by the object’s `feeToken` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "feeTokenAmount", + "description": "Filter by the object’s `feeTokenAmount` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "info", + "description": "Filter by the object’s `info` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "infoRaw", + "description": "Filter by the object’s `infoRaw` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "messageId", + "description": "Filter by the object’s `messageId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nonce", + "description": "Filter by the object’s `nonce` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offrampAddress", + "description": "Filter by the object’s `offrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onrampAddress", + "description": "Filter by the object’s `onrampAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "origin", + "description": "Filter by the object’s `origin` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "receiver", + "description": "Filter by the object’s `receiver` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sender", + "description": "Filter by the object’s `sender` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sequenceNumber", + "description": "Filter by the object’s `sequenceNumber` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceNetworkName", + "description": "Filter by the object’s `sourceNetworkName` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceRouterAddress", + "description": "Filter by the object’s `sourceRouterAddress` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "state", + "description": "Filter by the object’s `state` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "strict", + "description": "Filter by the object’s `strict` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tokenAmounts", + "description": "Filter by the object’s `tokenAmounts` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "transactionHash", + "description": "Filter by the object’s `transactionHash` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTransactionsFlatsConnection", + "description": "A connection to a list of `CcipTransactionsFlat` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `CcipTransactionsFlat` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTransactionsFlatsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `CcipTransactionsFlat` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTransactionsFlat", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `CcipTransactionsFlat` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "CcipTransactionsFlatsEdge", + "description": "A `CcipTransactionsFlat` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `CcipTransactionsFlat` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "CcipTransactionsFlat", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTransactionsFlatsOrderBy", + "description": "Methods to use when ordering `CcipTransactionsFlat`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DATA_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_AMOUNT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_AMOUNT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FEE_TOKEN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "GAS_LIMIT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "GAS_LIMIT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NONCE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NONCE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STRICT_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STRICT_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_AMOUNTS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TOKEN_AMOUNTS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "CcipTransactionsOrderBy", + "description": "Methods to use when ordering `CcipTransaction`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "BLOCK_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BLOCK_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMMIT_STORE_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEST_TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INFO_RAW_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MESSAGE_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OFFRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ONRAMP_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ORIGIN_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TIMESTAMP_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIPT_TIMESTAMP_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RECEIVER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SENDER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SEQUENCE_NUMBER_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_CHAIN_ID_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_NETWORK_NAME_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_ROUTER_ADDRESS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOURCE_ROUTER_ADDRESS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "STATE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TRANSACTION_HASH_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Cursor", + "description": "A location in a connection that can be used for resuming pagination.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Datetime", + "description": "A point in time as described by the [ISO\n8601](https://en.wikipedia.org/wiki/ISO_8601) standard. May or may not include a timezone.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Float", + "description": "The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "ID", + "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Int", + "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "description": "A filter to be used against Int fields. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "JSON", + "description": "The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "JSONFilter", + "description": "A filter to be used against JSON fields. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "contains", + "description": "Contains the specified JSON.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INTERFACE", + "name": "Node", + "description": "An object with a globally unique `ID`.", + "isOneOf": null, + "fields": [ + { + "name": "nodeId", + "description": "A globally unique identifier. Can be used in various places throughout the system to identify this single value.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": [ + { + "kind": "OBJECT", + "name": "Query", + "ofType": null + }, + { + "kind": "OBJECT", + "name": "SchemaMigration", + "ofType": null + } + ] + }, + { + "kind": "OBJECT", + "name": "PageInfo", + "description": "Information about pagination in a connection.", + "isOneOf": null, + "fields": [ + { + "name": "endCursor", + "description": "When paginating forwards, the cursor to continue.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "hasNextPage", + "description": "When paginating forwards, are there more items?", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "hasPreviousPage", + "description": "When paginating backwards, are there more items?", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "startCursor", + "description": "When paginating backwards, the cursor to continue.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Query", + "description": "The root query type which gives access points into the data universe.", + "isOneOf": null, + "fields": [ + { + "name": "allCcipAllLaneStatuses", + "description": "Reads and enables pagination through a set of `CcipAllLaneStatus`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipAllLaneStatusFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipAllLaneStatus`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipAllLaneStatusesOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipAllLaneStatusesConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipFastTransferFills", + "description": "Reads and enables pagination through a set of `CcipFastTransferFill`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipFastTransferFillFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipFastTransferFill`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipFastTransferFillsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipFastTransferFillsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipLaneStatuses", + "description": "Reads and enables pagination through a set of `CcipLaneStatus`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneStatusFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipLaneStatus`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipLaneStatusesOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipLaneStatusesConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipLaneTimeEstimates", + "description": "Reads and enables pagination through a set of `CcipLaneTimeEstimate`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipLaneTimeEstimateFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipLaneTimeEstimate`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipLaneTimeEstimatesOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipLaneTimeEstimatesConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipMessages", + "description": "Reads and enables pagination through a set of `CcipMessage`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipMessageCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipMessageFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipMessage`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipMessagesOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipMessagesConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipMessagesFlats", + "description": "Reads and enables pagination through a set of `CcipMessagesFlat`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipMessagesFlatFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipMessagesFlat`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipMessagesFlatsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipMessagesFlatsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipSends", + "description": "Reads and enables pagination through a set of `CcipSend`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipSendCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipSendFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipSend`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipSendsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipSendsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTokenPoolEvents", + "description": "Reads and enables pagination through a set of `CcipTokenPoolEvent`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolEventFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTokenPoolEvent`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTokenPoolEventsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTokenPoolEventsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTokenPoolLanes", + "description": "Reads and enables pagination through a set of `CcipTokenPoolLane`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLaneFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTokenPoolLane`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTokenPoolLanesOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTokenPoolLanesGroups", + "description": "Reads and enables pagination through a set of `CcipTokenPoolLanesGroup`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesGroupFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTokenPoolLanesGroup`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTokenPoolLanesGroupsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesGroupsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTokenPoolLanesWithPools", + "description": "Reads and enables pagination through a set of `CcipTokenPoolLanesWithPool`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolLanesWithPoolFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTokenPoolLanesWithPool`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTokenPoolLanesWithPoolsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTokenPoolLanesWithPoolsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTokenPools", + "description": "Reads and enables pagination through a set of `CcipTokenPool`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTokenPoolFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTokenPool`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTokenPoolsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTokenPoolsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTransactions", + "description": "Reads and enables pagination through a set of `CcipTransaction`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTransaction`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTransactionsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTransactionsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allCcipTransactionsFlats", + "description": "Reads and enables pagination through a set of `CcipTransactionsFlat`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CcipTransactionsFlatFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `CcipTransactionsFlat`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "CcipTransactionsFlatsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[NATURAL]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "CcipTransactionsFlatsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "allSchemaMigrations", + "description": "Reads and enables pagination through a set of `SchemaMigration`.", + "args": [ + { + "name": "after", + "description": "Read all values in the set after (below) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "before", + "description": "Read all values in the set before (above) this cursor.", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "condition", + "description": "A condition to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationCondition", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "offset", + "description": "Skip the first `n` values from our `after` cursor, an alternative to cursor\nbased pagination. May not be used with `last`.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "orderBy", + "description": "The method to use when ordering `SchemaMigration`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "SchemaMigrationsOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[PRIMARY_KEY_ASC]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "SchemaMigrationsConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "Fetches an object given its globally unique `ID`.", + "args": [ + { + "name": "nodeId", + "description": "The globally unique `ID`.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodeId", + "description": "The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "query", + "description": "Exposes the root query type nested one level down. This is helpful for Relay 1\nwhich can only query top level fields if they are in a particular form.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Query", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "schemaMigration", + "description": "Reads a single `SchemaMigration` using its globally unique `ID`.", + "args": [ + { + "name": "nodeId", + "description": "The globally unique `ID` to be used in selecting a single `SchemaMigration`.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "SchemaMigration", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "schemaMigrationByVersion", + "description": null, + "args": [ + { + "name": "version", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "SchemaMigration", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "SchemaMigration", + "description": null, + "isOneOf": null, + "fields": [ + { + "name": "nodeId", + "description": "A globally unique identifier. Can be used in various places throughout the system to identify this single value.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "version", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationCondition", + "description": "A condition to be used against `SchemaMigration` object types. All fields are\ntested for equality and combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "version", + "description": "Checks for equality with the object’s `version` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationFilter", + "description": "A filter to be used against `SchemaMigration` object types. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "SchemaMigrationFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "version", + "description": "Filter by the object’s `version` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "SchemaMigrationsConnection", + "description": "A connection to a list of `SchemaMigration` values.", + "isOneOf": null, + "fields": [ + { + "name": "edges", + "description": "A list of edges which contains the `SchemaMigration` and cursor to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "SchemaMigrationsEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodes", + "description": "A list of `SchemaMigration` objects.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "SchemaMigration", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "The count of *all* `SchemaMigration` you could get from the connection.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "SchemaMigrationsEdge", + "description": "A `SchemaMigration` edge in the connection.", + "isOneOf": null, + "fields": [ + { + "name": "cursor", + "description": "A cursor for use in pagination.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": "The `SchemaMigration` at the end of the edge.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "SchemaMigration", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "SchemaMigrationsOrderBy", + "description": "Methods to use when ordering `SchemaMigration`.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "NATURAL", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PRIMARY_KEY_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PRIMARY_KEY_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VERSION_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VERSION_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "String", + "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "description": "A filter to be used against String fields. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "StringListFilter", + "description": "A filter to be used against String List fields. All fields are combined with a logical ‘and.’", + "isOneOf": false, + "fields": null, + "inputFields": [ + { + "name": "contains", + "description": "Contains the specified list of values.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Directive", + "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", + "isOneOf": null, + "fields": [ + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isRepeatable", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "locations", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__DirectiveLocation", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "args", + "description": null, + "args": [ + { + "name": "includeDeprecated", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "__DirectiveLocation", + "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "QUERY", + "description": "Location adjacent to a query operation.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MUTATION", + "description": "Location adjacent to a mutation operation.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SUBSCRIPTION", + "description": "Location adjacent to a subscription operation.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIELD", + "description": "Location adjacent to a field.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FRAGMENT_DEFINITION", + "description": "Location adjacent to a fragment definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FRAGMENT_SPREAD", + "description": "Location adjacent to a fragment spread.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INLINE_FRAGMENT", + "description": "Location adjacent to an inline fragment.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "VARIABLE_DEFINITION", + "description": "Location adjacent to a variable definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SCHEMA", + "description": "Location adjacent to a schema definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SCALAR", + "description": "Location adjacent to a scalar definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OBJECT", + "description": "Location adjacent to an object type definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIELD_DEFINITION", + "description": "Location adjacent to a field definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ARGUMENT_DEFINITION", + "description": "Location adjacent to an argument definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INTERFACE", + "description": "Location adjacent to an interface definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UNION", + "description": "Location adjacent to a union definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ENUM", + "description": "Location adjacent to an enum definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ENUM_VALUE", + "description": "Location adjacent to an enum value definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INPUT_OBJECT", + "description": "Location adjacent to an input object type definition.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INPUT_FIELD_DEFINITION", + "description": "Location adjacent to an input object field definition.", + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__EnumValue", + "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.", + "isOneOf": null, + "fields": [ + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isDeprecated", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "deprecationReason", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Field", + "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.", + "isOneOf": null, + "fields": [ + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "args", + "description": null, + "args": [ + { + "name": "includeDeprecated", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isDeprecated", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "deprecationReason", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__InputValue", + "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.", + "isOneOf": null, + "fields": [ + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "defaultValue", + "description": "A GraphQL-formatted string representing the default value for this input value.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isDeprecated", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "deprecationReason", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Schema", + "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.", + "isOneOf": null, + "fields": [ + { + "name": "description", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "types", + "description": "A list of all types supported by this server.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "queryType", + "description": "The type that query operations will be rooted at.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mutationType", + "description": "If this server supports mutation, the type that mutation operations will be rooted at.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "subscriptionType", + "description": "If this server support subscription, the type that subscription operations will be rooted at.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "directives", + "description": "A list of all directives supported by this server.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Directive", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Type", + "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.", + "isOneOf": null, + "fields": [ + { + "name": "kind", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__TypeKind", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "specifiedByURL", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "fields", + "description": null, + "args": [ + { + "name": "includeDeprecated", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Field", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "interfaces", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "possibleTypes", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "enumValues", + "description": null, + "args": [ + { + "name": "includeDeprecated", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__EnumValue", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inputFields", + "description": null, + "args": [ + { + "name": "includeDeprecated", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ofType", + "description": null, + "args": [], + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isOneOf", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "__TypeKind", + "description": "An enum describing what kind of type a given `__Type` is.", + "isOneOf": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "SCALAR", + "description": "Indicates this type is a scalar.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OBJECT", + "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INTERFACE", + "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UNION", + "description": "Indicates this type is a union. `possibleTypes` is a valid field.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ENUM", + "description": "Indicates this type is an enum. `enumValues` is a valid field.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INPUT_OBJECT", + "description": "Indicates this type is an input object. `inputFields` is a valid field.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LIST", + "description": "Indicates this type is a list. `ofType` is a valid field.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NON_NULL", + "description": "Indicates this type is a non-null. `ofType` is a valid field.", + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + } + ], + "directives": [ + { + "name": "deprecated", + "description": "Marks an element of a GraphQL schema as no longer supported.", + "isRepeatable": false, + "locations": ["ARGUMENT_DEFINITION", "ENUM_VALUE", "FIELD_DEFINITION", "INPUT_FIELD_DEFINITION"], + "args": [ + { + "name": "reason", + "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": "\"No longer supported\"", + "isDeprecated": false, + "deprecationReason": null + } + ] + }, + { + "name": "include", + "description": "Directs the executor to include this field or fragment only when the `if` argument is true.", + "isRepeatable": false, + "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"], + "args": [ + { + "name": "if", + "description": "Included when true.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ] + }, + { + "name": "skip", + "description": "Directs the executor to skip this field or fragment when the `if` argument is true.", + "isRepeatable": false, + "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"], + "args": [ + { + "name": "if", + "description": "Skipped when true.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ] + }, + { + "name": "specifiedBy", + "description": "Exposes a URL that specifies the behaviour of this scalar.", + "isRepeatable": false, + "locations": ["SCALAR"], + "args": [ + { + "name": "url", + "description": "The URL that specifies the behaviour of this scalar.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ] + } + ] + } +} diff --git a/src/lib/ccip/graphql/services/enrichment-data-service.ts b/src/lib/ccip/graphql/services/enrichment-data-service.ts new file mode 100644 index 00000000000..0fd4c4f7796 --- /dev/null +++ b/src/lib/ccip/graphql/services/enrichment-data-service.ts @@ -0,0 +1,479 @@ +/** + * CCIP Enrichment Data Service + * + * Fetches dynamic pool data and rate limits from the Atlas GraphQL API. + * Replaces the static mock JSON files that were previously used for enrichment. + * + * All token address resolution (from tokens.json) and chain name mapping + * (directory key → selector name) are handled by the reference-data-resolver. + * Address normalization for GraphQL is handled by address-utils. + * + * Caching: LRU cache with 60s TTL — deduplicates concurrent requests and + * avoids repeated GraphQL calls within a Vercel serverless invocation. + */ + +import { LRUCache } from "lru-cache" +import { executeGraphQLQuery } from "~/lib/ccip/graphql/client.ts" +import { TOKEN_POOL_LANES_WITH_POOLS_QUERY } from "~/lib/ccip/graphql/queries/token-pool-lanes.ts" +import { TOKEN_POOLS_QUERY } from "~/lib/ccip/graphql/queries/token-pools.ts" +import { normalizeAddressForQuery } from "~/lib/ccip/graphql/utils/address-utils.ts" +import { + resolveTokenAddress, + resolveAllTokenAddresses, + toSelectorName, + getAllTokenSymbols, + getChainFamilyForDirectoryKey, +} from "~/lib/ccip/graphql/utils/reference-data-resolver.ts" +import { extractVersion, extractRawType, normalizePoolType } from "~/lib/ccip/graphql/utils/type-version-parser.ts" +import { normalizeAddressForDisplay } from "~/lib/ccip/graphql/utils/address-display.ts" +import type { Environment } from "~/config/data/ccip/types.ts" +import type { + RawTokenRateLimits, + RateLimiterConfig, + RateLimiterDirections, + CCVConfigData, +} from "~/lib/ccip/types/index.ts" +import type { + GetTokenPoolLanesWithPoolsQuery, + GetTokenPoolLanesWithPoolsQueryVariables, + GetTokenPoolsQuery, + GetTokenPoolsQueryVariables, +} from "~/lib/ccip/graphql/__generated__/graphql.ts" + +// ---------- Exported types ---------- + +export interface PoolInfo { + address: string + rawType: string + type: string + version: string +} + +export type PoolData = Record // directoryKey → PoolInfo + +// ---------- Cache ---------- + +const queryCache = new LRUCache>({ + max: 500, + ttl: 60_000, +}) + +function cached(key: string, fetcher: () => Promise): Promise { + const hit = queryCache.get(key) + if (hit) return hit as Promise + + const promise = fetcher().catch((error) => { + queryCache.delete(key) + throw error + }) + + queryCache.set(key, promise) + return promise +} + +// ---------- Rate limit helpers ---------- + +function toRateLimiterConfig(capacity: unknown, rate: unknown, isEnabled: unknown): RateLimiterConfig { + return { + capacity: String(capacity ?? "0"), + rate: String(rate ?? "0"), + isEnabled: Boolean(isEnabled), + } +} + +function toRateLimiterDirections( + inCap: unknown, + inRate: unknown, + inEnabled: unknown, + outCap: unknown, + outRate: unknown, + outEnabled: unknown +): RateLimiterDirections | null { + if (inCap == null && outCap == null) return null + return { + in: toRateLimiterConfig(inCap, inRate, inEnabled), + out: toRateLimiterConfig(outCap, outRate, outEnabled), + } +} + +// ---------- Pool data ---------- + +export async function fetchPoolDataForToken( + environment: Environment, + tokenSymbol: string, + directoryKey: string +): Promise { + const tokenAddress = resolveTokenAddress(environment, tokenSymbol, directoryKey) + if (!tokenAddress) return null + + const network = toSelectorName(environment, directoryKey) + const addr = normalizeAddressForQuery(tokenAddress) + + try { + return await cached(`pool|${environment}|${addr}|${network}`, async () => { + const result = await executeGraphQLQuery(TOKEN_POOLS_QUERY, { + first: 10, + condition: { token: addr, network }, + }) + + const node = result.allCcipTokenPools?.nodes?.find((n) => n.tokenPool) + if (!node?.tokenPool) return null + + const chainFamily = getChainFamilyForDirectoryKey(directoryKey) + const rawType = extractRawType(node.typeAndVersion) + return { + address: normalizeAddressForDisplay(node.tokenPool, chainFamily), + rawType, + type: normalizePoolType(rawType), + version: extractVersion(node.typeAndVersion) || "", + } + }) + } catch (error) { + console.error(`[CCIP GraphQL] fetchPoolDataForToken failed: ${tokenSymbol}@${directoryKey}`, error) + return null + } +} + +export async function fetchPoolDataForTokenAllChains(environment: Environment, tokenSymbol: string): Promise { + const addressMap = resolveAllTokenAddresses(environment, tokenSymbol) + if (Object.keys(addressMap).length === 0) return {} + + try { + return await cached(`pool-all|${environment}|${tokenSymbol}`, async () => { + const normalizedAddresses = [...new Set(Object.values(addressMap).map(normalizeAddressForQuery))] + + const result = await executeGraphQLQuery(TOKEN_POOLS_QUERY, { + first: 2000, + filter: { token: { in: normalizedAddresses } }, + }) + + // Reverse lookup: "normalizedAddress|network" → directoryKey + // Uses both address AND network to handle chains sharing the same token address + const addrNetworkToDir = new Map() + for (const [dirKey, addr] of Object.entries(addressMap)) { + const network = toSelectorName(environment, dirKey) + const key = `${normalizeAddressForQuery(addr)}|${network}` + addrNetworkToDir.set(key, dirKey) + } + + const poolData: PoolData = {} + for (const node of result.allCcipTokenPools?.nodes ?? []) { + if (!node.token || !node.tokenPool || !node.network) continue + const key = `${normalizeAddressForQuery(node.token)}|${node.network}` + const dirKey = addrNetworkToDir.get(key) + if (!dirKey) continue + + const chainFamily = getChainFamilyForDirectoryKey(dirKey) + const rawType = extractRawType(node.typeAndVersion) + poolData[dirKey] = { + address: normalizeAddressForDisplay(node.tokenPool, chainFamily), + rawType, + type: normalizePoolType(rawType), + version: extractVersion(node.typeAndVersion) || "", + } + } + + return poolData + }) + } catch (error) { + console.error(`[CCIP GraphQL] fetchPoolDataForTokenAllChains failed: ${tokenSymbol}`, error) + return {} + } +} + +// ---------- All pool data (batch for list endpoints) ---------- + +/** + * Fetch pool data for ALL tokens in one paginated query. + * Used by /tokens list endpoint to avoid N+1 queries. + * Returns: tokenSymbol → directoryKey → PoolInfo + */ +export type AllPoolData = Record + +export async function fetchAllPoolData(environment: Environment): Promise { + try { + return await cached(`all-pools|${environment}`, async () => { + // Build reverse lookup: normalizedAddress|network → { tokenSymbol, directoryKey } + const addressIndex = buildAddressIndex(environment) + + // Paginated fetch of ALL pools + const allNodes = await fetchAllPoolNodes() + + // Map GraphQL results back to tokenSymbol → directoryKey → PoolInfo + const allPoolData: AllPoolData = {} + for (const node of allNodes) { + if (!node.token || !node.network || !node.tokenPool) continue + const key = `${normalizeAddressForQuery(node.token)}|${node.network}` + const mapping = addressIndex.get(key) + if (!mapping) continue + + const { tokenSymbol, directoryKey } = mapping + const chainFamily = getChainFamilyForDirectoryKey(directoryKey) + const rawType = extractRawType(node.typeAndVersion) + + if (!allPoolData[tokenSymbol]) allPoolData[tokenSymbol] = {} + allPoolData[tokenSymbol][directoryKey] = { + address: normalizeAddressForDisplay(node.tokenPool, chainFamily), + rawType, + type: normalizePoolType(rawType), + version: extractVersion(node.typeAndVersion) || "", + } + } + + return allPoolData + }) + } catch (error) { + console.error("[CCIP GraphQL] fetchAllPoolData failed:", error) + return {} + } +} + +/** + * Builds a reverse lookup index from tokens.json: + * normalizedAddress|selectorName → { tokenSymbol, directoryKey } + */ +function buildAddressIndex(environment: Environment): Map { + const allSymbols = getAllTokenSymbols(environment) + const index = new Map() + + for (const tokenSymbol of allSymbols) { + const addressMap = resolveAllTokenAddresses(environment, tokenSymbol) + for (const [directoryKey, tokenAddress] of Object.entries(addressMap)) { + const network = toSelectorName(environment, directoryKey) + const key = `${normalizeAddressForQuery(tokenAddress)}|${network}` + index.set(key, { tokenSymbol, directoryKey }) + } + } + + return index +} + +type PoolNode = NonNullable["nodes"]>[number] + +/** + * Fetches all token pool nodes with offset-based pagination. + */ +async function fetchAllPoolNodes(): Promise { + const PAGE_SIZE = 2000 + const allNodes: PoolNode[] = [] + let offset = 0 + let fetched: number + + do { + const result = await executeGraphQLQuery(TOKEN_POOLS_QUERY, { + first: PAGE_SIZE, + offset, + }) + const nodes = result.allCcipTokenPools?.nodes ?? [] + allNodes.push(...nodes) + fetched = nodes.length + offset += PAGE_SIZE + } while (fetched >= PAGE_SIZE) + + return allNodes +} + +// ---------- Pool version ---------- + +export async function fetchPoolVersion( + environment: Environment, + tokenSymbol: string, + directoryKey: string +): Promise { + const pool = await fetchPoolDataForToken(environment, tokenSymbol, directoryKey) + return pool?.version ?? null +} + +// ---------- minBlockConfirmations ---------- + +export async function fetchMinBlockConfirmations( + environment: Environment, + tokenSymbol: string, + directoryKey: string +): Promise { + const tokenAddress = resolveTokenAddress(environment, tokenSymbol, directoryKey) + if (!tokenAddress) return null + + const network = toSelectorName(environment, directoryKey) + const addr = normalizeAddressForQuery(tokenAddress) + + try { + return await cached(`minblock|${environment}|${addr}|${network}`, async () => { + const result = await executeGraphQLQuery(TOKEN_POOLS_QUERY, { + first: 10, + condition: { token: addr, network }, + }) + + const node = result.allCcipTokenPools?.nodes?.find((n) => n.tokenPool) + return node?.minBlockConfirmations ?? null + }) + } catch (error) { + console.error(`[CCIP GraphQL] fetchMinBlockConfirmations failed: ${tokenSymbol}@${directoryKey}`, error) + return null + } +} + +// ---------- Lane rate limits ---------- + +export async function fetchLaneRateLimits( + environment: Environment, + tokenSymbol: string, + sourceDirectoryKey: string, + destDirectoryKey: string +): Promise { + const srcNetwork = toSelectorName(environment, sourceDirectoryKey) + const dstNetwork = toSelectorName(environment, destDirectoryKey) + + const cacheKey = `lane|${environment}|${srcNetwork}|${tokenSymbol}|${dstNetwork}` + + try { + return await cached(cacheKey, async () => { + const result = await executeGraphQLQuery< + GetTokenPoolLanesWithPoolsQuery, + GetTokenPoolLanesWithPoolsQueryVariables + >(TOKEN_POOL_LANES_WITH_POOLS_QUERY, { + first: 1, + condition: { + tokenSymbol, + network: srcNetwork, + remoteNetworkName: dstNetwork, + }, + filter: { removed: { notEqualTo: true } }, + }) + + const node = result.allCcipTokenPoolLanesWithPools?.nodes?.[0] + if (!node) return null + + return { + standard: toRateLimiterDirections( + node.inboundCapacity, + node.inboundRate, + node.inboundEnabled, + node.outboundCapacity, + node.outboundRate, + node.outboundEnabled + ), + custom: toRateLimiterDirections( + node.customInboundCapacity, + node.customInboundRate, + node.customInboundEnabled, + node.customOutboundCapacity, + node.customOutboundRate, + node.customOutboundEnabled + ), + } + }) + } catch (error) { + console.error( + `[CCIP GraphQL] fetchLaneRateLimits failed: ${tokenSymbol} ${sourceDirectoryKey}->${destDirectoryKey}`, + error + ) + return null + } +} + +// ---------- Batch lane tokens ---------- + +export interface LaneTokenData { + tokenSymbol: string + tokenAddress: string + tokenDecimals: number + sourcePoolType: string + destPoolType: string + rateLimits: RawTokenRateLimits | null +} + +/** + * Fetches all tokens for a lane in two parallel batch queries (outbound + inbound). + * Replaces the previous N+1 approach of calling fetchLaneRateLimits per token. + * + * Outbound query (network=src, remoteNetworkName=dest): + * → source token address, decimals, source pool type, rate limits + * Inbound query (network=dest, remoteNetworkName=src): + * → destination pool type per token symbol + */ +export async function fetchAllTokensForLane( + environment: Environment, + sourceDirectoryKey: string, + destDirectoryKey: string +): Promise { + const srcNetwork = toSelectorName(environment, sourceDirectoryKey) + const dstNetwork = toSelectorName(environment, destDirectoryKey) + + const cacheKey = `lane-batch|${environment}|${srcNetwork}|${dstNetwork}` + + try { + return await cached(cacheKey, async () => { + const [outboundResult, inboundResult] = await Promise.all([ + executeGraphQLQuery( + TOKEN_POOL_LANES_WITH_POOLS_QUERY, + { + first: 500, + condition: { network: srcNetwork, remoteNetworkName: dstNetwork }, + filter: { removed: { notEqualTo: true } }, + } + ), + executeGraphQLQuery( + TOKEN_POOL_LANES_WITH_POOLS_QUERY, + { + first: 500, + condition: { network: dstNetwork, remoteNetworkName: srcNetwork }, + filter: { removed: { notEqualTo: true } }, + } + ), + ]) + + // Build destination pool type map: tokenSymbol → destPoolType + const destPoolTypeBySymbol = new Map() + for (const node of inboundResult.allCcipTokenPoolLanesWithPools?.nodes ?? []) { + if (node.tokenSymbol) { + destPoolTypeBySymbol.set(node.tokenSymbol, normalizePoolType(extractRawType(node.typeAndVersion))) + } + } + + const results: LaneTokenData[] = [] + for (const node of outboundResult.allCcipTokenPoolLanesWithPools?.nodes ?? []) { + if (!node.tokenSymbol || !node.token) continue + + const rawType = extractRawType(node.typeAndVersion) + results.push({ + tokenSymbol: node.tokenSymbol, + tokenAddress: node.token, + tokenDecimals: node.tokenDecimals ?? 18, + sourcePoolType: normalizePoolType(rawType), + destPoolType: destPoolTypeBySymbol.get(node.tokenSymbol) ?? "", + rateLimits: { + standard: toRateLimiterDirections( + node.inboundCapacity, + node.inboundRate, + node.inboundEnabled, + node.outboundCapacity, + node.outboundRate, + node.outboundEnabled + ), + custom: toRateLimiterDirections( + node.customInboundCapacity, + node.customInboundRate, + node.customInboundEnabled, + node.customOutboundCapacity, + node.customOutboundRate, + node.customOutboundEnabled + ), + }, + }) + } + + return results + }) + } catch (error) { + console.error(`[CCIP GraphQL] fetchAllTokensForLane failed: ${sourceDirectoryKey}->${destDirectoryKey}`, error) + return [] + } +} + +// ---------- Stubs ---------- + +// TODO: CCV verifier data is not yet available in the GraphQL schema. +export function stubCCVConfigData(): CCVConfigData { + return {} +} diff --git a/src/lib/ccip/graphql/utils/address-display.ts b/src/lib/ccip/graphql/utils/address-display.ts new file mode 100644 index 00000000000..8cf6e787b84 --- /dev/null +++ b/src/lib/ccip/graphql/utils/address-display.ts @@ -0,0 +1,65 @@ +/** + * Address display normalization for API responses. + * + * Ensures addresses are returned in the canonical display format + * for each chain family. This is the counterpart to address-utils.ts + * which normalizes addresses for GraphQL queries (input). + * + * Strategy by chain family: + * - EVM: EIP-55 checksummed (mixed-case encoding of the address) + * - Solana: Base58 — case-sensitive, returned as-is + * - Aptos: 0x + lowercase hex (64 chars) — canonical format + * - SUI: 0x + lowercase hex (64 chars) — canonical format + * - TON: raw format, returned as-is + * - Starknet: 0x + lowercase hex, returned as-is + * + * To add a new chain family: + * 1. Add a case to normalizeAddressForDisplay + * 2. Implement the normalization function if needed + * 3. Update this JSDoc + */ + +import { getAddress } from "ethers" + +export type ChainFamily = "evm" | "solana" | "aptos" | "sui" | "ton" | "starknet" | "tron" | "canton" | "stellar" + +/** + * Normalizes an address for display in API responses. + * + * @param address - Raw address from GraphQL or reference data + * @param chainFamily - Chain family determining the normalization strategy + * @returns Display-normalized address + */ +export function normalizeAddressForDisplay(address: string, chainFamily: ChainFamily | null): string { + if (!address || !chainFamily) return address + + switch (chainFamily) { + case "evm": + return checksumEVMAddress(address) + case "solana": + case "aptos": + case "sui": + case "ton": + case "starknet": + case "tron": + case "canton": + case "stellar": + // These chain families use their native format as canonical — no transformation needed + return address + default: + return address + } +} + +/** + * Applies EIP-55 checksumming to an EVM address. + * Falls back to the original address if checksumming fails (e.g., invalid address). + */ +function checksumEVMAddress(address: string): string { + try { + return getAddress(address) + } catch { + // If checksumming fails, return as-is rather than breaking the response + return address + } +} diff --git a/src/lib/ccip/graphql/utils/address-utils.ts b/src/lib/ccip/graphql/utils/address-utils.ts new file mode 100644 index 00000000000..0de600b6788 --- /dev/null +++ b/src/lib/ccip/graphql/utils/address-utils.ts @@ -0,0 +1,27 @@ +/** + * Address normalization utilities for GraphQL queries against the Atlas database. + * + * Atlas stores addresses in chain-family-specific formats: + * - EVM (Ethereum, Arbitrum, Base, etc.): 0x-prefixed, all lowercase hex + * - Aptos: 0x-prefixed, all lowercase hex (64 chars) + * - Solana: Base58-encoded, case-sensitive (no 0x prefix) + * - SUI: 0x-prefixed, all lowercase hex (64 chars) + * + * Our reference data (tokens.json) may store addresses with mixed casing + * (e.g., EIP-55 checksummed EVM addresses). Before querying GraphQL, + * addresses must be normalized to match the Atlas format. + */ + +/** + * Normalizes a token/pool address for use in GraphQL queries. + * + * - 0x-prefixed addresses (EVM, Aptos, SUI): lowercased to match Atlas format + * - Base58 addresses (Solana): kept as-is since Base58 is case-sensitive + * + * @param address - Token or pool address from reference data + * @returns Normalized address safe for GraphQL condition/filter values + */ +export function normalizeAddressForQuery(address: string): string { + if (!address) return address + return address.startsWith("0x") ? address.toLowerCase() : address +} diff --git a/src/lib/ccip/graphql/utils/reference-data-resolver.ts b/src/lib/ccip/graphql/utils/reference-data-resolver.ts new file mode 100644 index 00000000000..b5eaa001f95 --- /dev/null +++ b/src/lib/ccip/graphql/utils/reference-data-resolver.ts @@ -0,0 +1,126 @@ +/** + * Reference data resolver — bridges static reference data (tokens.json, chains.json) + * with the GraphQL API by providing token address lookups and chain name mapping. + * + * This module caches loaded reference data per environment to avoid repeated + * file reads during a single serverless invocation. + * + * Key responsibilities: + * - Resolve token symbol + directory key → token address (from tokens.json) + * - Map directory key → selector name (for GraphQL `network` field) + * - Batch resolve all chain addresses for a token + */ + +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { Environment, Version } from "~/config/data/ccip/types.ts" +import { loadReferenceData } from "~/config/data/ccip/index.ts" +import { directoryToSupportedChain, getChainTypeAndFamily } from "~/features/utils/index.ts" +import type { ChainFamily } from "~/lib/ccip/graphql/utils/address-display.ts" + +// Cache loaded reference data and chain services per environment +const refDataCache = new Map< + string, + { + tokensReferenceData: Record> + chainIdService: ChainIdentifierService + } +>() + +function getRefData(environment: Environment) { + const cached = refDataCache.get(environment) + if (cached) return cached + + const { tokensReferenceData } = loadReferenceData({ environment, version: Version.V1_2_0 }) + const chainIdService = new ChainIdentifierService(environment) + + const entry = { + tokensReferenceData: tokensReferenceData as Record>, + chainIdService, + } + refDataCache.set(environment, entry) + return entry +} + +/** + * Resolves a token address from tokens.json using token symbol and directory key. + * @returns Token address or null if not found + */ +export function resolveTokenAddress( + environment: Environment, + tokenSymbol: string, + directoryKey: string +): string | null { + const { tokensReferenceData } = getRefData(environment) + return tokensReferenceData[tokenSymbol]?.[directoryKey]?.tokenAddress || null +} + +/** + * Resolves all token addresses for a token across all chains. + * @returns Map of directoryKey → tokenAddress + */ +export function resolveAllTokenAddresses(environment: Environment, tokenSymbol: string): Record { + const { tokensReferenceData } = getRefData(environment) + const chainEntries = tokensReferenceData[tokenSymbol] + if (!chainEntries) return {} + + const result: Record = {} + for (const [directoryKey, info] of Object.entries(chainEntries)) { + if (info.tokenAddress) { + result[directoryKey] = info.tokenAddress + } + } + return result +} + +/** + * Maps a directory key (e.g., "mainnet") to a selector name (e.g., "ethereum-mainnet"). + * Selector names are used as the `network` field in GraphQL queries. + * @returns Selector name, or the input directoryKey if no mapping exists + */ +export function toSelectorName(environment: Environment, directoryKey: string): string { + const { chainIdService } = getRefData(environment) + return chainIdService.getSelectorName(directoryKey) ?? directoryKey +} + +/** + * Resolves a user-provided token symbol to its canonical form in tokens.json. + * Handles case-insensitive matching and whitespace trimming. + * @returns Canonical token symbol or null if not found + */ +export function resolveTokenSymbol(environment: Environment, input: string): string | null { + const trimmed = input.trim() + if (!trimmed) return null + + const { tokensReferenceData } = getRefData(environment) + + // Exact match first (fast path) + if (trimmed in tokensReferenceData) return trimmed + + // Case-insensitive fallback + const lowerInput = trimmed.toLowerCase() + for (const symbol of Object.keys(tokensReferenceData)) { + if (symbol.toLowerCase() === lowerInput) return symbol + } + + return null +} + +/** + * Returns all token symbols from the reference data. + */ +export function getAllTokenSymbols(environment: Environment): string[] { + const { tokensReferenceData } = getRefData(environment) + return Object.keys(tokensReferenceData) +} + +/** + * Resolves a directory key to its chain family (evm, solana, aptos, etc.). + * Used for address display normalization. + * @returns Chain family or null if resolution fails (address should be returned as-is) + */ +export function getChainFamilyForDirectoryKey(directoryKey: string): ChainFamily | null { + const supportedChain = directoryToSupportedChain(directoryKey) + if (!supportedChain) return null + const { chainFamily } = getChainTypeAndFamily(supportedChain) + return chainFamily as ChainFamily +} diff --git a/src/lib/ccip/graphql/utils/type-version-parser.ts b/src/lib/ccip/graphql/utils/type-version-parser.ts new file mode 100644 index 00000000000..e2da5515d80 --- /dev/null +++ b/src/lib/ccip/graphql/utils/type-version-parser.ts @@ -0,0 +1,72 @@ +/** + * Utilities for parsing the `typeAndVersion` field from Atlas GraphQL responses. + * + * Atlas stores pool metadata as a combined string, e.g.: + * - "BurnMintTokenPool 1.5.1" + * - "LockReleaseTokenPool 1.6.0" + * - "USDCTokenPool 1.6.2" + * - "ManagedTokenPool 1.6.0" (Aptos) + * + * These utilities extract the raw type name, semantic version, and + * normalized pool type from this field. + */ + +const VERSION_REGEX = /(\d+\.\d+\.\d+)/ + +/** + * Extracts the semantic version from a typeAndVersion string. + * @example extractVersion("BurnMintTokenPool 1.5.1") → "1.5.1" + * @example extractVersion(null) → null + */ +export function extractVersion(typeAndVersion: string | null | undefined): string | null { + if (!typeAndVersion) return null + const match = typeAndVersion.match(VERSION_REGEX) + return match ? match[1] : null +} + +/** + * Extracts the raw pool type name from a typeAndVersion string. + * @example extractRawType("BurnMintTokenPool 1.5.1") → "BurnMintTokenPool" + * @example extractRawType(null) → "" + */ +export function extractRawType(typeAndVersion: string | null | undefined): string { + if (!typeAndVersion) return "" + return typeAndVersion.replace(/\s+\d+\.\d+\.\d+.*$/, "").trim() +} + +/** + * Normalizes a raw pool type to a canonical pool type identifier. + * + * Known mappings: + * - "USDCTokenPool" → "usdc" + * - "LockReleaseTokenPool" → "lockRelease" + * - "BurnMintTokenPool", "BurnMintTokenPoolAndProxy" → "burnMint" + * - Unrecognized types are returned as-is (signals new/unknown pool type) + * + * @example normalizePoolType("BurnMintTokenPool") → "burnMint" + * @example normalizePoolType("ManagedTokenPool") → "ManagedTokenPool" + */ +export function normalizePoolType(rawType: string): string { + const lower = rawType.toLowerCase() + if (lower.includes("usdc")) return "usdc" + if (lower.includes("lockrelease")) return "lockRelease" + if (lower.includes("burnmint") || lower.includes("burn")) return "burnMint" + return rawType +} + +/** + * Formats a raw pool type to a short human-readable display label. + * + * @example formatPoolTypeForDisplay("BurnMintTokenPoolAndProxy") → "BurnMint" + * @example formatPoolTypeForDisplay("LockReleaseTokenPool") → "LockRelease" + * @example formatPoolTypeForDisplay("USDCTokenPool") → "USDC" + * @example formatPoolTypeForDisplay("ManagedTokenPool") → "Managed" + */ +export function formatPoolTypeForDisplay(rawType: string): string { + const lower = rawType.toLowerCase() + if (lower.includes("usdc")) return "USDC" + if (lower.includes("lockrelease")) return "LockRelease" + if (lower.includes("burnmint") || lower.includes("burn")) return "BurnMint" + if (lower.includes("managed")) return "Managed" + return rawType +} 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 97% rename from src/pages/api/ccip/services/faucet/error-handler.ts rename to src/lib/ccip/services-api/faucet/error-handler.ts index e79b173580f..228b478cb38 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" @@ -254,9 +254,9 @@ export async function handleFaucetError( APIErrorType.VALIDATION_ERROR, `You can request tokens again in ${timeInfo.displayTime}`, 429, // Rate limit status + requestId, { code: "RATE_LIMIT_ACTIVE", - traceId: requestId, remainingSeconds: timeInfo.remainingSeconds, nextAvailable: timeInfo.nextAvailable.toISOString(), displayTime: timeInfo.displayTime, @@ -279,37 +279,33 @@ export async function handleFaucetError( if (errorMessage.includes(pattern)) { const responseData = { code: mapping.code, - traceId: requestId, ...(mapping.retryAfter && { retryAfter: mapping.retryAfter }), } - return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, responseData) + return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, requestId, responseData) } } // Check for partial matches for compound error messages if (errorMessage.includes("insufficient") && errorMessage.includes("funds")) { const mapping = ERROR_MAPPINGS["insufficient funds"] - return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, { + return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, requestId, { code: mapping.code, - traceId: requestId, retryAfter: mapping.retryAfter, }) } if (errorMessage.includes("invalid") && errorMessage.includes("mint")) { const mapping = ERROR_MAPPINGS["invalid mint"] - return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, { + return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, requestId, { code: mapping.code, - traceId: requestId, }) } if (errorMessage.includes("timeout") || errorMessage.includes("deadline")) { const mapping = ERROR_MAPPINGS["timeout exceeded"] - return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, { + return createErrorResponse(mapping.errorType, mapping.userMessage, mapping.httpStatus, requestId, { code: mapping.code, - traceId: requestId, }) } @@ -318,9 +314,9 @@ export async function handleFaucetError( APIErrorType.SERVER_ERROR, "We encountered an issue processing your request. Please try again or contact support if this continues.", 500, + requestId, { code: "UNEXPECTED_FAUCET_ERROR", - traceId: requestId, } ) } diff --git a/src/pages/api/services/chain-data.ts b/src/lib/ccip/services/chain-data.ts similarity index 74% rename from src/pages/api/services/chain-data.ts rename to src/lib/ccip/services/chain-data.ts index 4e0b6a6fd22..2e92dba94b9 100644 --- a/src/pages/api/services/chain-data.ts +++ b/src/lib/ccip/services/chain-data.ts @@ -1,12 +1,20 @@ -import { Environment, ChainDetails, FilterType, ChainConfigError, FeeTokenEnriched } from "../ccip/types/index.ts" +import { + Environment, + ChainDetails, + FilterType, + ChainConfigError, + FeeTokenEnriched, + ChainFamily, +} 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 { getSelectorEntry, getAllSelectors } from "@config/data/ccip/selectors.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" +import { getChainId, getNativeCurrency, getTitle, getChainTypeAndFamily } from "@features/utils/index.ts" +import { SupportedChain, ChainType } from "~/config/index.ts" import { getTokenData } from "@config/data/ccip/data.ts" import { Version } from "@config/data/ccip/types.ts" +import { deriveDisplayName } from "~/lib/ccip/utils/display-name.ts" export const prerender = false @@ -65,13 +73,13 @@ abstract class BaseChainStrategy implements IChainProcessingStrategy { } } - // Validate chainId and selectorEntry - if (!chainId || !selectorEntry) { + // Validate chainId and selectorEntry (use explicit null/undefined check to allow chainId 0) + if (chainId === undefined || chainId === null || !selectorEntry) { logger.warn({ message: "Missing chain ID or selector entry", requestId: this.requestId, networkId, - hasChainId: !!chainId, + hasChainId: chainId !== undefined && chainId !== null, hasSelectorEntry: !!selectorEntry, }) @@ -228,9 +236,19 @@ class EvmChainStrategy extends BaseChainStrategy { } } - // Construct the complete EVM chain details + // Construct the complete EVM chain details with explicit field assignment + const { baseData } = baseValidation const validatedData: ChainDetails = { - ...(baseValidation.baseData as unknown as ChainDetails), + chainId: baseData.chainId!, + displayName: baseData.displayName!, + selector: baseData.selector!, + internalId: baseData.internalId!, + feeTokens: baseData.feeTokens!, + router: baseData.router!, + rmn: baseData.rmn!, + chainType: baseData.chainType!, + chainFamily: baseData.chainFamily!, + supported: true, registryModule: chainConfig.registryModule?.address, tokenAdminRegistry: chainConfig.tokenAdminRegistry?.address, tokenPoolFactory: chainConfig.tokenPoolFactory?.address, @@ -292,9 +310,19 @@ class SolanaChainStrategy extends BaseChainStrategy { } } - // Construct the complete Solana chain details + // Construct the complete Solana chain details with explicit field assignment + const { baseData } = baseValidation const validatedData: ChainDetails = { - ...(baseValidation.baseData as unknown as ChainDetails), + chainId: baseData.chainId!, + displayName: baseData.displayName!, + selector: baseData.selector!, + internalId: baseData.internalId!, + feeTokens: baseData.feeTokens!, + router: baseData.router!, + rmn: baseData.rmn!, + chainType: baseData.chainType!, + chainFamily: baseData.chainFamily!, + supported: true, feeQuoter: chainConfig.feeQuoter, } @@ -348,8 +376,19 @@ class AptosChainStrategy extends BaseChainStrategy { } } + // Construct the complete Aptos chain details with explicit field assignment + const { baseData } = baseValidation const validatedData: ChainDetails = { - ...(baseValidation.baseData as ChainDetails), + chainId: baseData.chainId!, + displayName: baseData.displayName!, + selector: baseData.selector!, + internalId: baseData.internalId!, + feeTokens: baseData.feeTokens!, + router: baseData.router!, + rmn: baseData.rmn!, + chainType: baseData.chainType!, + chainFamily: baseData.chainFamily!, + supported: true, tokenAdminRegistry: chainConfig.tokenAdminRegistry?.address ?? "", mcms: chainConfig.mcms?.address ?? "", } @@ -373,6 +412,13 @@ class ChainStrategyFactory { ["evm", EvmChainStrategy], ["solana", SolanaChainStrategy], ["aptos", AptosChainStrategy], + ["sui", AptosChainStrategy], // Sui uses Move VM like Aptos + // New chain types use EVM strategy as fallback until specific strategies are implemented + ["tron", EvmChainStrategy], + ["canton", EvmChainStrategy], + ["ton", EvmChainStrategy], + ["stellar", EvmChainStrategy], + ["starknet", EvmChainStrategy], ]) static getStrategy(chainType: ChainType, requestId: string): IChainProcessingStrategy { @@ -399,10 +445,11 @@ export class ChainDataService { /** * Creates a new instance of ChainDataService * @param chainConfig - Configuration for supported chains + * @param requestId - Optional request ID for log correlation (generates new UUID if not provided) */ - constructor(chainConfig: ChainsConfig) { + constructor(chainConfig: ChainsConfig, requestId?: string) { this.chainConfig = chainConfig - this.requestId = crypto.randomUUID() + this.requestId = requestId ?? crypto.randomUUID() logger.debug({ message: "ChainDataService initialized", @@ -625,7 +672,7 @@ export class ChainDataService { if (filters.chainId) { const chainIds = filters.chainId.split(",").map((id) => id.trim()) - filteredChains = chains.filter((chain) => chainIds.includes(String(chain.chainId))) + filteredChains = filteredChains.filter((chain) => chainIds.includes(String(chain.chainId))) } if (filters.selector) { @@ -654,8 +701,14 @@ export class ChainDataService { // Group by chain family const groupedChains: Record = { evm: [], - mvm: [], - svm: [], + aptos: [], + sui: [], + solana: [], + tron: [], + canton: [], + ton: [], + stellar: [], + starknet: [], } for (const chain of filteredChains) { @@ -681,3 +734,115 @@ export class ChainDataService { } } } + +/** + * Maps a chain type to its corresponding chain family. + * + * Each chain type maps directly to its own family: + * - evm: Ethereum Virtual Machine chains + * - solana: Solana chains + * - aptos: Aptos chains + * - sui: Sui chains + * - tron, canton, ton, stellar, starknet: Each has its own family + * + * @param chainType - The specific chain type + * @returns The chain family (same as chain type) + * @example + * getChainFamilyFromType('solana') // returns 'solana' + * getChainFamilyFromType('aptos') // returns 'aptos' + */ +function getChainFamilyFromType(chainType: ChainType): ChainFamily { + switch (chainType) { + case "evm": + return "evm" + case "solana": + return "solana" + case "aptos": + return "aptos" + case "sui": + return "sui" + case "tron": + return "tron" + case "canton": + return "canton" + case "ton": + return "ton" + case "stellar": + return "stellar" + case "starknet": + return "starknet" + default: + return "evm" + } +} + +/** + * Gets all chains for search including both supported and unsupported chains. + * + * Supported chains have full details from the chain configuration, while + * unsupported chains have minimal details derived from selector YAML files. + * The displayName for unsupported chains is derived from their internalId. + * + * @param environment - Network environment (mainnet/testnet) + * @param supportedChains - Array of fully supported chain details with complete configuration + * @returns Array of all chain details with supported flag indicating if chain is fully configured + * + * @example + * const allChains = getAllChainsForSearch(Environment.Mainnet, supportedChains) + * // Returns both supported chains (with full details) and unsupported chains (minimal details) + */ +export function getAllChainsForSearch(environment: Environment, supportedChains: ChainDetails[]): ChainDetails[] { + // Use Map for O(1) lookup instead of find() which is O(n) + const supportedChainsBySelector = new Map( + supportedChains.map((chain) => [chain.selector, chain]) + ) + const networkType = environment === Environment.Mainnet ? "mainnet" : "testnet" + + // Get all selectors from YAML files for all chain types + const allSelectors = [ + ...getAllSelectors("evm", networkType), + ...getAllSelectors("solana", networkType), + ...getAllSelectors("aptos", networkType), + ...getAllSelectors("sui", networkType), + ...getAllSelectors("canton", networkType), + ...getAllSelectors("ton", networkType), + ...getAllSelectors("tron", networkType), + ...getAllSelectors("stellar", networkType), + ...getAllSelectors("starknet", networkType), + ] + + const result: ChainDetails[] = [] + + for (const entry of allSelectors) { + // Skip entries with missing required data + if (!entry.selector || !entry.chainType) { + continue + } + + const supportedChain = supportedChainsBySelector.get(entry.selector) + + if (supportedChain) { + // Supported chain - use full details with supported: true + result.push({ ...supportedChain, supported: true }) + } else { + // Unsupported chain - minimal details from selector data + // Use explicit chainId check to allow 0 as valid value + const chainFamily = getChainFamilyFromType(entry.chainType) + const internalId = entry.name || `chain-${entry.chainId ?? "unknown"}` + result.push({ + chainId: entry.chainId ?? "", + selector: entry.selector, + internalId, + displayName: deriveDisplayName(internalId), + chainType: entry.chainType, + chainFamily, + supported: false, + feeTokens: [], + router: "", + rmn: "", + }) + } + } + + return result +} diff --git a/src/lib/ccip/services/chain-identifier.ts b/src/lib/ccip/services/chain-identifier.ts new file mode 100644 index 00000000000..7290931a9dc --- /dev/null +++ b/src/lib/ccip/services/chain-identifier.ts @@ -0,0 +1,196 @@ +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.ts" +import { getSelectorEntry } from "@config/data/ccip/selectors.ts" +import { getChainId, getChainTypeAndFamily, directoryToSupportedChain } from "~/features/utils/index.ts" +import { Environment, NamingConvention } from "~/lib/ccip/types/index.ts" +import { logger } from "@lib/logging/index.js" + +/** + * Result of resolving a chain identifier + */ +export interface ResolvedChain { + directoryKey: string // Key in chains.json (for internal data lookups) + selectorName: string // Name in selectors.yml (canonical form) + inputConvention: NamingConvention // Which convention was used in the input +} + +/** + * Service for handling chain identifier resolution and formatting. + * Supports bidirectional mapping between directory keys and selector names. + * + * This enables the API to: + * 1. Accept both naming conventions as input + * 2. Mirror the user's chosen convention in responses + * 3. Maintain backward compatibility (default to selector names) + */ +export class ChainIdentifierService { + private directoryToSelector: Map = new Map() + private selectorToDirectory: Map = new Map() + private directoryKeys: Set = new Set() + private readonly requestId: string + + constructor( + private readonly environment: Environment, + private readonly defaultConvention: NamingConvention = "selector" + ) { + this.requestId = crypto.randomUUID() + this.buildMappings() + } + + /** + * Build bidirectional mappings between directory keys and selector names + */ + private buildMappings(): void { + const { chainsReferenceData } = loadReferenceData({ + environment: this.environment, + version: Version.V1_2_0, + }) + + for (const [directoryKey] of Object.entries(chainsReferenceData as Record)) { + this.directoryKeys.add(directoryKey) + + try { + // Get chain ID and type to look up the selector entry + const supportedChain = directoryToSupportedChain(directoryKey) + const chainId = getChainId(supportedChain) + const { chainType } = getChainTypeAndFamily(supportedChain) + + if (chainId) { + const selectorEntry = getSelectorEntry(chainId, chainType) + if (selectorEntry?.name) { + const selectorName = selectorEntry.name + + // Only add mapping if names are different + if (selectorName !== directoryKey) { + this.directoryToSelector.set(directoryKey, selectorName) + this.selectorToDirectory.set(selectorName, directoryKey) + } + } + } + } catch { + // Skip chains that can't be resolved + logger.debug({ + message: "Could not resolve chain for mapping", + requestId: this.requestId, + directoryKey, + }) + } + } + + logger.debug({ + message: "Chain identifier mappings built", + requestId: this.requestId, + mappingCount: this.directoryToSelector.size, + directoryKeyCount: this.directoryKeys.size, + }) + } + + /** + * Check if an identifier is a directory key (chains.json key) + */ + isDirectoryKey(identifier: string): boolean { + return this.directoryKeys.has(identifier) + } + + /** + * Check if an identifier is a selector name (selectors.yml name) + */ + isSelectorName(identifier: string): boolean { + // It's a selector name if: + // 1. It maps to a directory key, OR + // 2. It's a directory key that has no different selector name (they're the same) + return this.selectorToDirectory.has(identifier) || this.directoryKeys.has(identifier) + } + + /** + * Resolve a chain identifier to both directory key and selector name. + * Detects which convention was used in the input. + * + * @param identifier - Chain identifier (directory key or selector name) + * @returns Resolved chain info or null if not found + */ + resolve(identifier: string): ResolvedChain | null { + // Check if it's a directory key + if (this.directoryKeys.has(identifier)) { + const selectorName = this.directoryToSelector.get(identifier) ?? identifier + return { + directoryKey: identifier, + selectorName, + inputConvention: "directory", + } + } + + // Check if it's a selector name that maps to a directory key + if (this.selectorToDirectory.has(identifier)) { + const directoryKey = this.selectorToDirectory.get(identifier)! + return { + directoryKey, + selectorName: identifier, + inputConvention: "selector", + } + } + + // Not found + return null + } + + /** + * Format a directory key using the specified naming convention. + * + * @param directoryKey - The chains.json key + * @param convention - Which format to output + * @returns Formatted identifier + */ + format(directoryKey: string, convention: NamingConvention): string { + if (convention === "directory") { + return directoryKey + } + + // Return selector name, or directory key if no mapping exists + return this.directoryToSelector.get(directoryKey) ?? directoryKey + } + + /** + * Detect the naming convention from a list of identifiers. + * Returns the convention of the first resolvable identifier. + * + * @param identifiers - List of identifiers to check + * @returns Detected convention or default + */ + detectConvention(...identifiers: (string | undefined)[]): NamingConvention { + for (const identifier of identifiers) { + if (!identifier) continue + + const resolved = this.resolve(identifier) + if (resolved) { + return resolved.inputConvention + } + } + + return this.defaultConvention + } + + /** + * Get the default naming convention + */ + getDefaultConvention(): NamingConvention { + return this.defaultConvention + } + + /** + * Get the directory key for a given identifier (either format) + * This is useful for internal data lookups + */ + getDirectoryKey(identifier: string): string | null { + const resolved = this.resolve(identifier) + return resolved?.directoryKey ?? null + } + + /** + * Get the selector name for a given identifier (either format) + */ + getSelectorName(identifier: string): string | null { + const resolved = this.resolve(identifier) + return resolved?.selectorName ?? null + } +} diff --git a/src/lib/ccip/services/chain-search.ts b/src/lib/ccip/services/chain-search.ts new file mode 100644 index 00000000000..b7019780768 --- /dev/null +++ b/src/lib/ccip/services/chain-search.ts @@ -0,0 +1,220 @@ +import Fuse, { type IFuseOptions } from "fuse.js" +import type { ChainDetails, ChainFamily, SearchType } from "~/lib/ccip/types/index.ts" +import { CCIPError } from "~/lib/ccip/utils.ts" +import { logger } from "@lib/logging/index.js" + +export const prerender = false + +// Fuse.js configuration for fuzzy search +const FUSE_OPTIONS: IFuseOptions = { + keys: [ + { name: "displayName", weight: 0.4 }, + { name: "internalId", weight: 0.25 }, + { name: "chainFamily", weight: 0.2 }, + { name: "chainId", weight: 0.15 }, + ], + threshold: 0.3, // Stricter matching - 0.4 was too relaxed + ignoreLocation: true, + minMatchCharLength: 2, +} + +// Cache for search indexes to avoid O(n) operations on every search +// Includes Fuse.js instance and Map-based lookups for O(1) exact matches +interface SearchCache { + key: string + fuse: Fuse + selectorMap: Map + internalIdMap: Map + chainIdMap: Map // chainId can have duplicates across chains +} + +let searchCache: SearchCache | null = null + +/** + * Generates a cache key based on chain data. + * Uses chain count, first/middle/last selectors, and a checksum to detect when data changes. + */ +function generateCacheKey(chains: ChainDetails[]): string { + if (chains.length === 0) return "empty" + const firstSelector = chains[0]?.selector ?? "" + const lastSelector = chains[chains.length - 1]?.selector ?? "" + const midIndex = Math.floor(chains.length / 2) + const midSelector = chains[midIndex]?.selector ?? "" + + // Create a simple checksum of all selectors to detect middle changes + let checksum = 0 + for (const chain of chains) { + const selector = chain.selector || "" + for (let i = 0; i < selector.length; i++) { + checksum = (checksum + selector.charCodeAt(i)) % 1000000 + } + } + + return `${chains.length}:${firstSelector}:${midSelector}:${lastSelector}:${checksum}` +} + +/** + * Builds search indexes for the given chains. + * Creates Fuse.js instance and Map-based lookups. + */ +function buildSearchIndexes(chains: ChainDetails[]): SearchCache { + const selectorMap = new Map() + const internalIdMap = new Map() + const chainIdMap = new Map() + + for (const chain of chains) { + if (chain.selector) { + selectorMap.set(chain.selector, chain) + } + if (chain.internalId) { + internalIdMap.set(chain.internalId.toLowerCase(), chain) + } + // chainId can have duplicates, so store as array + const chainIdStr = String(chain.chainId) + const existing = chainIdMap.get(chainIdStr) || [] + existing.push(chain) + chainIdMap.set(chainIdStr, existing) + } + + return { + key: generateCacheKey(chains), + fuse: new Fuse(chains, FUSE_OPTIONS), + selectorMap, + internalIdMap, + chainIdMap, + } +} + +/** + * Gets or creates cached search indexes for the given chains. + * Reuses existing cache if the chain data hasn't changed. + */ +function getSearchIndexes(chains: ChainDetails[]): SearchCache { + const cacheKey = generateCacheKey(chains) + + if (searchCache && searchCache.key === cacheKey) { + logger.debug({ + message: "Using cached search indexes", + cacheKey, + }) + return searchCache + } + + logger.debug({ + message: "Building new search indexes", + cacheKey, + chainCount: chains.length, + }) + + searchCache = buildSearchIndexes(chains) + return searchCache +} + +/** + * Checks if a query looks like a selector (18-20 digit number). + * Selectors are always large numeric strings. + */ +function isLikelySelector(query: string): boolean { + const candidate = query.replace(/n$/, "") // Remove trailing 'n' for BigInt literals + return /^\d+$/.test(candidate) && candidate.length > 17 +} + +/** + * Executes search on chains with automatic query type detection. + * + * Detection strategy (in order): + * 1. Check if query matches a selector in the map + * 2. Check if query matches a chainId in the map (handles all formats: numeric, negative, hex, strings) + * 3. Check if query matches an internalId in the map + * 4. Fall back to fuzzy search on displayName + * + * This approach is simpler and automatically handles all chainId formats across chain families. + * + * @param query - Search query string + * @param chains - Array of chain details to search + * @param familyFilter - Optional chain family filter + * @returns Search results and detected search type + * @throws CCIPError if query is too short for fuzzy search + */ +export function searchChains( + query: string, + chains: ChainDetails[], + familyFilter?: ChainFamily | null +): { results: ChainDetails[]; searchType: SearchType } { + const trimmed = query.trim() + + if (trimmed.length < 2) { + throw new CCIPError(400, "Search query must be at least 2 characters.") + } + + const indexes = getSearchIndexes(chains) + let results: ChainDetails[] + let searchType: SearchType + + // 1. Check if it's a selector (large numeric string > 17 digits) + const selectorCandidate = trimmed.replace(/n$/, "") + if (isLikelySelector(trimmed) && indexes.selectorMap.has(selectorCandidate)) { + const chain = indexes.selectorMap.get(selectorCandidate)! + results = [chain] + searchType = "selector" + logger.debug({ + message: "Search matched selector", + query: trimmed, + type: "selector", + }) + } + // 2. Check if query exists as a chainId (handles all formats automatically) + else if (indexes.chainIdMap.has(trimmed)) { + results = indexes.chainIdMap.get(trimmed) || [] + searchType = "chainId" + logger.debug({ + message: "Search matched chainId", + query: trimmed, + type: "chainId", + }) + } + // 3. Check if query exists as an internalId (case-insensitive) + else if (indexes.internalIdMap.has(trimmed.toLowerCase())) { + const chain = indexes.internalIdMap.get(trimmed.toLowerCase())! + results = [chain] + searchType = "internalId" + logger.debug({ + message: "Search matched internalId", + query: trimmed, + type: "internalId", + }) + } + // 4. Fall back to fuzzy search + else { + results = indexes.fuse.search(trimmed).map((r) => r.item) + searchType = "displayName" + logger.debug({ + message: "Search using fuzzy match", + query: trimmed, + type: "displayName", + resultCount: results.length, + }) + } + + // Apply family filter if specified + if (familyFilter) { + results = results.filter((c) => c.chainFamily === familyFilter) + logger.debug({ + message: "Applied family filter", + family: familyFilter, + filteredCount: results.length, + }) + } + + return { results, searchType } +} + +/** + * Clears the search cache. Call this if chain data changes. + */ +export function clearSearchCache(): void { + searchCache = null + logger.debug({ + message: "Search cache cleared", + }) +} 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..9fd0b1b8f1b --- /dev/null +++ b/src/lib/ccip/services/lane-data.ts @@ -0,0 +1,791 @@ +import { + Environment, + LaneDetails, + LaneFilterType, + LaneConfigError, + LaneServiceResponse, + LaneDetailServiceResponse, + LaneDetailWithRateLimits, + SupportedTokensServiceResponse, + ChainInfo, + ChainInfoInternal, + OutputKeyType, + ChainType, + ChainFamily, + LaneInputKeyType, + TokenLaneData, +} 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 { getSelectorEntry } from "@config/data/ccip/selectors.ts" + +import { fetchAllTokensForLane } from "~/lib/ccip/graphql/services/enrichment-data-service.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 + } + + // Resolve internalId from the selector YAML name (consistent with chains and tokens endpoints) + // Falls back to the RDD directory key if the selector entry is not found + const selectorEntry = getSelectorEntry(chainId, chainType) + const internalId = selectorEntry?.name ?? chainKey + + return { + chainId, + displayName, + selector, + internalId, + 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 propertyMap: Record = { + chainId: "chainId", + selector: "selector", + internalId: "internalId", + } + const propertyName = propertyMap[filterType] + const chainValue = chain[propertyName].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 propertyMap: Record = { + chainId: "chainId", + selector: "selector", + internalId: "internalId", + } + const propertyName = propertyMap[outputKey] + + const sourceKey = + outputKey === "chainId" + ? generateChainKey(sourceChain.chainId, sourceChain.chainType, outputKey) + : sourceChain[propertyName].toString() + + const destKey = + outputKey === "chainId" + ? 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 = await 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 } + } + } + + /** + * Builds a mapping from selector names (e.g., "ethereum-mainnet") to chains.json keys (e.g., "mainnet") + * This enables the API to accept both naming conventions. + * + * @param chainsReferenceData - Chain configuration data + * @returns Map of selector name → chains.json key + */ + private buildSelectorNameToChainKeyMap(chainsReferenceData: Record): Map { + const map = new Map() + + for (const [chainKey] of Object.entries(chainsReferenceData)) { + try { + // Get the chain ID and type to look up the selector entry + const supportedChain = directoryToSupportedChain(chainKey) + const chainId = getChainId(supportedChain) + const { chainType } = getChainTypeAndFamily(supportedChain) + + if (chainId) { + const selectorEntry = getSelectorEntry(chainId, chainType) + if (selectorEntry?.name && selectorEntry.name !== chainKey) { + // Map selector name to chains.json key + map.set(selectorEntry.name, chainKey) + } + } + } catch { + // Skip chains that can't be resolved + } + } + + return map + } + + /** + * Resolves a chain identifier to its internal ID (chains.json key) + * + * Accepts both: + * - chains.json keys (e.g., "mainnet", "bsc-mainnet") + * - selector names (e.g., "ethereum-mainnet", "binance_smart_chain-mainnet") + * + * @param identifier - Chain identifier (chainId, selector, or internalId) + * @param inputKeyType - Type of identifier + * @param chainsReferenceData - Chain configuration data + * @returns Internal ID (chains.json key) or null if not found + */ + resolveToInternalId( + identifier: string, + inputKeyType: LaneInputKeyType, + chainsReferenceData: Record + ): string | null { + // If already an internal_id, check both chains.json key and selector name + if (inputKeyType === "internalId") { + // First, try direct lookup in chains.json keys + if (chainsReferenceData[identifier]) { + return identifier + } + + // If not found, check if identifier is a selector name and map to chains.json key + const selectorNameMap = this.buildSelectorNameToChainKeyMap(chainsReferenceData) + const chainKey = selectorNameMap.get(identifier) + if (chainKey && chainsReferenceData[chainKey]) { + return chainKey + } + + return null + } + + // Search through chains to find matching chain_id or selector + if (inputKeyType === "chainId") { + // Collect all matching chains (chainId can have collisions across chain families) + const matches: Array<{ internalId: string; chainType: ChainType; chainFamily: ChainFamily }> = [] + + for (const [internalId] of Object.entries(chainsReferenceData)) { + try { + const supportedChain = directoryToSupportedChain(internalId) + const chainId = getChainId(supportedChain) + if (chainId && chainId.toString() === identifier) { + const { chainType, chainFamily } = getChainTypeAndFamily(supportedChain) + matches.push({ internalId, chainType, chainFamily }) + } + } catch { + // Skip chains that can't be resolved + } + } + + if (matches.length === 0) { + return null + } + + // Prioritize EVM chains since by-chain-id is typically used for EVM chain IDs + const evmMatch = matches.find((m) => m.chainFamily === "evm") + if (evmMatch) { + return evmMatch.internalId + } + + // Fall back to first match if no EVM chain found + return matches[0].internalId + } + + // For selector, there should be no collisions + for (const [internalId, chainConfig] of Object.entries(chainsReferenceData)) { + if (inputKeyType === "selector") { + if (chainConfig.chainSelector === identifier) { + return internalId + } + } + } + + return null + } + + /** + * Builds lane details with rate limits included in supportedTokens + */ + private async buildLaneDetailsWithRateLimits( + sourceChain: ChainInfoInternal, + destChain: ChainInfoInternal, + laneConfig: LaneConfig, + sourceInternalId: string, + destinationInternalId: string, + environment: Environment + ): Promise { + // 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, + } + + // Fetch all tokens for the lane in a single batch GraphQL call + const laneTokens = await fetchAllTokensForLane(environment, sourceInternalId, destinationInternalId) + const supportedTokensWithRateLimits: Record = {} + + for (const laneToken of laneTokens) { + supportedTokensWithRateLimits[laneToken.tokenSymbol] = { + rateLimits: laneToken.rateLimits + ? { standard: laneToken.rateLimits.standard, custom: laneToken.rateLimits.custom } + : { standard: null, custom: null }, + fees: null, + tokenAddress: laneToken.tokenAddress, + tokenDecimals: laneToken.tokenDecimals, + sourcePoolType: laneToken.sourcePoolType, + destPoolType: laneToken.destPoolType, + } + } + + 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 } + } + + // Fetch all tokens for the lane in a single batch GraphQL call + const laneTokens = await fetchAllTokensForLane(environment, sourceInternalId, destinationInternalId) + const supportedTokensWithRateLimits: Record = {} + + for (const laneToken of laneTokens) { + supportedTokensWithRateLimits[laneToken.tokenSymbol] = { + rateLimits: laneToken.rateLimits + ? { standard: laneToken.rateLimits.standard, custom: laneToken.rateLimits.custom } + : { standard: null, custom: null }, + fees: null, + tokenAddress: laneToken.tokenAddress, + tokenDecimals: laneToken.tokenDecimals, + sourcePoolType: laneToken.sourcePoolType, + destPoolType: laneToken.destPoolType, + } + } + + 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..217a1c44670 --- /dev/null +++ b/src/lib/ccip/services/rate-limits-data.ts @@ -0,0 +1,320 @@ +import { + Environment, + RateLimitsFilterType, + RateLimitsServiceResponse, + TokenLaneData, + RawTokenRateLimits, + 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 { fetchLaneRateLimits } from "~/lib/ccip/graphql/services/enrichment-data-service.ts" + +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 reference data to resolve chain identifiers + const { chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve chain identifiers to chains.json keys (handles both short names and selector names) + const laneDataService = new LaneDataService() + const resolvedSourceId = + laneDataService.resolveToInternalId( + filters.sourceInternalId, + "internalId", + chainsReferenceData as Record + ) || filters.sourceInternalId + const resolvedDestId = + laneDataService.resolveToInternalId( + filters.destinationInternalId, + "internalId", + chainsReferenceData as Record + ) || filters.destinationInternalId + + // Create resolved filters + const resolvedFilters: RateLimitsFilterType = { + ...filters, + sourceInternalId: resolvedSourceId, + destinationInternalId: resolvedDestId, + } + + // Get token list: from filter or from all tokens in reference data + const { tokensReferenceData } = loadReferenceData({ environment, version: Version.V1_2_0 }) + const tokenFilter = resolvedFilters.tokens + ? resolvedFilters.tokens + .split(",") + .map((t: string) => t.trim()) + .filter((t: string) => t.length > 0) + : Object.keys(tokensReferenceData) + + // Fetch rate limits per token from GraphQL + const result: Record = {} + for (const tokenSymbol of tokenFilter) { + const laneRateLimits = await fetchLaneRateLimits( + environment, + tokenSymbol, + resolvedFilters.sourceInternalId, + resolvedFilters.destinationInternalId + ) + if (laneRateLimits) { + const filteredLimits = this.applyFilters(laneRateLimits, resolvedFilters.direction, resolvedFilters.rateType) + if (filteredLimits) { + result[tokenSymbol] = filteredLimits + } + } + } + + 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 + } + } + + /** + * 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: RawTokenRateLimits, + direction?: "in" | "out", + rateType?: "standard" | "custom" + ): TokenLaneData | null { + const filteredStandard = this.applyDirectionFilter(rateLimits.standard, direction) + const filteredCustom = this.applyDirectionFilter(rateLimits.custom, direction) + const fees = rateLimits.fees ?? null + + if (rateType === "standard") { + if (!filteredStandard) { + return null + } + return { + rateLimits: { standard: filteredStandard, custom: null }, + fees, + } + } + + if (rateType === "custom") { + if (!filteredCustom) { + return null + } + return { + rateLimits: { standard: null, custom: filteredCustom }, + fees, + } + } + + if (!filteredStandard && !filteredCustom) { + return null + } + + return { + rateLimits: { + standard: filteredStandard ?? null, + custom: filteredCustom ?? null, + }, + fees, + } + } + + /** + * 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..5a68a2b26f5 --- /dev/null +++ b/src/lib/ccip/services/realtime-data.ts @@ -0,0 +1,313 @@ +import { Environment } from "~/lib/ccip/types/index.ts" +import type { + TokenRateLimits, + TokenLaneData, + RateLimiterEntry, + RateLimiterConfig, + CustomFinalityConfig, + OutputKeyType, + TokenDirectoryApiResponse, +} 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}&internalIdFormat=directory` + + 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 full token directory data for a specific token and chain. + * Returns outboundLanes + inboundLanes with rate limits, verifiers, pool info, + * and custom finality in a single call — covers both drawer tabs at once. + * + * @param tokenCanonicalSymbol - Token canonical symbol (e.g., "LINK") + * @param chain - Source chain directory key (e.g., "mainnet", "bsc-mainnet") + * @param environment - Network environment (mainnet/testnet) + * @returns Full token directory data or null on error + */ + async getTokenDirectoryData( + tokenCanonicalSymbol: string, + chain: string, + environment: Environment + ): Promise { + try { + const baseUrl = getApiBaseUrl() + const url = `${baseUrl}/api/ccip/v1/tokens/${encodeURIComponent(tokenCanonicalSymbol)}/chains/${encodeURIComponent(chain)}?environment=${environment}&internalIdFormat=directory` + + const response = await fetch(url) + + if (!response.ok) { + console.error("Failed to fetch token directory data:", response.status) + return null + } + + return await response.json() + } catch (error) { + console.error("Error fetching token directory data:", error) + return null + } + } + + /** + * Fetches token finality details across all chains. + * Uses /tokens/{symbol} which already returns customFinality per chain, + * then extracts only the finality fields to match TokenFinalityResponse shape. + * + * @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}?environment=${environment}&internalIdFormat=directory` + + if (outputKey) { + url += `&outputKey=${outputKey}` + } + + const response = await fetch(url) + + if (!response.ok) { + console.error("Failed to fetch token data for finality:", response.status) + return null + } + + const tokenDetail = await response.json() + + // Extract customFinality per chain from the full token detail response + const finalityData: Record = {} + for (const [chainKey, chainData] of Object.entries(tokenDetail.data ?? {})) { + const cd = chainData as { customFinality?: CustomFinalityConfig | null } + if (cd.customFinality !== undefined) { + finalityData[chainKey] = cd.customFinality ?? { hasCustomFinality: null, minBlockConfirmation: null } + } + } + + return { + metadata: { + ...tokenDetail.metadata, + tokenSymbol: tokenCanonicalSymbol, + chainCount: Object.keys(finalityData).length, + }, + data: finalityData, + } + } 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 51% rename from src/pages/api/services/token-data.ts rename to src/lib/ccip/services/token-data.ts index d72dca0b9eb..ba8253e0edf 100644 --- a/src/pages/api/services/token-data.ts +++ b/src/lib/ccip/services/token-data.ts @@ -6,15 +6,31 @@ import { TokenChainData, TokenDataResponse, TokenServiceResponse, -} from "../ccip/types/index.ts" + TokenDetailChainData, + TokenDetailDataResponse, + TokenDetailServiceResponse, + CCVConfigData, + CCVConfig, + CustomFinalityConfig, +} 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 { getEffectivePoolVersion, shouldEnableCCVFeatures } from "~/lib/ccip/utils/pool-version.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 { + fetchPoolDataForTokenAllChains, + fetchAllPoolData, + fetchMinBlockConfirmations, + stubCCVConfigData, + type AllPoolData, + type PoolData, +} from "~/lib/ccip/graphql/services/enrichment-data-service.ts" + export const prerender = false /** @@ -49,7 +65,8 @@ export class TokenDataService { private async processTokenData( environment: Environment, tokenCanonicalId: string, - outputKey: OutputKeyType + outputKey: OutputKeyType, + prefetchedPoolData?: AllPoolData ): Promise<{ [chainKey: string]: TokenChainData } | null> { logger.debug({ message: "Processing token data", @@ -90,6 +107,11 @@ export class TokenDataService { return null } + // Use pre-fetched pool data if available, otherwise fetch for this token + const tokenPoolData = prefetchedPoolData + ? prefetchedPoolData[tokenCanonicalId] || {} + : await fetchPoolDataForTokenAllChains(environment, tokenCanonicalId) + // Create the new structure with chains as keys const result: { [chainKey: string]: TokenChainData } = {} @@ -99,11 +121,12 @@ export class TokenDataService { Object.entries(tokenData).forEach(([chainId, chainData]) => { try { - // Only process chains where poolAddress exists - if (!chainData.poolAddress) { + // Only process chains where pool data exists in GraphQL + const poolInfo = tokenPoolData[chainId] + if (!poolInfo?.address) { this.skippedTokensCount++ logger.warn({ - message: "Chain missing poolAddress - skipping only this chain", + message: "Chain missing pool data from GraphQL - skipping only this chain", requestId: this.requestId, tokenCanonicalId, chainId, @@ -176,8 +199,12 @@ export class TokenDataService { decimals: chainData.decimals, destinations, name: chainData.name || "", - poolAddress: chainData.poolAddress, - poolType: chainData.poolType, + pool: { + address: poolInfo.address, + rawType: poolInfo.rawType, + type: poolInfo.type, + version: poolInfo.version, + }, symbol: chainData.symbol, tokenAddress: chainData.tokenAddress, }, @@ -301,9 +328,12 @@ export class TokenDataService { let processedTokensCount = 0 let validTokensCount = 0 + // Pre-fetch all pool data in one batch query + const allPoolData = await fetchAllPoolData(environment) + // Process each token for (const tokenCanonicalId of tokenCanonicalIds) { - const tokenDetails = await this.processTokenData(environment, tokenCanonicalId, outputKey) + const tokenDetails = await this.processTokenData(environment, tokenCanonicalId, outputKey, allPoolData) if (tokenDetails) { tokens[tokenCanonicalId] = tokenDetails validTokensCount++ @@ -361,4 +391,262 @@ 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 = "chainId" + ): 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 CCV config data for threshold amounts (stubbed — TODO) + const ccvConfigData = this.loadCCVConfigData() + + // Get raw token data with directory keys for reverse lookup + const rawTokenData = this.getRawTokenData(environment, tokenCanonicalSymbol) + + // Get token's CCV config by directory key + const tokenCCVConfig = ccvConfigData[tokenCanonicalSymbol] + + // Merge token data with custom finality and CCV config information + const result: TokenDetailDataResponse = {} + + for (const [chainKey, chainData] of Object.entries(tokenData)) { + // Get directory key for version and config lookups + const directoryKey = rawTokenData ? this.findDirectoryKeyByChainId(rawTokenData, chainData.chainId) : null + + // Check if this pool supports CCV features (v2.0+ only) + const actualPoolVersion = chainData.pool?.version || "" + const isCCVEnabled = directoryKey + ? await shouldEnableCCVFeatures(environment, tokenCanonicalSymbol, directoryKey, actualPoolVersion) + : false + + // Both customFinality and ccvConfig are v2.0+ pool features only + let minBlockConfirmation: number | null = null + let hasCustomFinality: boolean | null = null + let ccvConfig: CCVConfig | null = null + let customFinalityDataAvailable = false + + if (isCCVEnabled && directoryKey) { + // Fetch minBlockConfirmation from GraphQL + minBlockConfirmation = await fetchMinBlockConfirmations(environment, tokenCanonicalSymbol, directoryKey) + customFinalityDataAvailable = true + + // Derive hasCustomFinality from minBlockConfirmation + if (minBlockConfirmation === null) { + hasCustomFinality = null + } else if (minBlockConfirmation > 0) { + hasCustomFinality = true + } else { + hasCustomFinality = false + } + + // Look up CCV config using directory key + // For v2 pools: + // - Entry with thresholdAmount value: configured → {thresholdAmount: "value"} + // - Entry with thresholdAmount null: downstream error → {thresholdAmount: null} + // - No entry: not configured → {thresholdAmount: "0"} + if (tokenCCVConfig && directoryKey && tokenCCVConfig[directoryKey]) { + // Entry exists - use the value (could be a string or null for downstream error) + ccvConfig = { + thresholdAmount: tokenCCVConfig[directoryKey].thresholdAmount, + } + } else { + // No entry for this v2 pool - CCV not configured + ccvConfig = { + thresholdAmount: "0", + } + } + } + + // Build customFinality response: + // - v1 pool (isCCVEnabled=false): null (feature not supported) + // - v2 pool with data: { hasCustomFinality, minBlockConfirmation } + // - v2 pool without data: { hasCustomFinality: null, minBlockConfirmation: null } (downstream error) + let customFinality: CustomFinalityConfig | null = null + if (isCCVEnabled) { + if (customFinalityDataAvailable) { + customFinality = { hasCustomFinality, minBlockConfirmation } + } else { + // v2 pool but no data available - downstream API error + customFinality = { hasCustomFinality: null, minBlockConfirmation: null } + } + } + + const detailChainData: TokenDetailChainData = { + ...chainData, + customFinality, + ccvConfig, + pool: chainData.pool + ? { + address: chainData.pool.address, + rawType: chainData.pool.rawType, + type: chainData.pool.type, + version: directoryKey + ? await getEffectivePoolVersion( + environment, + tokenCanonicalSymbol, + directoryKey, + chainData.pool.version || "" + ) + : chainData.pool.version || "", + advancedPoolHooks: chainData.pool.advancedPoolHooks || null, + supportsV2Features: isCCVEnabled, + } + : null, + } + + 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, + }, + } + } + + // eslint-disable-next-line class-methods-use-this + private loadCCVConfigData(): CCVConfigData { + return stubCCVConfigData() + } + + /** + * Gets raw token data with directory keys (chains.json keys) as keys + * Used for looking up data that uses directory keys (like CCV config) + * Only includes EVM chains to avoid chain ID collisions with non-EVM chains + */ + private getRawTokenData( + environment: Environment, + tokenCanonicalSymbol: string + ): Record | null { + try { + const tokenData = getTokenData({ + environment, + version: Version.V1_2_0, + tokenId: tokenCanonicalSymbol, + }) + + if (!tokenData || Object.keys(tokenData).length === 0) { + return null + } + + // Build a mapping of directory key -> chainId for reverse lookup + // Only include EVM chains to avoid chain ID collisions (e.g., Aptos also has chainId=1) + const result: Record = {} + + for (const [directoryKey] of Object.entries(tokenData)) { + try { + const supportedChain = resolveChainOrThrow(directoryKey) + const { chainType } = getChainTypeAndFamily(supportedChain) + + // Only include EVM chains for reverse lookup + if (chainType !== "evm") { + continue + } + + const numericChainId = getChainId(supportedChain) + if (numericChainId) { + result[directoryKey] = { chainId: numericChainId } + } + } catch { + // Skip chains that can't be resolved + } + } + + return result + } catch { + return null + } + } + + /** + * Finds the directory key for a given numeric chainId + */ + private findDirectoryKeyByChainId( + rawTokenData: Record, + targetChainId: number | string + ): string | null { + const targetNumeric = typeof targetChainId === "string" ? parseInt(targetChainId, 10) : targetChainId + + for (const [directoryKey, data] of Object.entries(rawTokenData)) { + const dataNumeric = typeof data.chainId === "string" ? parseInt(data.chainId, 10) : data.chainId + if (dataNumeric === targetNumeric) { + return directoryKey + } + } + + return null + } + + /** + * 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, + }) + return null + } + } } diff --git a/src/lib/ccip/services/token-directory.ts b/src/lib/ccip/services/token-directory.ts new file mode 100644 index 00000000000..81d954601d7 --- /dev/null +++ b/src/lib/ccip/services/token-directory.ts @@ -0,0 +1,629 @@ +import { + Environment, + TokenDirectoryData, + TokenDirectoryLane, + TokenDirectoryServiceResponse, + CCVConfigData, + CCVChainConfig, + LaneVerifiers, + NamingConvention, + OutputKeyType, + CustomFinalityConfig, +} 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 { logger } from "@lib/logging/index.js" +import { getTokenData } from "@config/data/ccip/data.ts" +import { getChainId, getChainTypeAndFamily, directoryToSupportedChain } from "../../../features/utils/index.ts" +import { getSelectorEntry } from "@config/data/ccip/selectors.ts" +import { ChainIdentifierService } from "./chain-identifier.ts" +import { getEffectivePoolVersion, shouldEnableCCVFeatures } from "~/lib/ccip/utils/pool-version.ts" + +import pLimit from "p-limit" +import { + fetchPoolDataForToken, + fetchLaneRateLimits, + fetchMinBlockConfirmations, + stubCCVConfigData, +} from "~/lib/ccip/graphql/services/enrichment-data-service.ts" + +const GRAPHQL_CONCURRENCY = 10 + +export const prerender = false + +/** + * Service class for handling token directory data operations + * Provides detailed token information including CCV configuration for a specific chain + */ +export class TokenDirectoryService { + private readonly requestId: string + + constructor(requestId?: string) { + this.requestId = requestId ?? crypto.randomUUID() + + logger.debug({ + message: "TokenDirectoryService initialized", + requestId: this.requestId, + }) + } + + /** + * Retrieves detailed token directory data for a specific token and chain + * + * @param environment - Network environment (mainnet/testnet) + * @param tokenSymbol - Token canonical symbol + * @param chainIdentifier - Chain identifier (can be directory key or selector name) + * @param outputKey - Format to use for displaying chain keys + * @param internalIdFormat - Format for internalId values (selector or directory) + * @returns Token directory data or null if not found + */ + async getTokenDirectory( + environment: Environment, + tokenSymbol: string, + chainIdentifier: string, + outputKey: OutputKeyType, + internalIdFormat: NamingConvention + ): Promise { + logger.info({ + message: "Getting token directory data", + requestId: this.requestId, + environment, + tokenSymbol, + chainIdentifier, + outputKey, + internalIdFormat, + }) + + try { + // Load reference data + const { lanesReferenceData, chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Use ChainIdentifierService to resolve the chain identifier + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + const resolved = chainIdService.resolve(chainIdentifier) + + if (!resolved) { + logger.warn({ + message: "Could not resolve chain identifier", + requestId: this.requestId, + chainIdentifier, + }) + return { data: null } + } + + const directoryKey = resolved.directoryKey + + // Check if chain exists in reference data + const chainConfig = chainsReferenceData[directoryKey] as ChainConfig | undefined + if (!chainConfig) { + logger.warn({ + message: "Chain not found in reference data", + requestId: this.requestId, + directoryKey, + }) + return { data: null } + } + + // Get token data for this chain + const tokenData = getTokenData({ + environment, + version: Version.V1_2_0, + tokenId: tokenSymbol, + }) + + if (!tokenData) { + logger.warn({ + message: "Token not found", + requestId: this.requestId, + tokenSymbol, + }) + return { data: null } + } + + // Find token data for the specific chain + // tokenData keys are directory keys (e.g., "mainnet", "arbitrum-mainnet") + const chainTokenData = tokenData[directoryKey] + + if (!chainTokenData) { + logger.warn({ + message: "Token not found on specified chain", + requestId: this.requestId, + tokenSymbol, + chainIdentifier: directoryKey, + }) + return { data: null } + } + + // Fetch pool data from GraphQL + const poolInfo = await fetchPoolDataForToken(environment, tokenSymbol, directoryKey) + + if (!poolInfo?.address) { + logger.warn({ + message: "Pool data not found for token on chain", + requestId: this.requestId, + tokenSymbol, + chainIdentifier: directoryKey, + }) + return { data: null } + } + + // Get selector name for later use + const selectorName = resolved.selectorName + + // Get chain info + const chainInfo = this.resolveChainInfo(directoryKey, chainConfig) + if (!chainInfo) { + return { data: null } + } + + // Check if this pool supports CCV features (v2.0+ only) + const actualPoolVersion = poolInfo.version || "" + const isCCVEnabled = await shouldEnableCCVFeatures(environment, tokenSymbol, directoryKey, actualPoolVersion) + + // Load CCV config (only used for v2.0+ pools) + const ccvConfigData = this.loadCCVConfigData() + const ccvConfig = isCCVEnabled ? ccvConfigData[tokenSymbol]?.[directoryKey] || null : null + + // Get outbound lanes (from this chain to others) + const outboundLanes = await this.getOutboundLanes( + environment, + directoryKey, + selectorName, + tokenSymbol, + lanesReferenceData, + chainsReferenceData as Record, + ccvConfig, + outputKey, + internalIdFormat, + chainIdService, + isCCVEnabled + ) + + // Get inbound lanes (from others to this chain) + const inboundLanes = await this.getInboundLanes( + environment, + directoryKey, + selectorName, + tokenSymbol, + lanesReferenceData, + chainsReferenceData as Record, + ccvConfig, + outputKey, + internalIdFormat, + chainIdService, + isCCVEnabled + ) + + // Format output based on outputKey and internalIdFormat + const formattedInternalId = chainIdService.format(directoryKey, internalIdFormat) + + // Build custom finality config (v2.0+ pools only) + let customFinality: CustomFinalityConfig | null = null + if (isCCVEnabled) { + const minBlockConfirmation = await fetchMinBlockConfirmations(environment, tokenSymbol, directoryKey) + customFinality = this.buildCustomFinalityConfig(minBlockConfirmation) + } + + const data: TokenDirectoryData = { + internalId: formattedInternalId, + chainId: chainInfo.chainId, + selector: chainInfo.selector, + token: { + address: chainTokenData.tokenAddress, + decimals: chainTokenData.decimals, + }, + pool: { + address: poolInfo.address, + rawType: poolInfo.rawType, + type: poolInfo.type, + version: await getEffectivePoolVersion(environment, tokenSymbol, directoryKey, poolInfo.version || ""), + advancedPoolHooks: null, + supportsV2Features: isCCVEnabled, + }, + // ccvConfig handling: + // - v1.x pool (isCCVEnabled=false): null (feature not supported) + // - v2.x pool with config entry: {thresholdAmount: value} (could be null for downstream error) + // - v2.x pool without config entry: {thresholdAmount: "0"} (not configured) + ccvConfig: isCCVEnabled + ? ccvConfig + ? { thresholdAmount: ccvConfig.thresholdAmount } + : { thresholdAmount: "0" } + : null, + customFinality, + outboundLanes, + inboundLanes, + } + + logger.info({ + message: "Token directory data retrieved", + requestId: this.requestId, + tokenSymbol, + chainIdentifier: directoryKey, + outboundLaneCount: Object.keys(outboundLanes).length, + inboundLaneCount: Object.keys(inboundLanes).length, + }) + + return { data } + } catch (error) { + logger.error({ + message: "Failed to get token directory data", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + return { data: null } + } + } + + /** + * Resolves chain information from chain key and config + */ + private resolveChainInfo( + chainKey: string, + chainConfig: ChainConfig + ): { chainId: number | string; selector: string } | null { + try { + let chainId: number | string = chainKey + + try { + const supportedChain = directoryToSupportedChain(chainKey) + const resolvedChainId = getChainId(supportedChain) + if (resolvedChainId) chainId = resolvedChainId + } catch { + // Use chainKey as fallback + } + + const selector = chainConfig.chainSelector + if (!selector) { + return null + } + + return { chainId, selector } + } catch (error) { + logger.warn({ + message: "Failed to resolve chain info", + requestId: this.requestId, + chainKey, + error: error instanceof Error ? error.message : "Unknown error", + }) + return null + } + } + + /** + * Gets outbound lanes for the token from this chain + */ + private async getOutboundLanes( + environment: Environment, + sourceDirectoryKey: string, + sourceSelectorName: string, + tokenSymbol: string, + lanesReferenceData: Record>, + chainsReferenceData: Record, + ccvConfig: CCVChainConfig | null, + outputKey: OutputKeyType, + internalIdFormat: NamingConvention, + chainIdService: ChainIdentifierService, + isCCVEnabled: boolean + ): Promise> { + const result: Record = {} + + // Get lanes from this source chain + const sourceLanes = lanesReferenceData[sourceDirectoryKey] + if (!sourceLanes) { + return result + } + + // Collect lanes to process, then fetch rate limits concurrently + const lanesToProcess: Array<{ + destDirectoryKey: string + destChainInfo: { chainId: string | number; selector: string } + laneKey: string + verifiers: LaneVerifiers | null + outputLaneKey: string + formattedInternalId: string + }> = [] + + for (const [destDirectoryKey, laneConfig] of Object.entries(sourceLanes)) { + if (!laneConfig.supportedTokens?.includes(tokenSymbol)) continue + + const destChainConfig = chainsReferenceData[destDirectoryKey] + if (!destChainConfig) continue + + const destChainInfo = this.resolveChainInfo(destDirectoryKey, destChainConfig) + if (!destChainInfo) continue + + const destResolved = chainIdService.resolve(destDirectoryKey) + const destSelectorName = destResolved?.selectorName || destDirectoryKey + const laneKey = this.buildLaneSelectorKey(sourceSelectorName, destSelectorName) + const verifiers = this.getVerifiersForLane(ccvConfig, laneKey, "outbound", isCCVEnabled) + const outputLaneKey = this.formatLaneKey(destDirectoryKey, outputKey, internalIdFormat, chainIdService) + const formattedInternalId = chainIdService.format(destDirectoryKey, internalIdFormat) + + lanesToProcess.push({ destDirectoryKey, destChainInfo, laneKey, verifiers, outputLaneKey, formattedInternalId }) + } + + // Fetch rate limits concurrently with concurrency limit + const limit = pLimit(GRAPHQL_CONCURRENCY) + const laneResults = await Promise.allSettled( + lanesToProcess.map((lane) => + limit(async () => ({ + ...lane, + rateLimits: await fetchLaneRateLimits(environment, tokenSymbol, sourceDirectoryKey, lane.destDirectoryKey), + })) + ) + ) + + for (const settled of laneResults) { + if (settled.status !== "fulfilled") continue + const lane = settled.value + result[lane.outputLaneKey] = { + internalId: lane.formattedInternalId, + chainId: lane.destChainInfo.chainId, + selector: lane.destChainInfo.selector, + rateLimits: { + standard: lane.rateLimits?.standard ?? null, + custom: lane.rateLimits?.custom ?? null, + }, + fees: null, + verifiers: lane.verifiers, + } + } + + return result + } + + /** + * Gets inbound lanes for the token to this chain + */ + private async getInboundLanes( + environment: Environment, + destDirectoryKey: string, + destSelectorName: string, + tokenSymbol: string, + lanesReferenceData: Record>, + chainsReferenceData: Record, + ccvConfig: CCVChainConfig | null, + outputKey: OutputKeyType, + internalIdFormat: NamingConvention, + chainIdService: ChainIdentifierService, + isCCVEnabled: boolean + ): Promise> { + const result: Record = {} + + // Collect inbound lanes to process + const lanesToProcess: Array<{ + sourceDirectoryKey: string + sourceChainInfo: { chainId: string | number; selector: string } + laneKey: string + verifiers: LaneVerifiers | null + outputLaneKey: string + formattedInternalId: string + }> = [] + + for (const [sourceDirectoryKey, sourceLanes] of Object.entries(lanesReferenceData)) { + const laneConfig = sourceLanes[destDirectoryKey] + if (!laneConfig) continue + if (!laneConfig.supportedTokens?.includes(tokenSymbol)) continue + + const sourceChainConfig = chainsReferenceData[sourceDirectoryKey] + if (!sourceChainConfig) continue + + const sourceChainInfo = this.resolveChainInfo(sourceDirectoryKey, sourceChainConfig) + if (!sourceChainInfo) continue + + const sourceResolved = chainIdService.resolve(sourceDirectoryKey) + const sourceSelectorName = sourceResolved?.selectorName || sourceDirectoryKey + const laneKey = this.buildLaneSelectorKey(sourceSelectorName, destSelectorName) + const verifiers = this.getVerifiersForLane(ccvConfig, laneKey, "inbound", isCCVEnabled) + const outputLaneKey = this.formatLaneKey(sourceDirectoryKey, outputKey, internalIdFormat, chainIdService) + const formattedInternalId = chainIdService.format(sourceDirectoryKey, internalIdFormat) + + lanesToProcess.push({ + sourceDirectoryKey, + sourceChainInfo, + laneKey, + verifiers, + outputLaneKey, + formattedInternalId, + }) + } + + // Fetch rate limits concurrently with concurrency limit + const limit = pLimit(GRAPHQL_CONCURRENCY) + const laneResults = await Promise.allSettled( + lanesToProcess.map((lane) => + limit(async () => ({ + ...lane, + rateLimits: await fetchLaneRateLimits(environment, tokenSymbol, lane.sourceDirectoryKey, destDirectoryKey), + })) + ) + ) + + for (const settled of laneResults) { + if (settled.status !== "fulfilled") continue + const lane = settled.value + result[lane.outputLaneKey] = { + internalId: lane.formattedInternalId, + chainId: lane.sourceChainInfo.chainId, + selector: lane.sourceChainInfo.selector, + rateLimits: { + standard: lane.rateLimits?.standard ?? null, + custom: lane.rateLimits?.custom ?? null, + }, + fees: null, + verifiers: lane.verifiers, + } + } + + return result + } + + /** + * Builds a lane key using deterministic format: sourceSelector-to-destSelector. + * Scales to any chain without hardcoded mappings. + * e.g., "ethereum-mainnet-to-arbitrum-mainnet", "ethereum-mainnet-to-base-mainnet" + */ + private buildLaneSelectorKey(sourceSelectorName: string, destSelectorName: string): string { + return `${sourceSelectorName}-to-${destSelectorName}` + } + + /** + * Gets verifiers for a specific lane from CCV config. + * Returns pre-computed verifier sets: + * - belowThreshold: Verifiers used when transfer amount is below the threshold + * - aboveThreshold: All verifiers used when transfer amount is at or above the threshold + * (belowThreshold + additional threshold verifiers) + * Threshold verifiers are only included for v2.0+ pools (when isCCVEnabled is true). + * + * Return value semantics: + * - null: v1.x pool (feature not supported) + * - {belowThreshold: [], aboveThreshold: []}: v2.x pool, no verifiers configured for this lane + * - {belowThreshold: [...], aboveThreshold: [...]}: v2.x pool, verifiers configured + * - {belowThreshold: null, aboveThreshold: null}: v2.x pool, downstream API error + */ + private getVerifiersForLane( + ccvConfig: CCVChainConfig | null, + laneKey: string, + direction: "outbound" | "inbound", + isCCVEnabled: boolean + ): LaneVerifiers | null { + // For v1.x pools (CCV not enabled), verifiers don't exist - return null + if (!isCCVEnabled) { + return null + } + + // For v2.x pools, CCV config should exist + if (!ccvConfig) { + return { belowThreshold: [], aboveThreshold: [] } + } + + const ccvs = direction === "outbound" ? ccvConfig.outboundCCVs : ccvConfig.inboundCCVs + if (!ccvs) { + return { belowThreshold: [], aboveThreshold: [] } + } + + const thresholdAmount = ccvConfig.thresholdAmount ?? "0" + + // Exact lookup only (no fuzzy matching) + const laneVerifiers = ccvs[laneKey] + if (laneVerifiers) { + return this.buildVerifiersResponse(laneVerifiers.base, laneVerifiers.threshold, thresholdAmount) + } + + return { belowThreshold: [], aboveThreshold: [] } + } + + /** + * Builds the verifiers response from base and threshold arrays. + * Handles downstream API error case when arrays are null. + * When thresholdAmount is "0" (threshold disabled pool-wide), aboveThreshold equals belowThreshold + * because the contract never adds threshold verifiers (AdvancedPoolHooks._resolveRequiredCCVs). + */ + private buildVerifiersResponse( + baseVerifiers: string[] | null, + thresholdVerifiers: string[] | null, + thresholdAmount: string + ): LaneVerifiers { + // If either base or threshold is null, it indicates a downstream API error + if (baseVerifiers === null || thresholdVerifiers === null) { + return { belowThreshold: null, aboveThreshold: null } + } + + const belowThreshold = baseVerifiers + const aboveThreshold = thresholdAmount === "0" ? baseVerifiers : [...baseVerifiers, ...thresholdVerifiers] + + return { belowThreshold, aboveThreshold } + } + + /** + * Formats a lane key based on output format + */ + private formatLaneKey( + directoryKey: string, + outputKey: OutputKeyType, + internalIdFormat: NamingConvention, + chainIdService: ChainIdentifierService + ): string { + if (outputKey === "chainId") { + try { + const supportedChain = directoryToSupportedChain(directoryKey) + const chainId = getChainId(supportedChain) + const { chainType } = getChainTypeAndFamily(supportedChain) + if (chainId) { + return chainType === "evm" ? chainId.toString() : `${chainType}:${chainId}` + } + } catch { + // Fall through to default + } + return directoryKey + } + + if (outputKey === "selector") { + const resolved = chainIdService.resolve(directoryKey) + if (resolved) { + try { + const supportedChain = directoryToSupportedChain(directoryKey) + const chainId = getChainId(supportedChain) + const { chainType } = getChainTypeAndFamily(supportedChain) + if (chainId) { + const selectorEntry = getSelectorEntry(chainId, chainType) + if (selectorEntry) { + return selectorEntry.selector + } + } + } catch { + // Fall through + } + } + return directoryKey + } + + // outputKey === "internalId" + return chainIdService.format(directoryKey, internalIdFormat) + } + + /** + * Loads CCV config data (stubbed — not yet available in GraphQL) + */ + + private loadCCVConfigData(): CCVConfigData { + return stubCCVConfigData() + } + + /** + * Builds custom finality configuration from minBlockConfirmation value + * + * @param minBlockConfirmation - The minimum block confirmation value, or null/undefined if unavailable + * @returns CustomFinalityConfig object with hasCustomFinality and minBlockConfirmation + */ + private buildCustomFinalityConfig(minBlockConfirmation: number | null | undefined): CustomFinalityConfig | null { + // If minBlockConfirmation is undefined, we don't have rate limits data for this token/chain + if (minBlockConfirmation === undefined) { + return null + } + + // If minBlockConfirmation is null, there was an issue with downstream API + if (minBlockConfirmation === null) { + return { + hasCustomFinality: null, + minBlockConfirmation: null, + } + } + + // hasCustomFinality is true if minBlockConfirmation > 0 + return { + hasCustomFinality: minBlockConfirmation > 0, + minBlockConfirmation, + } + } + + /** + * Gets the request ID for this service instance + */ + getRequestId(): string { + return this.requestId + } +} 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..9b77d7b91b7 --- /dev/null +++ b/src/lib/ccip/types/index.ts @@ -0,0 +1,706 @@ +// Chain Data API Types + +import { Environment } from "@config/data/ccip/types.ts" +import type { ChainType, ChainFamily } from "@config/types.ts" + +export { Environment } +export type { ChainType, ChainFamily } + +export const prerender = false + +// Naming convention for chain identifiers +// - 'directory': chains.json keys (e.g., "mainnet", "bsc-mainnet") +// - 'selector': selectors.yml names (e.g., "ethereum-mainnet", "binance_smart_chain-mainnet") +export type NamingConvention = "directory" | "selector" + +// Search types +export type SearchType = "selector" | "chainId" | "internalId" | "displayName" + +export interface SearchDetectionResult { + type: SearchType + normalizedQuery: string +} + +/** + * 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 + validChainCount: number + searchQuery?: string + searchType?: SearchType +} + +export interface ChainDetails { + chainId: number | string + displayName: string + selector: string + internalId: string + feeTokens: string[] | FeeTokenEnriched[] + router: string + rmn: string + chainType: ChainType + chainFamily: ChainFamily + supported: boolean + 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 TokenPool = { + address: string + rawType: string + type: string + version: string + advancedPoolHooks?: string | null +} + +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 +} + +/** + * CCV (Cross-Chain Verifier) configuration for a pool + * Only present for v2.0+ pools (check pool.supportsV2Features) + * For v1.x pools, the entire ccvConfig field is null + * + * Values for thresholdAmount: + * - "0": CCV not configured for this v2 pool + * - "N" (positive number string): CCV configured with threshold N + * - null: downstream API error fetching CCV config + */ +export interface CCVConfig { + thresholdAmount: string | null +} + +// Token Detail API Types (for /tokens/{tokenCanonicalSymbol} endpoint) + +/** + * Custom finality configuration (reused across token endpoints) + */ +export interface CustomFinalityConfig { + /** Whether custom finality is enabled (derived from minBlockConfirmation > 0) */ + hasCustomFinality: boolean | null + /** Minimum block confirmations required, null if unavailable */ + minBlockConfirmation: number | null +} + +/** + * Extended token chain data with custom finality and CCV information + */ +export interface TokenDetailChainData extends Omit { + /** Custom finality configuration for the token on this chain + * - null: v1 pool (feature not supported) + * - {hasCustomFinality: null, minBlockConfirmation: null}: v2 pool, downstream API error + * - {hasCustomFinality: false, minBlockConfirmation: 0}: v2 pool, feature not used + * - {hasCustomFinality: true, minBlockConfirmation: N}: v2 pool, feature enabled + */ + customFinality: CustomFinalityConfig | null + /** CCV (Cross-Chain Verifier) configuration for the pool + * - null: v1 pool (feature not supported, check pool.supportsV2Features) + * - {thresholdAmount: "0"}: v2 pool, CCV not configured + * - {thresholdAmount: null}: v2 pool, downstream API error + * - {thresholdAmount: "N"}: v2 pool, CCV configured with threshold N + */ + ccvConfig: CCVConfig | null + /** Pool information including version, hooks, and v2 feature support flag */ + pool: { + address: string + rawType: string + type: string + version: string + advancedPoolHooks: string | null + /** Whether this pool supports v2 features (customFinality, ccvConfig). + * When true and customFinality/ccvConfig fields have null values inside, + * it indicates a downstream API error rather than feature not supported. */ + supportsV2Features: boolean + } | 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 + } +} + +// 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 = "chainId" | "selector" | "internalId" + +/** + * 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) + * - { in: {...}, out: {...} } = rate limits configured and available + * - { in: null, out: null } = downstream API error (v1 or v2 pool) + */ +export interface RateLimiterDirections { + in?: RateLimiterConfig | null + out?: RateLimiterConfig | null +} + +/** + * Rate limiter entry can be directions data or null (not configured) + * - null = rate limits not configured for this type (standard/custom) + * - { in: null, out: null } = downstream API error + * - { in: {...}, out: {...} } = rate limits available + */ +export type RateLimiterEntry = RateLimiterDirections | null + +/** + * Transfer fees for a token on a lane in basis points + */ +export interface TokenFees { + standardTransferFeeBps: number + customTransferFeeBps: number +} + +/** + * Raw rate limits from mock data (fees may not be present) + */ +export interface RawTokenRateLimits { + standard: RateLimiterEntry + custom: RateLimiterEntry + fees?: TokenFees +} + +/** + * Rate limits for a single token on a lane with both standard and custom limits + * Each entry contains directional (in/out) rate limit configurations + */ +export interface TokenRateLimits { + standard: RateLimiterEntry + custom: RateLimiterEntry +} + +/** + * Combined rate limits and fees for a token on a lane + * Used in API responses that return both rate limits and transfer fees + */ +export interface TokenLaneData { + rateLimits: TokenRateLimits + fees: TokenFees | null + tokenAddress?: string + tokenDecimals?: number + sourcePoolType?: string + destPoolType?: string +} + +/** + * 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) + */ +export type RateLimitsType = "standard" | "custom" + +/** + * Source chain rate limits data with minBlockConfirmation and remote destinations + * Uses RawTokenRateLimits since fees may not be present in mock data + */ +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 + } +} + +// Token Directory API Types (for /tokens/{symbol}/chains/{chain} endpoint) + +/** + * Verifiers configuration for a lane with pre-computed sets for different transfer amounts + * Only present for v2.0+ pools (check pool.supportsV2Features) + * For v1.x pools, the entire verifiers field is null + * + * Values for belowThreshold/aboveThreshold: + * - []: No verifiers configured for this lane + * - [addr1, addr2, ...]: Verifiers configured + * - null: Downstream API error fetching verifiers + * + * Usage: + * - belowThreshold: Verifiers used when transfer amount is below the threshold + * - aboveThreshold: Verifiers used when transfer amount is at or above the threshold + * (includes all belowThreshold verifiers plus additional threshold verifiers) + */ +export interface LaneVerifiers { + belowThreshold: string[] | null + aboveThreshold: string[] | null +} + +/** + * Lane data in token directory response + * + * Use pool.supportsV2Features to interpret verifiers: + * - pool.supportsV2Features=false + verifiers=null → v1.x pool, feature not supported + * - pool.supportsV2Features=true + verifiers={belowThreshold: null, aboveThreshold: null} → downstream API error + * - pool.supportsV2Features=true + verifiers={belowThreshold: [], aboveThreshold: []} → not configured + * - pool.supportsV2Features=true + verifiers={belowThreshold: [...], aboveThreshold: [...]} → configured + */ +export interface TokenDirectoryLane { + internalId: string + chainId: number | string + selector: string + rateLimits: TokenRateLimits + fees: TokenFees | null + verifiers: LaneVerifiers | null +} + +/** + * Token info in directory response + */ +export interface TokenDirectoryTokenInfo { + address: string + decimals: number +} + +/** + * Pool info in directory response + */ +export interface TokenDirectoryPoolInfo { + address: string + rawType: string + type: string + version: string + advancedPoolHooks: string | null + /** Whether this pool supports v2 features (customFinality, ccvConfig). + * When true and customFinality/ccvConfig fields have null values inside, + * it indicates a downstream API error rather than feature not supported. */ + supportsV2Features: boolean +} + +/** + * Token directory data for a specific chain + */ +export interface TokenDirectoryData { + internalId: string + chainId: number | string + selector: string + token: TokenDirectoryTokenInfo + pool: TokenDirectoryPoolInfo + ccvConfig: CCVConfig | null + customFinality: CustomFinalityConfig | null + outboundLanes: Record + inboundLanes: Record +} + +/** + * Metadata for token directory API responses + */ +export interface TokenDirectoryMetadata { + environment: Environment + timestamp: string + requestId: string + symbol: string + sourceChain: string +} + +/** + * Token directory API response format + */ +export interface TokenDirectoryApiResponse { + metadata: TokenDirectoryMetadata + data: TokenDirectoryData +} + +/** + * Token directory service response (internal) + */ +export interface TokenDirectoryServiceResponse { + data: TokenDirectoryData | null +} + +/** + * CCV config data structure in mock JSON files + * Token -> SourceChain (directory key) -> { thresholdAmount, outboundCCVs, inboundCCVs } + * + * Values for base/threshold arrays: + * - []: No verifiers configured + * - [addr1, ...]: Verifiers configured + * - null: Downstream API error fetching verifiers + */ +export interface CCVLaneConfig { + base: string[] | null + threshold: string[] | null +} + +export interface CCVChainConfig { + thresholdAmount: string + outboundCCVs: Record + inboundCCVs: Record +} + +export type CCVConfigData = Record> + +// 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 58% rename from src/pages/api/ccip/utils.ts rename to src/lib/ccip/utils.ts index c10232bc66c..1be8902c829 100644 --- a/src/pages/api/ccip/utils.ts +++ b/src/lib/ccip/utils.ts @@ -3,8 +3,21 @@ import { JsonRpcProvider, Contract } from "ethers" import { ChainsConfig, Environment, loadReferenceData, Version } from "@config/data/ccip/index.ts" 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, + ChainFamily, + ChainMetadata, + ChainConfigError, + FilterType, + RateLimitsMetadata, + RateLimitsFilterType, + RateLimitsDirection, + RateLimitsType, +} from "./types/index.ts" +import { jsonHeaders, commonHeaders as sharedCommonHeaders } from "@lib/api/cacheHeaders.js" +import { logger } from "@lib/logging/index.js" export const prerender = false @@ -13,23 +26,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 */ @@ -43,35 +39,8 @@ export class CCIPError extends Error { } } -/** - * Metadata structure for chain API responses - */ -export type ChainMetadata = { - environment: Environment - timestamp: string - requestId: string - ignoredChainCount: number - validChainCount: number -} - -/** - * Error structure for chain configuration issues - */ -export type ChainConfigError = { - chainId: number - networkId: string - reason: string - missingFields: string[] -} - -/** - * Filter parameters for chain queries - */ -export type FilterType = { - chainId?: string - selector?: string - internalId?: string -} +// Re-export types from types/index.ts for backwards compatibility +export type { ChainMetadata, ChainConfigError, FilterType } /** * Arguments required for ARM proxy contract interactions @@ -179,7 +148,11 @@ export const checkIfChainIsCursed = async ( try { return await getArmIsCursed({ provider, routerAddress }) } catch (error) { - console.error(`Error checking if chain ${chain} is cursed: ${error}`) + logger.error({ + message: "Error checking if chain is cursed", + chain, + error: error instanceof Error ? error.message : "Unknown error", + }) return false } } @@ -199,12 +172,13 @@ export const withTimeout = (promise: Promise, ms: number, timeoutErrorMess /** * Creates metadata object for chain API responses * @param environment - Current environment (mainnet/testnet) + * @param requestId - Optional request ID for correlation (generates new UUID if not provided) * @returns Metadata object with timestamp and request tracking */ -export const createMetadata = (environment: Environment): ChainMetadata => ({ +export const createMetadata = (environment: Environment, requestId?: string): ChainMetadata => ({ environment, timestamp: new Date().toISOString(), - requestId: uuidv4(), + requestId: requestId ?? crypto.randomUUID(), ignoredChainCount: 0, validChainCount: 0, }) @@ -224,6 +198,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,19 +309,44 @@ 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" +export const validateOutputKey = ( + outputKey?: string, + internalIdFormat?: string +): "chainId" | "selector" | "internalId" => { + if (!outputKey) { + // When internalIdFormat is explicitly set but outputKey is not, + // default to "internalId" so the response keys match the requested format + return internalIdFormat ? "internalId" : "chainId" + } if (!["chainId", "selector", "internalId"].includes(outputKey)) { - throw new CCIPError(400, "outputKey must be one of: chainId, selector, or internalId") + throw new CCIPError(400, "outputKey must be one of: chainId, selector, or internalId.") } return outputKey as "chainId" | "selector" | "internalId" } +/** + * Validates the internalIdFormat parameter + * Controls which naming convention is used for internalId in responses: + * - 'directory': chains.json keys (e.g., "mainnet", "bsc-mainnet") + * - 'selector': selectors.yml names (e.g., "ethereum-mainnet", "binance_smart_chain-mainnet") + * + * @param internalIdFormat - Format to validate + * @returns Validated format, defaults to "selector" for backward compatibility + * @throws CCIPError if format is invalid + */ +export const validateInternalIdFormat = (internalIdFormat?: string): "directory" | "selector" => { + if (!internalIdFormat) return "selector" // Default for backward compatibility + if (!["directory", "selector"].includes(internalIdFormat)) { + throw new CCIPError(400, 'internalIdFormat must be "directory" or "selector".') + } + return internalIdFormat as "directory" | "selector" +} + /** * Validates the enrichFeeTokens parameter * @param enrichFeeTokens - String value to validate @@ -274,11 +357,84 @@ 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, 'enrichFeeTokens must be "true" or "false".') } return normalizedValue === "true" } +/** + * Validates search parameter + * @param search - Search query string to validate + * @returns Trimmed search string or null if empty + * @throws CCIPError if search query is invalid + */ +export const validateSearch = (search: string | null): string | null => { + if (!search) return null + + const trimmed = search.trim() + + if (trimmed.length === 0) return null + + if (trimmed.length > 100) { + throw new CCIPError(400, "Search query must not exceed 100 characters.") + } + + // Allow alphanumeric, spaces, hyphens, and underscores (explicit ASCII to prevent Unicode issues) + if (!/^[a-zA-Z0-9_\s-]+$/.test(trimmed)) { + throw new CCIPError(400, "Search query contains invalid characters.") + } + + return trimmed +} + +/** + * Validates family parameter + * @param family - Family string to validate + * @returns Normalized ChainFamily or null if empty + * @throws CCIPError if family value is invalid + */ +export const validateFamily = (family: string | null): ChainFamily | null => { + if (!family) return null + + const trimmed = family.trim() + if (trimmed.length === 0) return null + + const normalized = trimmed.toLowerCase() + + const familyMap: Record = { + evm: "evm", + solana: "solana", + aptos: "aptos", + sui: "sui", + tron: "tron", + canton: "canton", + ton: "ton", + stellar: "stellar", + starknet: "starknet", + } + + const mapped = familyMap[normalized] + if (!mapped) { + throw new CCIPError(400, "family must be one of: evm, solana, aptos, sui, tron, canton, ton, stellar, starknet.") + } + + return mapped +} + +/** + * Validates that search and legacy filters are not combined + * @param search - Search query string + * @param filters - Legacy filter parameters + * @throws CCIPError if search is combined with legacy filters + */ +export const validateSearchParams = (search: string | null, filters: FilterType): void => { + const hasLegacyFilter = filters.chainId || filters.selector || filters.internalId + + if (search && hasLegacyFilter) { + throw new CCIPError(400, "Cannot combine search with chainId, selector, or internalId filters.") + } +} + export const generateChainKey = (chainId: number | string, chainType: ChainType, outputKey: OutputKeyType): string => { const chainIdStr = chainId.toString() @@ -313,42 +469,90 @@ export const normalizeVersion = (version: string): string => { } // Fallback for unknown formats - console.warn(`Unknown version format: ${version}`) + logger.warn({ + message: "Unknown version format, using default", + version, + defaultVersion: "1.0.0", + }) return "1.0.0" } +/** + * Error types for API responses + */ +export enum APIErrorType { + VALIDATION_ERROR = "VALIDATION_ERROR", + SERVER_ERROR = "SERVER_ERROR", + NOT_FOUND = "NOT_FOUND", + INVALID_PARAMETER = "INVALID_PARAMETER", +} + +/** + * Standard API error response format + * All fields are required for consistency across all endpoints + */ +export interface APIError { + error: APIErrorType + message: string + requestId: string + details: Record +} + +/** + * Creates a standardized API error response + * All error responses include: error, message, requestId, and details + * + * @param error - Error type + * @param message - Error message + * @param status - HTTP status code + * @param requestId - Request ID for correlation (required) + * @param details - Additional error details (defaults to empty object) + * @returns Response object with error details + */ +export function createErrorResponse( + error: APIErrorType, + message: string, + status: number, + requestId: string, + details: Record = {} +): Response { + const errorResponse: APIError = { + error, + message, + requestId, + details, + } + + return new Response(JSON.stringify(errorResponse), { + status, + headers: sharedCommonHeaders, + }) +} + /** * Handles API errors and converts them to standardized responses * @param error - Error to handle + * @param requestId - Request ID for correlation * @returns Standardized error response */ -export const handleApiError = (error: unknown): Response => { - let errorType = "UNKNOWN_ERROR" +export const handleApiError = (error: unknown, requestId: string): Response => { + let errorType = APIErrorType.SERVER_ERROR let message = "An unexpected error occurred" let statusCode = 500 if (error instanceof CCIPError) { - errorType = "VALIDATION_ERROR" + errorType = error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR message = error.message statusCode = error.statusCode } else if (error instanceof Error) { message = error.message if (error.name === "ValidationError") { - errorType = "VALIDATION_ERROR" + errorType = APIErrorType.VALIDATION_ERROR statusCode = 400 } } - return new Response( - JSON.stringify({ - error: errorType, - message, - }), - { - status: statusCode, - headers: commonHeaders, - } - ) + return createErrorResponse(errorType, message, statusCode, requestId) } /** @@ -398,47 +602,10 @@ export const loadChainConfiguration = async ( sourceRouterAddress, } } catch (error) { - console.error("Error loading chain configuration:", error) + logger.error({ + message: "Error loading chain configuration", + error: error instanceof Error ? error.message : "Unknown error", + }) throw new CCIPError(500, "Failed to load chain configuration") } } - -/** - * Error types for API responses - */ -export enum APIErrorType { - VALIDATION_ERROR = "VALIDATION_ERROR", - SERVER_ERROR = "SERVER_ERROR", - NOT_FOUND = "NOT_FOUND", - INVALID_PARAMETER = "INVALID_PARAMETER", -} - -/** - * Standard API error response format - */ -export interface APIError { - error: APIErrorType - message: string - details?: unknown -} - -/** - * Creates a standardized API error response - * @param error - Error type - * @param message - Error message - * @param status - HTTP status code - * @param details - Additional error details - * @returns Response object with error details - */ -export function createErrorResponse(error: APIErrorType, message: string, status: number, details?: unknown): Response { - const errorResponse: APIError = { - error, - message, - ...(details ? { details } : {}), - } - - return new Response(JSON.stringify(errorResponse), { - status, - headers: commonHeaders, - }) -} diff --git a/src/lib/ccip/utils/__tests__/pool-version.test.ts b/src/lib/ccip/utils/__tests__/pool-version.test.ts new file mode 100644 index 00000000000..a62dea014c7 --- /dev/null +++ b/src/lib/ccip/utils/__tests__/pool-version.test.ts @@ -0,0 +1,123 @@ +import { describe, it, expect, jest } from "@jest/globals" + +// Mock data: tokenSymbol → directoryKey → version +const mockVersions: Record> = { + mainnet: { + "LBTC::mainnet": "2.0.0", + "LINK::mainnet": "2.0.0", + "USDC::mainnet": "2.0.0", + }, + testnet: { + "CCIP-BnM::ethereum-testnet-sepolia": "2.0.0", + "USDC::ethereum-testnet-sepolia": "2.0.0", + "LINK::ethereum-testnet-sepolia": "2.0.0", + }, +} + +// Mock the enrichment data service before importing pool-version +jest.unstable_mockModule("~/lib/ccip/graphql/services/enrichment-data-service.ts", () => ({ + fetchPoolVersion: jest.fn(async (environment: string, tokenSymbol: string, directoryKey: string) => { + const envData = mockVersions[environment] + if (!envData) return null + return envData[`${tokenSymbol}::${directoryKey}`] ?? null + }), +})) + +// Dynamic imports after mock setup (required for ESM) +const { parseMajorVersion, isV2Pool, shouldEnableCCVFeatures, getEffectivePoolVersion } = + await import("../pool-version.ts") +const { Environment } = await import("~/lib/ccip/types/index.ts") + +describe("Pool Version Utilities", () => { + describe("parseMajorVersion", () => { + it("should parse standard semver versions", () => { + expect(parseMajorVersion("1.0.0")).toBe(1) + expect(parseMajorVersion("2.0.0")).toBe(2) + expect(parseMajorVersion("1.5.1")).toBe(1) + expect(parseMajorVersion("2.1.3")).toBe(2) + expect(parseMajorVersion("10.0.0")).toBe(10) + }) + + it("should handle versions with v prefix", () => { + expect(parseMajorVersion("v1.0.0")).toBe(1) + expect(parseMajorVersion("v2.0.0")).toBe(2) + expect(parseMajorVersion("V1.5.0")).toBe(1) + }) + + it("should return 0 for invalid versions", () => { + expect(parseMajorVersion("")).toBe(0) + expect(parseMajorVersion("invalid")).toBe(0) + }) + + it("should handle edge cases", () => { + expect(parseMajorVersion("0.1.0")).toBe(0) + expect(parseMajorVersion("1")).toBe(1) + expect(parseMajorVersion("2.0")).toBe(2) + }) + }) + + describe("isV2Pool", () => { + it("should return true for v2.0+ versions", () => { + expect(isV2Pool("2.0.0")).toBe(true) + expect(isV2Pool("2.1.0")).toBe(true) + expect(isV2Pool("3.0.0")).toBe(true) + expect(isV2Pool("v2.0.0")).toBe(true) + }) + + it("should return false for v1.x versions", () => { + expect(isV2Pool("1.0.0")).toBe(false) + expect(isV2Pool("1.5.0")).toBe(false) + expect(isV2Pool("1.6.0")).toBe(false) + expect(isV2Pool("1.6.3")).toBe(false) + expect(isV2Pool("v1.6.0")).toBe(false) + }) + + it("should return false for invalid versions", () => { + expect(isV2Pool("")).toBe(false) + expect(isV2Pool("invalid")).toBe(false) + }) + }) + + describe("getEffectivePoolVersion", () => { + it("should return GraphQL version when available", async () => { + const result = await getEffectivePoolVersion(Environment.Mainnet, "LBTC", "mainnet", "1.6.0") + expect(result).toBe("2.0.0") + }) + + it("should return actual version when no GraphQL data", async () => { + const result = await getEffectivePoolVersion(Environment.Mainnet, "DAI", "mainnet", "1.6.0") + expect(result).toBe("1.6.0") + }) + + it("should handle testnet", async () => { + const result = await getEffectivePoolVersion(Environment.Testnet, "CCIP-BnM", "ethereum-testnet-sepolia", "1.6.0") + expect(result).toBe("2.0.0") + }) + + it("should return actual version for non-overridden testnet tokens", async () => { + const result = await getEffectivePoolVersion(Environment.Testnet, "GHO", "ethereum-testnet-sepolia", "1.5.0") + expect(result).toBe("1.5.0") + }) + }) + + describe("shouldEnableCCVFeatures", () => { + it("should return true for v2.0+ pools", async () => { + expect(await shouldEnableCCVFeatures(Environment.Mainnet, "LBTC", "mainnet", "1.6.0")).toBe(true) + }) + + it("should return false for v1.x pools without override", async () => { + expect(await shouldEnableCCVFeatures(Environment.Mainnet, "DAI", "mainnet", "1.6.0")).toBe(false) + }) + + it("should return true if actual version is 2.0+ even without GraphQL data", async () => { + expect(await shouldEnableCCVFeatures(Environment.Mainnet, "UNKNOWN", "mainnet", "2.0.0")).toBe(true) + }) + + it("should handle testnet correctly", async () => { + expect(await shouldEnableCCVFeatures(Environment.Testnet, "CCIP-BnM", "ethereum-testnet-sepolia", "1.6.0")).toBe( + true + ) + expect(await shouldEnableCCVFeatures(Environment.Testnet, "GHO", "ethereum-testnet-sepolia", "1.5.0")).toBe(false) + }) + }) +}) diff --git a/src/lib/ccip/utils/display-name.ts b/src/lib/ccip/utils/display-name.ts new file mode 100644 index 00000000000..adca735e25b --- /dev/null +++ b/src/lib/ccip/utils/display-name.ts @@ -0,0 +1,22 @@ +/** + * Display name utilities for CCIP chains + */ + +/** + * Derives display name from internalId by converting kebab-case or snake_case to Title Case. + * @param internalId - The internal chain identifier (e.g., "ethereum-mainnet", "binance_smart_chain-testnet") + * @returns Human-readable display name (e.g., "Ethereum Mainnet", "Binance Smart Chain Testnet") + * @example + * deriveDisplayName("ethereum-mainnet") // "Ethereum Mainnet" + * deriveDisplayName("binance_smart_chain-testnet") // "Binance Smart Chain Testnet" + */ +export function deriveDisplayName(internalId: string): string { + if (!internalId) { + return "Unknown" + } + return internalId + .split(/[-_]/) + .filter((word) => word.length > 0) // Filter empty strings to prevent double spaces + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ") +} diff --git a/src/lib/ccip/utils/pool-version.ts b/src/lib/ccip/utils/pool-version.ts new file mode 100644 index 00000000000..3d8f49918b9 --- /dev/null +++ b/src/lib/ccip/utils/pool-version.ts @@ -0,0 +1,89 @@ +/** + * Pool Version Utilities + * + * Centralized utilities for handling CCIP pool version logic. + * CCV (Cross-Chain Verifiers), threshold amounts, and custom finality + * are only available for v2.0+ pools. + */ + +import { Environment } from "~/lib/ccip/types/index.ts" +import { fetchPoolVersion } from "~/lib/ccip/graphql/services/enrichment-data-service.ts" + +/** + * Minimum major version that supports CCV features + */ +const CCV_MIN_MAJOR_VERSION = 2 + +/** + * Parses a semantic version string and returns the major version number. + * Handles various formats: "2.0.0", "1.6.0", "v1.5.0", etc. + * + * @param version - Version string to parse + * @returns Major version number, or 0 if parsing fails + */ +export function parseMajorVersion(version: string): number { + if (!version) return 0 + + // Remove leading 'v' if present + const normalized = version.toLowerCase().replace(/^v/, "") + + // Extract major version from semver format + const match = normalized.match(/^(\d+)/) + if (match) { + return parseInt(match[1], 10) + } + + return 0 +} + +/** + * Checks if a pool version supports CCV features (v2.0+). + * + * @param version - Pool version string (e.g., "2.0.0", "1.6.0") + * @returns true if version is 2.0 or higher + */ +export function isV2Pool(version: string): boolean { + const majorVersion = parseMajorVersion(version) + return majorVersion >= CCV_MIN_MAJOR_VERSION +} + +/** + * Gets the effective pool version for a token on a specific chain. + * Fetches from GraphQL, falls back to actualVersion if GraphQL has no data. + * + * @param environment - Network environment + * @param tokenSymbol - Token canonical symbol (e.g., "LBTC", "LINK") + * @param directoryKey - Chain directory key (e.g., "mainnet", "arbitrum-mainnet") + * @param actualVersion - Actual pool version from reference data (fallback) + * @returns Effective pool version + */ +export async function getEffectivePoolVersion( + environment: Environment, + tokenSymbol: string, + directoryKey: string, + actualVersion: string +): Promise { + const graphqlVersion = await fetchPoolVersion(environment, tokenSymbol, directoryKey) + return graphqlVersion || actualVersion +} + +/** + * Checks if CCV features should be enabled for a token on a specific chain. + * This is the primary function services should use to determine if CCV data + * should be included in API responses. + * + * @param environment - Network environment + * @param tokenSymbol - Token canonical symbol + * @param directoryKey - Chain directory key + * @param actualPoolVersion - Actual pool version from reference data + * @returns true if CCV features should be enabled + */ +export async function shouldEnableCCVFeatures( + environment: Environment, + tokenSymbol: string, + directoryKey: string, + actualPoolVersion: string +): Promise { + const effectiveVersion = await getEffectivePoolVersion(environment, tokenSymbol, directoryKey, actualPoolVersion) + return isV2Pool(effectiveVersion) +} 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..ff28124ca1c --- /dev/null +++ b/src/lib/markdown/componentHandlers.ts @@ -0,0 +1,532 @@ +/** + * 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, + "fromEthereumToNonEthereum" + ) + const restToEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromNonEthereumToEthereum" + ) + const restMechanismNonEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "fromNonEthereumToNonEthereum" + ) + const messagingFeesFromToEthereum = calculateMessagingNetworkFeesDirect("fromToEthereum") + const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("fromNonEthereumToNonEthereum") + + // 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/domain/services/signature-verification.ts b/src/lib/solana/domain/services/signature-verification.ts index 5d9f0d03cd1..9b34b273f0c 100644 --- a/src/lib/solana/domain/services/signature-verification.ts +++ b/src/lib/solana/domain/services/signature-verification.ts @@ -308,7 +308,7 @@ export class SolanaSignatureService { logger.warn({ message: "Timing-safe HMAC verification failed for SIWS challenge", requestId: params.requestId, - family: "svm", + family: "solana", receiverAddress: params.receiver, step: "hmac_verification", }) @@ -327,7 +327,7 @@ export class SolanaSignatureService { logger.debug({ message: "SIWS challenge metadata parsed", requestId: params.requestId, - family: "svm", + family: "solana", expiresAt: metadata.expiresAt, issuedAt: metadata.issuedAt, nonce: metadata.nonce, @@ -351,7 +351,7 @@ export class SolanaSignatureService { logger.warn({ message: "SIWS challenge expired", requestId: params.requestId, - family: "svm", + family: "solana", expiresAt: metadata.expiresAt, currentTime: now, timeRemaining: metadata.expiresAt - now, @@ -366,7 +366,7 @@ export class SolanaSignatureService { logger.warn({ message: "SIWS challenge issued in the future", requestId: params.requestId, - family: "svm", + family: "solana", issuedAt: metadata.issuedAt, currentTime: now, step: "future_check", @@ -388,7 +388,7 @@ export class SolanaSignatureService { logger.info({ message: "Ed25519 signature verification successful", requestId: params.requestId, - family: "svm", + family: "solana", receiverAddress: params.receiver, verificationTimeMs: verificationTime, step: "signature_verification", @@ -398,7 +398,7 @@ export class SolanaSignatureService { logger.warn({ message: "Ed25519 signature verification failed", requestId: params.requestId, - family: "svm", + family: "solana", receiverAddress: params.receiver, verificationTimeMs: verificationTime, step: "signature_verification", @@ -418,7 +418,7 @@ export class SolanaSignatureService { logger.error({ message: "Error during SIWS signature verification", requestId: params.requestId, - family: "svm", + family: "solana", error: error instanceof Error ? error.message : "Unknown error", step: "verification_error", }) 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/lib/solana/wallet-adapter/components/WalletPicker.tsx b/src/lib/solana/wallet-adapter/components/WalletPicker.tsx index 0f4918781f8..57f7aadc2cb 100644 --- a/src/lib/solana/wallet-adapter/components/WalletPicker.tsx +++ b/src/lib/solana/wallet-adapter/components/WalletPicker.tsx @@ -5,7 +5,7 @@ import type { WalletReadyState } from "@solana/wallet-adapter-base" import styles from "./WalletPicker.module.css" // Default wallet icon - consistent with Chainlink design system -const DEFAULT_WALLET_ICON = "https://smartcontract.imgix.net/icons/wallet_filled.svg?auto=compress%2Cformat" +const DEFAULT_WALLET_ICON = "https://d2f70xi62kby8n.cloudfront.net/icons/wallet_filled.svg?auto=compress%2Cformat" interface WalletPickerProps { className?: string 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..7b0df0912cf 100644 --- a/src/pages/api/ccip/v1/chains.ts +++ b/src/pages/api/ccip/v1/chains.ts @@ -4,21 +4,25 @@ import { validateFilters, validateOutputKey, validateEnrichFeeTokens, + validateSearch, + validateFamily, + validateSearchParams, + validateInternalIdFormat, 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, ChainFamily } from "~/lib/ccip/types/index.ts" +import { ChainDataService, getAllChainsForSearch } from "~/lib/ccip/services/chain-data.ts" +import { searchChains } from "~/lib/ccip/services/chain-search.ts" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" export const prerender = false @@ -43,13 +47,38 @@ export const GET: APIRoute = async ({ request }) => { environment, }) - // Validate filters + // Validate search and family (new unified search params) + const search = validateSearch(params.get("search")) + const family = validateFamily(params.get("family")) + logger.debug({ + message: "Search params validated", + requestId, + search, + family, + }) + + // Validate legacy filters const filters: FilterType = { chainId: params.get("chainId") || undefined, selector: params.get("selector") || undefined, internalId: params.get("internalId") || undefined, } validateFilters(filters) + + // Validate mutual exclusion of search and legacy filters + validateSearchParams(search, filters) + + // Warn if family is used with legacy filters (family has no effect in legacy mode) + const hasLegacyFilter = filters.chainId || filters.selector || filters.internalId + if (family && hasLegacyFilter) { + logger.warn({ + message: "family parameter is ignored when using legacy filters (chainId, selector, internalId)", + requestId, + family, + filters, + }) + } + logger.debug({ message: "Filters validated", requestId, @@ -64,6 +93,14 @@ export const GET: APIRoute = async ({ request }) => { outputKey, }) + // Validate internalIdFormat parameter (only applies when outputKey=internalId) + const internalIdFormat = validateInternalIdFormat(params.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + // Validate enrichFeeTokens parameter const enrichFeeTokens = validateEnrichFeeTokens(params.get("enrichFeeTokens") || undefined) logger.debug({ @@ -72,6 +109,9 @@ export const GET: APIRoute = async ({ request }) => { enrichFeeTokens, }) + // Initialize chain identifier service for formatting (only used when outputKey=internalId) + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + const config = await loadChainConfiguration(environment) logger.debug({ message: "Chain configuration loaded", @@ -80,37 +120,119 @@ export const GET: APIRoute = async ({ request }) => { chainCount: Object.keys(config.chainsConfig).length, }) - const chainDataService = new ChainDataService(config.chainsConfig) - const { - data, - errors, - metadata: serviceMetadata, - } = await chainDataService.getFilteredChains(environment, filters, enrichFeeTokens) + const chainDataService = new ChainDataService(config.chainsConfig, requestId) - logger.info({ - message: "Chain data retrieved successfully", - requestId, - validChainCount: serviceMetadata.validChainCount, - errorCount: errors.length, - filters, - }) + let data: Record + let errors: { chainId: number; networkId: string; reason: string; missingFields: string[] }[] + const metadata = createMetadata(environment, requestId) - const metadata = createMetadata(environment) - metadata.ignoredChainCount = serviceMetadata.ignoredChainCount - metadata.validChainCount = serviceMetadata.validChainCount + if (search) { + // SEARCH MODE: Get all chains (supported + unsupported) and search + const { + data: supportedData, + errors: supportedErrors, + metadata: _serviceMetadata, + } = await chainDataService.getFilteredChains(environment, {}, enrichFeeTokens) + + // Flatten supported chains from all families + const supportedChains = [ + ...supportedData.evm, + ...supportedData.solana, + ...supportedData.aptos, + ...supportedData.sui, + ...supportedData.tron, + ...supportedData.canton, + ...supportedData.ton, + ...supportedData.stellar, + ...supportedData.starknet, + ] + + // Get all chains including unsupported + const allChains = getAllChainsForSearch(environment, supportedChains) + + // Execute search with optional family filter + const { results, searchType } = searchChains(search, allChains, family) + + // Group results by family + data = { evm: [], solana: [], aptos: [], sui: [], tron: [], canton: [], ton: [], stellar: [], starknet: [] } + for (const chain of results) { + data[chain.chainFamily].push(chain) + } + + errors = supportedErrors + metadata.validChainCount = results.length + metadata.ignoredChainCount = supportedErrors.length + metadata.searchQuery = search + metadata.searchType = searchType + + logger.info({ + message: "Search completed successfully", + requestId, + searchQuery: search, + searchType, + resultCount: results.length, + family, + }) + } else { + // LEGACY MODE: Existing filter behavior (supported chains only) + const { + data: serviceData, + errors: serviceErrors, + metadata: serviceMetadata, + } = await chainDataService.getFilteredChains(environment, filters, enrichFeeTokens) + + // Add supported: true to all chains in legacy mode + data = { + evm: serviceData.evm.map((c) => ({ ...c, supported: true })), + solana: serviceData.solana.map((c) => ({ ...c, supported: true })), + aptos: serviceData.aptos.map((c) => ({ ...c, supported: true })), + sui: serviceData.sui.map((c) => ({ ...c, supported: true })), + tron: serviceData.tron.map((c) => ({ ...c, supported: true })), + canton: serviceData.canton.map((c) => ({ ...c, supported: true })), + ton: serviceData.ton.map((c) => ({ ...c, supported: true })), + stellar: serviceData.stellar.map((c) => ({ ...c, supported: true })), + starknet: serviceData.starknet.map((c) => ({ ...c, supported: true })), + } + + errors = serviceErrors + metadata.validChainCount = serviceMetadata.validChainCount + metadata.ignoredChainCount = serviceMetadata.ignoredChainCount + + logger.info({ + message: "Chain data retrieved successfully", + requestId, + validChainCount: serviceMetadata.validChainCount, + errorCount: errors.length, + filters, + }) + } // Convert each chain family's array to a keyed object structure as required by the API + // Always apply internalIdFormat to format the internalId field in each chain object const formattedData = Object.entries(data).reduce( - (acc, [family, chainList]) => { - acc[family] = chainList.reduce( + (acc, [familyKey, chainList]) => { + acc[familyKey] = chainList.reduce( (familyAcc, chain) => { - const key = - outputKey === "chainId" - ? generateChainKey(chain.chainId, chain.chainType, outputKey) - : outputKey - ? chain[outputKey].toString() - : chain.internalId - familyAcc[key] = chain + let key: string + + // Always format the internalId field based on internalIdFormat + const resolved = chainIdService.resolve(chain.internalId) + const formattedInternalId = resolved + ? chainIdService.format(resolved.directoryKey, internalIdFormat) + : chain.internalId + const formattedChain = { ...chain, internalId: formattedInternalId } + + if (outputKey === "chainId") { + key = generateChainKey(chain.chainId, chain.chainType, outputKey) + } else if (outputKey === "internalId") { + key = formattedInternalId + } else if (outputKey) { + key = chain[outputKey].toString() + } else { + key = chain.internalId + } + + familyAcc[key] = formattedChain return familyAcc }, {} as Record @@ -133,7 +255,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ @@ -149,16 +271,16 @@ export const GET: APIRoute = async ({ request }) => { error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, error.message, error.statusCode, - {} + requestId ) } - // Handle other errors - if (error instanceof Error) { - return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process chain request", 500, { - message: error.message, - }) - } - return handleApiError(error) + // Handle all other errors generically without exposing internal details + return createErrorResponse( + APIErrorType.SERVER_ERROR, + "An unexpected error occurred while processing the request.", + 500, + requestId + ) } } diff --git a/src/pages/api/ccip/v1/docs.astro b/src/pages/api/ccip/v1/docs.astro index 6e1ad90eb26..4ca6e697ae2 100644 --- a/src/pages/api/ccip/v1/docs.astro +++ b/src/pages/api/ccip/v1/docs.astro @@ -13,13 +13,13 @@ const fetchCcipChains = async () => { const evmChains = data.data.evm; console.log('EVM chains:', evmChains); - // Access Solana VM chains (if available) - const solanaChains = data.data.svm || {}; + // Access Solana chains (if available) + const solanaChains = data.data.solana || {}; console.log('Solana chains:', solanaChains); - - // Access Move VM chains (if available) - const mvmChains = data.data.mvm || {}; - console.log('Aptos chains:', mvmChains); + + // Access Aptos chains (if available) + const aptosChains = data.data.aptos || {}; + console.log('Aptos chains:', aptosChains); return data; } catch (err) { @@ -50,7 +50,7 @@ const fetchSolanaChains = async () => { const data = await response.json(); // Extract just the Solana chains - const solanaChains = data.data.svm || {}; + const solanaChains = data.data.solana || {}; console.log('Solana chains:', solanaChains); return solanaChains; } catch (err) { diff --git a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts index 9c578ededb1..aafe4e63588 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 @@ -30,13 +31,13 @@ export const GET: APIRoute = async ({ request, params }) => { const receiver = url.searchParams.get("receiver") if (!token) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Missing token parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Missing token parameter", 422, requestId, { code: "invalid_token", }) } if (!receiver) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Missing receiver parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Missing receiver parameter", 422, requestId, { code: "invalid_receiver", }) } @@ -102,33 +103,30 @@ export const GET: APIRoute = async ({ request, params }) => { error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, error.message, error.statusCode, - { traceId: requestId } + requestId ) } // Handle validation errors if (error instanceof Error && error.message.includes("not supported")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, requestId, { code: "unsupported_chain", - traceId: requestId, }) } if (error instanceof Error && error.message.includes("Invalid address")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, requestId, { code: "invalid_address", - traceId: requestId, }) } if (error instanceof Error && error.message.includes("not allowed")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, requestId, { code: "unsupported_token", - traceId: requestId, }) } // Handle other errors - return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to generate challenge", 500, { traceId: requestId }) + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to generate challenge", 500, requestId) } } diff --git a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts index 4d88f178c45..676b93bc8b0 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" @@ -32,9 +33,8 @@ export const POST: APIRoute = async ({ request, params }) => { try { body = await request.json() } catch { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid JSON body", 400, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid JSON body", 400, requestId, { code: "invalid_json", - traceId: requestId, }) } @@ -61,30 +61,26 @@ export const POST: APIRoute = async ({ request, params }) => { // 2. Input validation if (!token || typeof token !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid token parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid token parameter", 422, requestId, { code: "invalid_token", - traceId: requestId, }) } if (!receiver || typeof receiver !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid receiver parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid receiver parameter", 422, requestId, { code: "invalid_receiver", - traceId: requestId, }) } if (!challenge || typeof challenge !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid challenge parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid challenge parameter", 422, requestId, { code: "bad_challenge", - traceId: requestId, }) } if (!receiverSignature || typeof receiverSignature !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid signature parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid signature parameter", 422, requestId, { code: "invalid_signature", - traceId: requestId, }) } @@ -101,9 +97,9 @@ export const POST: APIRoute = async ({ request, params }) => { APIErrorType.VALIDATION_ERROR, `Faucet configuration error: ${configError instanceof Error ? configError.message : "Invalid chain or token configuration"}`, 400, + requestId, { code: "FAUCET_CONFIG_ERROR", - traceId: requestId, } ) } @@ -113,9 +109,9 @@ export const POST: APIRoute = async ({ request, params }) => { APIErrorType.VALIDATION_ERROR, `Unsupported chain: ${params.chainName}. This chain is not enabled for faucet operations.`, 400, + requestId, { code: "UNSUPPORTED_CHAIN", - traceId: requestId, supportedChains: ["solana-devnet"], } ) @@ -160,9 +156,9 @@ export const POST: APIRoute = async ({ request, params }) => { APIErrorType.VALIDATION_ERROR, `Authentication failed: ${verifyResult.message || "Signature verification failed"}`, statusCode, + requestId, { code: verifyResult.code || "INVALID_SIGNATURE", - traceId: requestId, } ) } @@ -179,10 +175,15 @@ export const POST: APIRoute = async ({ request, params }) => { const svmDripAdapter = new SvmDripAdapter() if (!svmDripAdapter.isDripAvailable(chainConfig)) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Drip is not available for this chain", 503, { - code: "drip_unavailable", - traceId: requestId, - }) + return createErrorResponse( + APIErrorType.VALIDATION_ERROR, + "Drip is not available for this chain", + 503, + requestId, + { + code: "drip_unavailable", + } + ) } // 6. Execute the drip (rate limiting handled on-chain by Solana program) @@ -234,7 +235,7 @@ export const POST: APIRoute = async ({ request, params }) => { token, receiver, }, - traceId: requestId, + requestId, }), { headers: { ...commonHeaders, ...securityHeaders }, @@ -274,11 +275,11 @@ export const POST: APIRoute = async ({ request, params }) => { error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, error.message, error.statusCode, - { traceId: requestId } + requestId ) } // Handle other errors - return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to execute drip", 500, { traceId: requestId }) + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to execute drip", 500, requestId) } } diff --git a/src/pages/api/ccip/v1/drips/[chainName]/index.ts b/src/pages/api/ccip/v1/drips/[chainName]/index.ts index b89cee85286..4a72b2a3256 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 @@ -28,9 +29,8 @@ export const POST: APIRoute = async ({ request, params }) => { try { body = await request.json() } catch { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid JSON body", 400, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid JSON body", 400, requestId, { code: "invalid_json", - traceId: requestId, }) } @@ -49,30 +49,26 @@ export const POST: APIRoute = async ({ request, params }) => { // 3. Input validation if (!token || typeof token !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid token parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid token parameter", 422, requestId, { code: "invalid_token", - traceId: requestId, }) } if (!receiver || typeof receiver !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid receiver parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid receiver parameter", 422, requestId, { code: "invalid_receiver", - traceId: requestId, }) } if (!challenge || typeof challenge !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid challenge parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid challenge parameter", 422, requestId, { code: "bad_challenge", - traceId: requestId, }) } if (!receiverSignature || typeof receiverSignature !== "string") { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid signature parameter", 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Invalid signature parameter", 422, requestId, { code: "invalid_signature", - traceId: requestId, }) } @@ -109,10 +105,15 @@ export const POST: APIRoute = async ({ request, params }) => { // 5. Handle verification result if (verifyResult.status === "error") { // Return 400 for verification failures (client error, not server error) - return createErrorResponse(APIErrorType.VALIDATION_ERROR, verifyResult.message || "Verification failed", 400, { - code: verifyResult.code || "verification_failed", - traceId: requestId, - }) + return createErrorResponse( + APIErrorType.VALIDATION_ERROR, + verifyResult.message || "Verification failed", + 400, + requestId, + { + code: verifyResult.code || "verification_failed", + } + ) } // 6. Security headers @@ -144,7 +145,7 @@ export const POST: APIRoute = async ({ request, params }) => { error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, error.message, error.statusCode, - { traceId: requestId } + requestId ) } @@ -153,56 +154,49 @@ export const POST: APIRoute = async ({ request, params }) => { const errorMessage = error.message.toLowerCase() if (errorMessage.includes("challenge expired")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Challenge has expired", 401, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Challenge has expired", 401, requestId, { code: "challenge_expired", - traceId: requestId, }) } if (errorMessage.includes("challenge tampered") || errorMessage.includes("invalid hmac")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Challenge has been tampered with", 401, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Challenge has been tampered with", 401, requestId, { code: "challenge_tampered", - traceId: requestId, }) } if (errorMessage.includes("signature verification failed")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Signature verification failed", 401, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Signature verification failed", 401, requestId, { code: "invalid_signature", - traceId: requestId, }) } if (errorMessage.includes("origin mismatch")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Challenge origin mismatch", 401, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, "Challenge origin mismatch", 401, requestId, { code: "origin_mismatch", - traceId: requestId, }) } if (errorMessage.includes("not supported")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, requestId, { code: "unsupported_chain", - traceId: requestId, }) } if (errorMessage.includes("invalid address")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, requestId, { code: "invalid_address", - traceId: requestId, }) } if (errorMessage.includes("not allowed")) { - return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, { + return createErrorResponse(APIErrorType.VALIDATION_ERROR, error.message, 422, requestId, { code: "unsupported_token", - traceId: requestId, }) } } // Handle other errors - return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to verify signature", 500, { traceId: requestId }) + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to verify signature", 500, requestId) } } diff --git a/src/pages/api/ccip/v1/graphql.ts b/src/pages/api/ccip/v1/graphql.ts new file mode 100644 index 00000000000..3b8f66fde69 --- /dev/null +++ b/src/pages/api/ccip/v1/graphql.ts @@ -0,0 +1,93 @@ +import type { APIRoute } from "astro" +import { commonHeaders, corsHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" +import { getGraphQLClient } from "~/lib/ccip/graphql/client.ts" +import { validateQuery } from "~/lib/ccip/graphql/proxy/whitelist.ts" +import { getCached, setCache, buildCacheKey } from "~/lib/ccip/graphql/proxy/cache.ts" +import { isIntrospectionQuery, getIntrospectionResponse } from "~/lib/ccip/graphql/proxy/introspection.ts" + +export const prerender = false + +function errorResponse(status: number, message: string, requestId: string): Response { + return new Response( + JSON.stringify({ + errors: [{ message }], + extensions: { requestId }, + }), + { + status, + headers: commonHeaders, + } + ) +} + +export const GET: APIRoute = async () => { + return new Response( + JSON.stringify({ + message: "CCIP GraphQL proxy. Use POST with a JSON body containing a 'query' field.", + }), + { headers: commonHeaders } + ) +} + +export const OPTIONS: APIRoute = async () => { + return new Response(null, { + status: 204, + headers: { + ...corsHeaders, + "Access-Control-Allow-Methods": "POST, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + }, + }) +} + +export const POST: APIRoute = async ({ request }) => { + const requestId = crypto.randomUUID() + + try { + const body = await request.json() + const { query, variables } = body + + if (!query || typeof query !== "string") { + return errorResponse(400, "Missing or invalid 'query' field", requestId) + } + + if (isIntrospectionQuery(query)) { + logger.debug({ message: "Serving introspection from static schema", requestId }) + return new Response(JSON.stringify(getIntrospectionResponse()), { + headers: commonHeaders, + }) + } + + const validation = validateQuery(query) + if (!validation.valid) { + logger.warn({ message: "Query rejected by whitelist", requestId, reason: validation.reason }) + return errorResponse(403, validation.reason || "Query not allowed", requestId) + } + + const cacheKey = buildCacheKey(query, variables) + const cached = getCached(cacheKey) + if (cached) { + logger.debug({ message: "Proxy cache hit", requestId }) + return new Response(JSON.stringify({ data: cached }), { + headers: commonHeaders, + }) + } + + const client = getGraphQLClient() + const data = await client.request(query, variables) + + setCache(cacheKey, data) + + return new Response(JSON.stringify({ data }), { + headers: commonHeaders, + }) + } catch (error) { + logger.error({ + message: "GraphQL proxy error", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + return errorResponse(502, "Upstream request failed", requestId) + } +} diff --git a/src/pages/api/ccip/v1/lanes.ts b/src/pages/api/ccip/v1/lanes.ts index d0936224e3f..7399e2bf378 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({ @@ -133,16 +132,11 @@ export const GET: APIRoute = async ({ request }) => { error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, error.message, error.statusCode, - {} + requestId ) } // Handle other errors - if (error instanceof Error) { - return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lanes request", 500, { - message: error.message, - }) - } - return handleApiError(error) + return handleApiError(error, requestId) } } 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..214341f63e5 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts @@ -0,0 +1,166 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateInternalIdFormat, + 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" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.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, + }) + + // Validate internalIdFormat parameter (controls output format for internal IDs) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + // Initialize chain identifier service for formatting + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + + const laneDataService = new LaneDataService() + + // Load reference data to resolve chain IDs to directory keys + const { chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve chain IDs to directory keys + const sourceDirectoryKey = laneDataService.resolveToInternalId( + source, + "chainId", + chainsReferenceData as Record + ) + const destDirectoryKey = laneDataService.resolveToInternalId( + destination, + "chainId", + chainsReferenceData as Record + ) + + if (!sourceDirectoryKey || !destDirectoryKey) { + throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) + } + + const result = await laneDataService.getLaneDetails(environment, sourceDirectoryKey, destDirectoryKey, "internalId") + + 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, + }) + + // Format the internalId fields in the response data based on internalIdFormat + const formattedSourceInternalId = chainIdService.format(sourceDirectoryKey, internalIdFormat) + const formattedDestInternalId = chainIdService.format(destDirectoryKey, internalIdFormat) + + const formattedData = { + ...result.data, + sourceChain: { + ...result.data.sourceChain, + internalId: formattedSourceInternalId, + }, + destinationChain: { + ...result.data.destinationChain, + internalId: formattedDestInternalId, + }, + } + + // Create lane detail metadata (keep chain IDs as that's what user passed) + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: formattedData, + } + + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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..d9fdc602b53 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,156 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateInternalIdFormat, + 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" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.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, + }) + + // Validate internalIdFormat parameter (controls output format for internal IDs) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + // Initialize chain identifier service for formatting (reserved for future use) + const _chainIdService = new ChainIdentifierService(environment, internalIdFormat) + + const laneDataService = new LaneDataService() + + // Load reference data to resolve chain IDs to directory keys + const { chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve chain IDs to directory keys + const sourceDirectoryKey = laneDataService.resolveToInternalId( + source, + "chainId", + chainsReferenceData as Record + ) + const destDirectoryKey = laneDataService.resolveToInternalId( + destination, + "chainId", + chainsReferenceData as Record + ) + + if (!sourceDirectoryKey || !destDirectoryKey) { + throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) + } + + const result = await laneDataService.getSupportedTokensWithRateLimits( + environment, + sourceDirectoryKey, + destDirectoryKey, + "internalId" + ) + + 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 (keep chain IDs in metadata as that's what user passed) + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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..66a1bf0e276 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts @@ -0,0 +1,158 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateInternalIdFormat, + 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" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.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, + }) + + // Validate internalIdFormat parameter (controls output format) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + // Initialize chain identifier service for formatting + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + + // Resolve source and destination to directory keys for data lookup + const sourceResolved = chainIdService.resolve(source) + const destResolved = chainIdService.resolve(destination) + + if (!sourceResolved) { + throw new CCIPError(400, `Invalid source chain identifier: '${source}'`) + } + if (!destResolved) { + throw new CCIPError(400, `Invalid destination chain identifier: '${destination}'`) + } + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails( + environment, + sourceResolved.directoryKey, + destResolved.directoryKey, + "internalId" + ) + + 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, + }) + + // Format chain identifiers based on internalIdFormat + const formattedSource = chainIdService.format(sourceResolved.directoryKey, internalIdFormat) + const formattedDest = chainIdService.format(destResolved.directoryKey, internalIdFormat) + + // Format the internalId fields in the response data + const formattedData = { + ...result.data, + sourceChain: { + ...result.data.sourceChain, + internalId: formattedSource, + }, + destinationChain: { + ...result.data.destinationChain, + internalId: formattedDest, + }, + } + + // Create lane detail metadata with formatted chain identifiers + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: formattedSource, + destinationChain: formattedDest, + } + + const response: LaneDetailApiResponse = { + metadata, + data: formattedData, + } + + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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..e052858a291 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,146 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateInternalIdFormat, + 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" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.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, + }) + + // Validate internalIdFormat parameter (controls output format) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + // Initialize chain identifier service for formatting + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + + // Resolve source and destination to directory keys for data lookup + const sourceResolved = chainIdService.resolve(source) + const destResolved = chainIdService.resolve(destination) + + if (!sourceResolved) { + throw new CCIPError(400, `Invalid source chain identifier: '${source}'`) + } + if (!destResolved) { + throw new CCIPError(400, `Invalid destination chain identifier: '${destination}'`) + } + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits( + environment, + sourceResolved.directoryKey, + destResolved.directoryKey, + "internalId" + ) + + 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, + }) + + // Format chain identifiers based on internalIdFormat + const formattedSource = chainIdService.format(sourceResolved.directoryKey, internalIdFormat) + const formattedDest = chainIdService.format(destResolved.directoryKey, internalIdFormat) + + // Create metadata with formatted chain identifiers + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: formattedSource, + destinationChain: formattedDest, + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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..600ed75605b --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts @@ -0,0 +1,166 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateInternalIdFormat, + 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" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.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, + }) + + // Validate internalIdFormat parameter (controls output format for internal IDs) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + // Initialize chain identifier service for formatting + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + + const laneDataService = new LaneDataService() + + // Load reference data to resolve selectors to directory keys + const { chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve selectors to directory keys + const sourceDirectoryKey = laneDataService.resolveToInternalId( + source, + "selector", + chainsReferenceData as Record + ) + const destDirectoryKey = laneDataService.resolveToInternalId( + destination, + "selector", + chainsReferenceData as Record + ) + + if (!sourceDirectoryKey || !destDirectoryKey) { + throw new CCIPError(404, `Lane from selector '${source}' to selector '${destination}' not found`) + } + + const result = await laneDataService.getLaneDetails(environment, sourceDirectoryKey, destDirectoryKey, "internalId") + + 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, + }) + + // Format the internalId fields in the response data based on internalIdFormat + const formattedSourceInternalId = chainIdService.format(sourceDirectoryKey, internalIdFormat) + const formattedDestInternalId = chainIdService.format(destDirectoryKey, internalIdFormat) + + const formattedData = { + ...result.data, + sourceChain: { + ...result.data.sourceChain, + internalId: formattedSourceInternalId, + }, + destinationChain: { + ...result.data.destinationChain, + internalId: formattedDestInternalId, + }, + } + + // Create lane detail metadata (keep selectors as that's what user passed) + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: formattedData, + } + + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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..ea2a954615e --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,156 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateInternalIdFormat, + 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" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.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, + }) + + // Validate internalIdFormat parameter (controls output format for internal IDs) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + // Initialize chain identifier service for formatting (reserved for future use) + const _chainIdService = new ChainIdentifierService(environment, internalIdFormat) + + const laneDataService = new LaneDataService() + + // Load reference data to resolve selectors to directory keys + const { chainsReferenceData } = loadReferenceData({ + environment, + version: Version.V1_2_0, + }) + + // Resolve selectors to directory keys + const sourceDirectoryKey = laneDataService.resolveToInternalId( + source, + "selector", + chainsReferenceData as Record + ) + const destDirectoryKey = laneDataService.resolveToInternalId( + destination, + "selector", + chainsReferenceData as Record + ) + + if (!sourceDirectoryKey || !destDirectoryKey) { + throw new CCIPError(404, `Lane from selector '${source}' to selector '${destination}' not found`) + } + + const result = await laneDataService.getSupportedTokensWithRateLimits( + environment, + sourceDirectoryKey, + destDirectoryKey, + "internalId" + ) + + 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 (keep selectors in metadata as that's what user passed) + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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..1e9f2473097 --- /dev/null +++ b/src/pages/api/ccip/v1/rate-limits.ts @@ -0,0 +1,109 @@ +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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} diff --git a/src/pages/api/ccip/v1/tokens.ts b/src/pages/api/ccip/v1/tokens.ts index c11a39d77e5..8e374a9719f 100644 --- a/src/pages/api/ccip/v1/tokens.ts +++ b/src/pages/api/ccip/v1/tokens.ts @@ -2,19 +2,20 @@ import { APIRoute } from "astro" import { validateEnvironment, validateOutputKey, + validateInternalIdFormat, 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, TokenChainData } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" export const prerender = false @@ -52,13 +53,21 @@ 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, outputKey, }) + // Validate internalIdFormat parameter (only applies when output_key=internalId) + const internalIdFormat = validateInternalIdFormat(params.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + const config = await loadChainConfiguration(environment) logger.debug({ message: "Chain configuration loaded", @@ -82,6 +91,30 @@ export const GET: APIRoute = async ({ request }) => { filters, }) + // Apply internalIdFormat to transform chain keys when output_key=internalId + let formattedTokens = tokens + if (outputKey === "internalId") { + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + formattedTokens = {} + + for (const [tokenSymbol, chainData] of Object.entries(tokens)) { + const formattedChainData: Record = {} + + for (const [chainKey, tokenChainData] of Object.entries(chainData)) { + // Resolve and format the chain key + const resolved = chainIdService.resolve(chainKey) + if (resolved) { + const formattedKey = chainIdService.format(resolved.directoryKey, internalIdFormat) + formattedChainData[formattedKey] = tokenChainData + } else { + formattedChainData[chainKey] = tokenChainData + } + } + + formattedTokens[tokenSymbol] = formattedChainData + } + } + // Create token-specific metadata using the utility function const metadata = createTokenMetadata(environment) metadata.ignoredTokenCount = serviceMetadata.ignoredTokenCount @@ -89,7 +122,7 @@ export const GET: APIRoute = async ({ request }) => { const response: TokenApiResponse = { metadata, - data: tokens, + data: formattedTokens, ignored: errors, } @@ -100,7 +133,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ @@ -116,16 +149,11 @@ export const GET: APIRoute = async ({ request }) => { error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, error.message, error.statusCode, - {} + requestId ) } // Handle other errors - if (error instanceof Error) { - return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process token request", 500, { - message: error.message, - }) - } - return handleApiError(error) + return handleApiError(error, requestId) } } 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..a5732c12095 --- /dev/null +++ b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts @@ -0,0 +1,155 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateOutputKey, + validateInternalIdFormat, + 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, TokenDetailDataResponse } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { resolveTokenSymbol } from "~/lib/ccip/graphql/utils/reference-data-resolver.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const tokenCanonicalSymbol = params.tokenCanonicalSymbol + ? decodeURIComponent(params.tokenCanonicalSymbol) + : undefined + + 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) + + // Resolve to canonical symbol (case-insensitive, trimmed) + const canonicalSymbol = resolveTokenSymbol(environment, tokenCanonicalSymbol) + if (!canonicalSymbol) { + throw new CCIPError(404, `Token '${tokenCanonicalSymbol}' not found`) + } + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate output key for chain representation + const outputKey = validateOutputKey(queryParams.get("outputKey") || undefined) + logger.debug({ + message: "Output key validated", + requestId, + outputKey, + }) + + // Validate internalIdFormat parameter (only applies when outputKey=internalId) + const internalIdFormat = validateInternalIdFormat(queryParams.get("internalIdFormat") || undefined) + logger.debug({ + message: "Internal ID format validated", + requestId, + internalIdFormat, + }) + + const tokenDataService = new TokenDataService() + const result = await tokenDataService.getTokenWithFinality(environment, canonicalSymbol, outputKey) + + if (!result) { + throw new CCIPError(404, `Token '${canonicalSymbol}' not found`) + } + + // Apply internalIdFormat to transform chain keys when output_key=internalId + let formattedData = result.data + if (outputKey === "internalId") { + const chainIdService = new ChainIdentifierService(environment, internalIdFormat) + const formatted: TokenDetailDataResponse = {} + + for (const [chainKey, chainData] of Object.entries(result.data)) { + const resolved = chainIdService.resolve(chainKey) + if (resolved) { + const formattedKey = chainIdService.format(resolved.directoryKey, internalIdFormat) + formatted[formattedKey] = chainData + } else { + formatted[chainKey] = chainData + } + } + + formattedData = formatted + } + + 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: canonicalSymbol, + chainCount: result.metadata.chainCount, + } + + const response: TokenDetailApiResponse = { + metadata, + data: formattedData, + } + + 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} diff --git a/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/chains/[chain].ts b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/chains/[chain].ts new file mode 100644 index 00000000000..a2d47ef7aff --- /dev/null +++ b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/chains/[chain].ts @@ -0,0 +1,161 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateOutputKey, + validateInternalIdFormat, + 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 { TokenDirectoryApiResponse, TokenDirectoryMetadata, NamingConvention } from "~/lib/ccip/types/index.ts" +import { TokenDirectoryService } from "~/lib/ccip/services/token-directory.ts" +import { ChainIdentifierService } from "~/lib/ccip/services/chain-identifier.ts" +import { resolveTokenSymbol } from "~/lib/ccip/graphql/utils/reference-data-resolver.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const tokenCanonicalSymbol = params.tokenCanonicalSymbol + ? decodeURIComponent(params.tokenCanonicalSymbol) + : undefined + const { chain } = params + + logger.info({ + message: "Processing CCIP token directory request", + requestId, + url: request.url, + tokenCanonicalSymbol, + chain, + }) + + // Validate token symbol is provided + if (!tokenCanonicalSymbol) { + throw new CCIPError(400, "tokenCanonicalSymbol parameter is required") + } + + // Validate chain parameter is provided + if (!chain) { + throw new CCIPError(400, "chain 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, + }) + + // Resolve to canonical symbol (case-insensitive, trimmed) + const canonicalSymbol = resolveTokenSymbol(environment, tokenCanonicalSymbol) + if (!canonicalSymbol) { + throw new CCIPError(404, `Token '${tokenCanonicalSymbol}' not found`) + } + + // Validate internalIdFormat parameter + const rawInternalIdFormat = queryParams.get("internalIdFormat") || undefined + const internalIdFormat = validateInternalIdFormat(rawInternalIdFormat) + + // Validate output key for chain representation + const outputKey = validateOutputKey(queryParams.get("outputKey") || undefined, rawInternalIdFormat) + logger.debug({ + message: "Output key and internal ID format validated", + requestId, + outputKey, + internalIdFormat, + }) + + // Initialize services + const tokenDirectoryService = new TokenDirectoryService(requestId) + const chainIdService = new ChainIdentifierService(environment, internalIdFormat as NamingConvention) + + // Resolve chain identifier to get the formatted sourceChain for metadata + const resolvedChain = chainIdService.resolve(chain) + if (!resolvedChain) { + throw new CCIPError(404, `Chain '${chain}' not found`) + } + + // Get token directory data + const result = await tokenDirectoryService.getTokenDirectory( + environment, + canonicalSymbol, + chain, + outputKey, + internalIdFormat as NamingConvention + ) + + if (!result.data) { + throw new CCIPError(404, `Token '${canonicalSymbol}' not found on chain '${chain}'`) + } + + // Format sourceChain in metadata based on internalIdFormat + const formattedSourceChain = chainIdService.format(resolvedChain.directoryKey, internalIdFormat as NamingConvention) + + logger.info({ + message: "Token directory data retrieved successfully", + requestId, + canonicalSymbol, + chain, + outboundLaneCount: Object.keys(result.data.outboundLanes).length, + inboundLaneCount: Object.keys(result.data.inboundLanes).length, + }) + + // Create token directory metadata + const metadata: TokenDirectoryMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + symbol: canonicalSymbol, + sourceChain: formattedSourceChain, + } + + const response: TokenDirectoryApiResponse = { + 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 directory 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, + requestId + ) + } + + // Handle other errors + return handleApiError(error, requestId) + } +} 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 && (